blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi Heren
Ik heb bijna geen ervaring met het programmeren van b.v. een Arduino,
daarom wil ik gebruik maken van jullie kennisbank. 
Als eerste een plaatje van wat ik hier reeds heb liggen.
Dit wil ik bereiken...
Ik wil starten met b.v. Arduino om wat meetinstrumenten die ik bouw, aantrekelijker te maken en nuttige info weer te geven.
Als uitgangspunt wil ik een van mijn spannings referenties met een Nokia display
gaan uitvoeren en daar info over de spanningsreferentie op weer te geven.
Ik kies voor het Nokia display omdat het klein is en ik niet zoveel ruimte heb.
Maar tips zijn welkom.
Ik wil graag het volgende doen met de Arduino
4x Temperatuur sensor met de DS18B20 in hoge resolutie.
1x Luchtvochtigheid sensor met een DHT22, kan ook als een van de temperatuur sensoren dienen.
1x Luchtdruk sensor.
4x Spannings meting zoals status van de back-up accu, kortsluiting van de 10V en 5V uitgang enz.
2x digital uit. (ondermeer zoemer sturing bijna lege accu)
2x digital in. (uitlezen drukknopjes)
Wat ik begrepen heb, kan je de DS18B20 parallel zetten, dit scheelt aansluitingen.
Waar ik nu nog geen kennis over heb is dit, hoe krachtig moet de Aurduino zijn om dit "redelijk" uit te voeren.
Ik haat het als ik op een knopje druk en krijg niet direct feedback dat ik een knopje heb ingedrukt, dit omdat de processor nog in een meetlusje zit.
Een tweede punt is dat ik dit met een zo laag mogelijk verbruik wil uitvoeren en ik weet dat dit in tegenspraak kan zijn met het hierbovenstaande. 
De processor wordt ook uit de accu gevoed als er geen netspanning aanwezig is en dit mag een niet te grote belasting zijn.
Dus graag zinnige adviezen hoe ik dit kan gaan aanpakken, moet het met een andere Arduino, dan is dat geen probleem.
Begin niet over zaken dat ik in, "die of die" taal moet gaan programmeren, daar is hier geen tijd voor om dit te leren 
Als ik er wat geld tegenaan moet gooien om een dikkere Arduino te kopen die mijn "programmeerwerk"
snel genoeg houd dan doe ik dat, assembler komt er hier niet is *grin*
Dus alle info en hulp is welkom, mijn dank alvast.
Gegroet,
Blackdog
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Vergeet die chinese klonen (DHT11 & 22) van de SHT-11.
Die chinese klonen heb ik ook gehad, liggen inmiddels in de vuilbak. Er zit namelijk alleen maar een simpel printplaatje met baantjes in als sensor, soort van "opgewaardeerde" watersensor.
SHT-21 + code: http://moderndevice.com/product/sht21-humidity-and-temp-sensor/
Ik zou hier mee beginnen: "A simple example of interfacing with the 84 x 48 pixel Nokia 3310 LCD"
http://playground.arduino.cc/Code/PCD8544
Analog Read Voltage:
http://arduino.cc/en/Tutorial/ReadAnalogVoltage
Voor de luchtdruk sensor => BMP180
https://learn.sparkfun.com/tutorials/bmp180-barometric-pressure-sensor…
Een tweede punt is dat ik dit met een zo laag mogelijk verbruik wil uitvoeren
http://playground.arduino.cc/Learning/ArduinoSleepCode
Ik haat het als ik op een knopje druk en krijg niet direct feedback dat ik een knopje heb ingedrukt, dit omdat de processor nog in een meetlusje zit.
http://www.dave-auld.net/?option=com_content&view=article&id=1…
rbeckers
Overleden
In mijn powermeter zit een Arduino Uno. Die leest analoog U,I en P.
S en de rest worden berekend. Resultaten naar 2x16 LCD en USB of RS-232. Software is voor 95% af.
Kan allemaal, en er zijn 101 manieren om dit te bereiken met een Arduino.
Voor veel van de sensoren die jij noemt zijn goede libraries te vinden, wat lastig kan worden is ze allemaal in dezelfde code te gebruiken, voorbeeld is de DHT22, dit is erg kritisch qua timing, een paar interrupts er tussen door je bent van het padje met de gelezen waardes. Hier zit ook de valkuil met mixen van libraries, het is lastig te doorzien wat ze precies doen met timers en interrupts. Er is ook geen bewaking dat de ene library de settings van een andere overruled. En dan zoek je je echt een breuk. En je gebruikte geheugen loopt snel op omdat er in elke library overhead zit.
Mijn tip is om het in modules op te bouwen, display aansturing als eerste.
Dan voor elke sensor aparte code maken en testen met bijv. de serieele poort of er zinnige data uitkomt. Dan samen voegen in een code.
Je kunt kijken of je zoveel mogelijk sensoren kunt vinden die met I2C werken, dat scheelt uiteindelijk veel overhead.
Succes !
[Bericht gewijzigd door Rolo op (21%)]
He, een uP, daar kunnen we eens een beetje meespelen 
Zijn de ad converters geschikt voor jouw doel ? Gezien de metingen die jij uitvoert, loop je natuurlijk tegen de 10bits beperking aan (5v/1024=0,02 v), is dit voldoende voor bruikbaar resultaat?
En ik weet :geen discussie over de taal, maar.... Ik zou bascom eens inkijken, lage drempel,begrijpelijke syntax... Beetje assistentie beschikbaar 
Mijn simpelste om de ad's te lezen en weer te geven op een 16x2 lcd en een com poort:
'--------------------------------------------------------------
' mega8.bas
' mega8 sample file
'--------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 1000000
'the internal oscillator of 8 Mhz was choosen in the fusebits
$baud = 1200
Dim X As Byte , S As Word
Dim M(8) As Word
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16x2
Print "hello mega8 "
Lcd "* hello mega8 *"
Waitms 1000
'Loop Until Inkey() = 27
Cls
Lcd "C1C2C3C4C5C6C7C8";
Config Adc = Single , Prescaler = Auto
Start Adc
Do
'Cls
Locate 2 , 1
For X = 0 To 7
S = Getadc(x)
Select Case S
Case Is < M(x)
Lcd "up";
Case Is = M(x)
Lcd "==";
Case Is < M(x)
Lcd "dn";
End Select
M(x) = S
Print "ch" ; X ; "-" ; S
Waitms 100
Next X
LoopEn d .hex : http://richvermeer.nl/projects/ADinWithLcdAndCom.hex
[Bericht gewijzigd door richardvelsen op (58%)]
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
Rolo heeft gelijk, aan een kant zijn al die libs handig, je hebt snel iets werkend, aan de andere kant kan het snel een zooitje worden.
Standariseren op I2C is geen slecht idee, ipv de DS18B20 kun je ook de LM92 (I2C) gebruiken, de BMP180 is ook I2C. En eventueel een 12bits I2C A/D als de 10 bits niet genoeg zijn. Nokia display gebruikt SPI, lijkt me ook geen issue.
Blijft alleen de SHT22 over als vreemde eend in de bijt.
[Bericht gewijzigd door Roland van Leusden op (20%)]
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi Heren,
Mijn dank alvast voor de info!
Hebben jullie een voorstel voor sensoren waarvan jullie weten dat dit goed samenwerkt op i2c?
richardvelsen
Wat ik wil meten zijn algemene gegevens en wat testen van de toestand van de accus en signaal geven bij accu ontlading.
Het is niet de bedoeling de luchtdruk te meten in millibar of hoger in resolutie.
Dan ga ik al snel meten, of de buren een deur open of dicht doen, of een muis een scheet laat,
dat is niet echt zinnig voor mijn spannings referentie 
Dit wil ik meten.
Temp "buiten" het kastje van de spannings referentie.
Temp "in" het kastje van de spannings referentie.
Temp "in" de oven.
De accu spanning, dit 2x, er komen twee cellen in serie.
Detectie van kortsluiting van de 10V referentie.
De rest moet nog "vorm" krijgen in mijn hoofd.
Gegroet,
Blackdog
rbeckers
Overleden
De 10 bits ADC is voldoende. Of de temp sensors op I2C of een analoge multiplexer.
Bij keuze sensor of I2C of een spanning uitgang kiezen.
Ik gebruik al jaren de lm76 temp sensor in verschillende ontwerpen.
Werken feilloos met i2c.
http://www.ti.com/lit/gpn/lm76&ved=0CC4QFjAA&usg=AFQjCNGWGniVs….
Kijk ook eens na de ina219 serie van TI, stroom/voltage monitor met i2c.
Allemaal op een i2c bus.
Nog een tip, de BMP180 is een 3V device en niet 5V tolerant, dus je hebt een een levelshifter nodig als je mixed 5V en 3V devices op een I2C bus zet (voor paar cent te koop trouwens in het verre China, ik heb er al eens mee getest en werkt). En deze http://moderndevice.com/product/sht21-humidity-and-temp-sensor/ is ook al I2C lees ik. (Linkje stond al in de post van Roland van Leusden).
Dus dan heb je luchtdruk, temp en vochtigheid al op I2C, display kan op SPI, analoog op de analoge ingangen. (I2C kost je wel twee analoge ingangen, A4 en A5) dat werkt allemaal goed samen met op een Arduino.
[Edit] Zie nu dat die SHT21 $39.37 kost, dat is niet echt goedkoop, mischien hier nog iets anders voor zoeken.
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
De SHT-21 kan een stuk goedkoper.
US $9.78 eBay item number:121460343202 incl. level shifter.
Blijf in ieder geval weg van die DT / AM modules, goedkoop en zooi.
Pertinax
Mijn thuis is waar mijn Weller staat
Voor luchtdruk kan je ook de MS5611 gebruiken, is duurder dan de BMP maar nauwkeuriger.
Hier bvb. kun je die kopen incusiel level-shifter.
OT @Rolo: Het valt mij op dat veel Arduino gebruikers voorbijgaan aan het respecteren aan 3.3V/5V logica, en de boel zomaar aansluiten.
Overigens kan je de Arduino (Pro Mini) ook op 3.3V voeden, ben je van die problemen af.
rbeckers
Overleden
2 stuks Analog Devices analoge multiplexer met parallelle aansturing, 4 ingangen. Voor de temparatuur NTC's of LM335. Capacitieve vochtsensor en drukmeter.
Dit als tegenhanger van de I2c oplossingen. 
Jochem
If you want to succeed, double your failure rate.
Op 16 november 2014 19:31:30 schreef Rolo:
Nog een tip, de BMP180 is een 3V device en niet 5V tolerant, dus je hebt een een levelshifter nodig als je mixed 5V en 3V devices op een I2C bus zet
???
I2C stuur je toch open-collector? Dan hang je je pullup toch gewoon aan de 3.3V? De 5V devices zien dan gewoon 3.3V als hoog, want dat valt prima binnen de IHmin specs. En de 3.3V devices hebben geen last van de 5V.
Dus levelconvertors... heb je niet nodig?
EricP
mét CE
Wat ik begrepen heb, kan je de DS18B20 parallel zetten, dit scheelt aansluitingen.
Ja, dat klopt. Nadeel is dat je die Arduino op de een of andere manier duidelijk moet gaan maken welke sensor voor welke temperatuur is. Als je vooraf de IDs leest en in de code douwt, dan kan dat. Anders zul je een soort van config moeten gaan maken die een bus-discovery doet, daaruit de IDs haalt en dan moet jij gaan vertellen welke sensor waaraan hangt. En zo zijn er nog wel wat smaken, al dan niet gebruik makend van randvoorwaarden. Houd er verder rekening mee dat die sensoren een stiff-pull-up nodig hebben als ze parasitair gevoed worden.
Waar ik nu nog geen kennis over heb is dit, hoe krachtig moet de Aurduino zijn om dit "redelijk" uit te voeren.
Ik haat het als ik op een knopje druk en krijg niet direct feedback dat ik een knopje heb ingedrukt, dit omdat de processor nog in een meetlusje zit.
Als je meetlusjes blocking zijn, dan heb je iets verkeerd gedaan
De hardware kan interrupt-driven werken. Of de Arduino libs dat ook kunnen, weet ik niet. Maar daar zit wel de sleutel naar snelle resonses - 1-Wire gaat nou eenmaal niet harder dan gespecificeerd en hoe dik de controller ook wordt, sneller gaat het niet worden. Als die controller daar op staat te wachten, tsja...
Een tweede punt is dat ik dit met een zo laag mogelijk verbruik wil uitvoeren en ik weet dat dit in tegenspraak kan zijn met het hierbovenstaande.
Dat hoeft niet. Als je het knap kunt programmeren, dan kan je controller de meeste tijd in sleep staan. Zo kun je bijvoorbeeld op al je temp. sensoren een conversie starten, de ADC een schop geven en zelf lekker gaan slapen. De ADC maakt je wel een keer wakker (of een pin-change-interrupt) en dan pak je die 1-Wire bus ook meteen ff mee. Als dat te traag is, laat je nog een timer meelopen die je ook zo nu en dan ff wakker maakt.
De processor wordt ook uit de accu gevoed als er geen netspanning aanwezig is en dit mag een niet te grote belasting zijn.
Ik denk dat de spanningsregelaar en je peripherals de grootste gebruikers zijn 
Dus graag zinnige adviezen hoe ik dit kan gaan aanpakken, moet het met een andere Arduino, dan is dat geen probleem.
Begin niet over zaken dat ik in, "die of die" taal moet gaan programmeren, daar is hier geen tijd voor om dit te leren
Ja, nou... dat Arduino taaltje is wat vaaaag. Verder hang je aan libraries door 'derden'. Als dat laten we zeggen 'onhandig' in elkaar zit, dan kun je er nog zo'n dikke Arduino (of AVR) tegen aan gooien, maar sneller gaat het niet worden (zie boven). De code die ik tot op heden gezien heb, maakte me niet zo heel enthousiast, maar je kunt natuurlijk gewoon mazzel hebben.
I2C kan prima werken, als het 'lokaal' is. 1-Wire doet het ook over wat grotere afstanden. Ik denk niet dat je met het aantal sensortjes klem gaat lopen op je bus qua snelheid. Ik heb zelf wel eens wat met de tmp101 gespeeld. Meer omdat die er toevallig was. Er is zat te krijgen. Kijk wat jouw specificaties haalt. Doorgaans werkt het wel samen. De meeste devices zijn ook wel 'slim' in de zin van dat je als zij druk zijn lekker andere dingen op de bus kunt gaan doen en daarna eens komt vragen of ze al klaar zijn.
Houd er wel rekening mee dat niet elke lib dit kan - ik heb wel eens een DAC gehad met een lib, die precies 2 van die DACs op de bus tolereerde... Daar heb je dus niks aan.
Al met al valt het succes met de kwaliteit van je libraries. Als ik lees wat je wilt, dan durf ik dat qua performance met de kleinste AVR die voldoende I/O / memory heeft zo aan.
Succes met je eerste schreden op dit pad!
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
De hardware kan interrupt-driven werken. Of de Arduino libs dat ook kunnen, weet ik niet.
Als je het knap kunt programmeren, dan kan je controller de meeste tijd in sleep staan.
Beide kunnen, zijn Arduino libs voor, zie mijn post.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Ik zal weer even reageren als topicstarter, 
Ik weet natuurlijk dat er zeer veel zaken meespelen zoals hier al is aangegeven betreffende de 3,3 en 5V spanningen die gebruikt moeten gaan worden.
Maar ik moet het wel allemaal kunnen, nee ik ben niet onzeker, ik nijg nu naar de oplossing die rbeckers ook al aangaf en wat mijn eerste gedachten ook waren, analoog oplossen voor de meeste zaken.
Dus Temp sensors analoog uitvoeren.
Accu spanningen zijn al analoog
Accu stroom is ook analoog
Dan houd ik de Humidity en Luchtdruk sensor over, die dan via 12c zullen communiceren.
De ATmega328P Nano die ik heb, heeft volgens mij voldoende analoge inputs voor mijn doel.
En als i2c er maar twee van die analoge ingangen nodig heeft heb ik er nog 6 over?
Van de week eerst maar weer eens beginnen met een knipper LED 
Zal vandaag de IDE in ieder geval even updaten.
Dank voor de opmerkingen
Gegroet,
Blackdog
rbeckers
Overleden
Rel. vocht en waarschijnlijk luchtdruk kunnen ook analoog.
Zeker gezien de eisen maakt dat I2c of analoog beide voldoen.
M.b.v. multiplexing kunnen er ook gemakkelijk analoge ingangen bij komen.
Ook een laag vermogen is geen probleem.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Hi Heren,
Update...
De LED knipper, de schakelaar werkt, ik lees nu de analoge spanning uit via een terminal en help de code omzeep met mijn prutswerk *grin*
Gegroet,
Blackdog
Roland van Leusden
It's the rule that you live by and die for It's the one thing you can't deny Even though you don't know what the price is. It is justified.
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
OK Heren,
Dan een simpel vraag...
Hiet het stukje code waar ik mee aan het sleutelen ben.
-----------------------------------
/*
AnalogReadSerial
Reads an analog input on pin 0, prints the result to the serial monitor.
Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
This example code is in the public domain.
*/
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// print out the value you read:
Serial.println(sensorValue*0.512); <= Brams Prutswerk...
delay(500); // delay in between reads for stability
}
-----------------------------------
Ik probeer de waarde in Volts weer te geven met en comma, dus de analoge ingang ziet een spanning van b.v. 3,35V.
Het *0.312 is een van mijn probeersels, hoe doe je dit goed?
Gegroet,
Blackdog
rbeckers
Overleden
Zo ongeveer:
void VoltMeet() // idem StroomMeet maar nu voor spanning
{
int sensorValue0 = analogRead(A0); // read the input on analog pin 0:
float spanning = sensorValue0 / 3.3; // Convert the analog reading (which goes from 0 - 1023 to a voltage 0 - 250V):
Serial.print(spanning);
delay(1);
Serial.print("V ");
delay(1);
delay(2);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
printFloat(spanning,0,0,0); // print spanning als float in routine printFloat,volt, 6=digits, 1=regel, 3=positie
lcd.setCursor(4,0);
lcd.print("V");
delay(2);
}
blackdog
Golden Member
Daar de mens het noodzakelijke niet kan volbrengen, streeft hij naar het overbodige (Goethe)
Ha die René,
Ik begrijp je berekening niet...
spanning = sensorValue0 / 3.3;
Kan je dit mij uitleggen?
Gegroet,
Blackdog