Temperatuur uitlezen met een arduino en temperatuursensor

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Nav wat posts van mij in de kroeg:

Boudewijn in "De EL-kroeg deel 2"


Even samenvattend:
Ik heb een arduino bordje en een "phidgets" temperatuur sensor (http://www.phidgets.com/products.php?product_id=1124) op mijn waterkoeling geklooid, en ik zie netjes een indicatie van de temperatuur op mijn analoge input binnen komen (400-430 op een schaal van 0 tot 1024).
Die input klopt redelijk, want mijn DMM meet 2-2.15V op de analoge input. Die waarde daalt ook als ik een fannetje aanzet bij de sensor.

Echter krijg ik hier maar geen goed getal van.
Sensor hangt aan de +5 en de GND van de arduino, en de meetdraad hangt aan pin 3.


Echter krijg ik met de huidige code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
249
4988

249
4988

249
4988

250
5015

250
5015

250
5015

Er dit soort getallen uit (te interpreteren als voltage*100, en temp * 100).
Klopt dus geen hout van.
Sterker nog, volgens mijn meting werd het warmer toen ik de pc uitzette waar die koeling aan hangt.... (met fannetje erop en pomp aan...).

Mijn huidige (gore) code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
float tSensorValue;

int tempPin= 3;
int fanPin = 9;


void setup()
{
  Serial.begin(9600); 

  pinMode(tempPin, INPUT);
  pinMode(fanPin, OUTPUT);   //PWM
}


void loop()
{


 float tSensorValue;
  tSensorValue=(float)analogRead(tempPin);
//        printf("%f\n", tSensorValue);

  float voltage = 1024/tSensorValue; //<-- Uitkomst hiervan is volgens mij een int//
 // printf("%f\n",voltage);

  float temp = ((voltage*200)*0.2222)-61.111; //<-- Uitkomst hiervanis volgens mij ook een int//
//printf("%f\n\n",temp);

//  Serial.println((int)(100*tSensorValue));
  Serial.println((int)(100*voltage));
  Serial.println((int)(100*temp));
  Serial.println("");
  delay(1000);
  
}


Ik snap alleen niet waar het fout gaat... het lijkt alsof die waarde rond de 245-250 blijft steken,wat ik ook doe.

Kan iemand me een hops in de goede richting geven?

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Ik gok dat de referentie spanning 2.5V is en dat je altijd een waarde daar rond krijgt. Je moet weten dat de ADC 1024 geeft bij de referentie spanning, als je dan 1024/(digitale meting) doet krijg je volgens mij gewoon de referentie spanning aangezien het digitaal getal dat je inleest is Vmeting/Vref*1024. Je moet eens de uitgelezen waarde rechtstreeks afdrukken en dan de berekeningen met de hand maken, dan gaat het volgens mij beter lukken.

Een hint, het is gewoon de regel van 3.

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Nu online

Reptile209

- gers -

Heb je in de manual (in je eigen linkje) de volgende tekst gezien: [q]The formula to translate the sensor value
into Temperature is: Temperature (°C) = [(sensor value/1000) x 222.22] - 61.111. The above value of 385 translate into 24.4 °C or 75.9°F[/q]
Dit zou de juiste berekening moeten zijn, alleen kom ik dan op -5 graden (voor input van 250) of meer dan 1000 graden (voor input van 5000). Lijkt me beiden een beetje out-of-range :).

edit:
Oh, dat had je dus al gezien, inclusief de meer accurate berekening voor je eigen AD converter die verderop in dat PDF-je staat :)


Kan je de sensor niet gewoon even ijken met een beetje kokend water (100 graden) en wat ijswater (0 graden)? Helemaal mooi: maak even een ijklijntje met een gewone thermometer erbij voor de tussenliggende temps!

[ Voor 10% gewijzigd door Reptile209 op 07-01-2009 08:53 ]

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • jerbro
  • Registratie: September 2001
  • Niet online
code:
1
float voltage = 1024/tSensorValue;
De spanning bij je AD converter bereken je door
code:
1
float voltage = (tSensorValue / 1024 )*vRef

waarbij ik niet weet wat de referentiespanning is bij je AD converter.

Maar je berekening van 1024/tSensorValue klopt waarschijnlijk niet (als je AD converter 1 uitgaf en je berekening klopte zou je een spanning van 1024 V hebben, dat is erg onwaarschijnlijk )

[ Voor 9% gewijzigd door jerbro op 07-01-2009 09:44 ]


Acties:
  • 0 Henk 'm!

  • blackangel
  • Registratie: April 2002
  • Laatst online: 30-06 16:44
Je geeft aan dat de waarde tussen de 245 en 250 blijft hangen, het voltage, dus dan gaat het volgens mij gaat het fout op 1 regel:
code:
1
float voltage = 1024/tSensorValue; //<-- Uitkomst hiervan is volgens mij een int//


1. De berekening is waarschijnlijk fout, zoals kluyze al aan geeft. 0V is waarde 0, 5V is waarde 1023. Dit is een lineaire lijn, dus als je waarde x inleest (512 bijv), dan moet je deze delen door het binaire bereik (0 tot 1023=1024), en vermenigvuldigen met het spanningsbereik (0 tot 5V = 5V), en de laagste spanning bij optellen (als dat geen 0 zou zijn, stel dat het bereik 5 tot 10V is). 512/1024*5 + 0=2.5V, zoals je verwacht bij een meting in het midden. Jouw methode doet 1024/512 = 2. Lijkt niet te kloppen dan...
2. "volgens mij". Is het dan een ja of nee? Geeft de compiler er een warning op? (evt compilen met de -Wall optie)
3. Als het een int is, maak van de 1024 een 1024.0 (of (float)1024), dan is het float/float=per defintie float. Maar volgens mij is het zo dat als je int (operator) float doet, het altijd een float wordt :)

Verder,
code:
1
float temp = ((voltage*200)*0.2222)-61.111; //<-- Uitkomst hiervanis volgens mij ook een int//

Zie puntje 3, maak van 200 een 200.0 (of voltage*(float)200).

Overigens, waarom print je de tSensorValue niet? Misschien had je daar al wat mee kunnen achterhalen :)

Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Reptile209 schreef op woensdag 07 januari 2009 @ 08:50:
Heb je in de manual (in je eigen linkje) de volgende tekst gezien: [q]The formula to translate the sensor value
into Temperature is: Temperature (°C) = [(sensor value/1000) x 222.22] - 61.111. The above value of 385 translate into 24.4 °C or 75.9°F[/q]
Dit zou de juiste berekening moeten zijn, alleen kom ik dan op -5 graden (voor input van 250) of meer dan 1000 graden (voor input van 5000). Lijkt me beiden een beetje out-of-range :).

edit:
Oh, dat had je dus al gezien, inclusief de meer accurate berekening voor je eigen AD converter die verderop in dat PDF-je staat :)


Kan je de sensor niet gewoon even ijken met een beetje kokend water (100 graden) en wat ijswater (0 graden)? Helemaal mooi: maak even een ijklijntje met een gewone thermometer erbij voor de tussenliggende temps!
Hmm is een SMD dingie op een print. Lijkt me geen goed plan om die in het water te mieteren.
Iets met kortsluiting enzo.
kluyze schreef op woensdag 07 januari 2009 @ 08:41:
Ik gok dat de referentie spanning 2.5V is en dat je altijd een waarde daar rond krijgt. Je moet weten dat de ADC 1024 geeft bij de referentie spanning, als je dan 1024/(digitale meting) doet krijg je volgens mij gewoon de referentie spanning aangezien het digitaal getal dat je inleest is Vmeting/Vref*1024. Je moet eens de uitgelezen waarde rechtstreeks afdrukken en dan de berekeningen met de hand maken, dan gaat het volgens mij beter lukken.

Een hint, het is gewoon de regel van 3.
Al gedaan, zie :
Boudewijn schreef op dinsdag 06 januari 2009 @ 01:41:
Sjees.

Rekenvoorbeeld voor input = 412 (net gemeten).
Dan nemen we Vin*200. Eerst dus het voltage berekenen. Omdat ik een 10bits ADC heb, kan ik dus 1024 stapjes hebben. 1024/412 = 2.49.
Voltage is dan 2.49V dus, en dan mijn temperatuur:

((2.49*200)*0.2222)-61.111
en mijn temp lijkt dan 49.34 graden te zijn. Op zich best aannemelijk (zo voelt de radiator ook aan).
jerbro schreef op woensdag 07 januari 2009 @ 09:42:
[...]

De spanning bij je AD converter bereken je door
code:
1
float voltage = (tSensorValue / 1024 )*vRef

waarbij ik niet weet wat de referentiespanning is bij je AD converter.

Maar je berekening van 1024/tSensorValue klopt waarschijnlijk niet (als je AD converter 1 uitgaf en je berekening klopte zou je een spanning van 1024 V hebben, dat is erg onwaarschijnlijk )
Hmm hoe kom ik dan achter die referentiespanning? Ik ging er zelf vanuit dat dat 5V is.
blackangel schreef op woensdag 07 januari 2009 @ 09:43:
Je geeft aan dat de waarde tussen de 245 en 250 blijft hangen, het voltage, dus dan gaat het volgens mij gaat het fout op 1 regel:
code:
1
float voltage = 1024/tSensorValue; //<-- Uitkomst hiervan is volgens mij een int//


1. De berekening is waarschijnlijk fout, zoals kluyze al aan geeft. 0V is waarde 0, 5V is waarde 1023. Dit is een lineaire lijn, dus als je waarde x inleest (512 bijv), dan moet je deze delen door het binaire bereik (0 tot 1023=1024), en vermenigvuldigen met het spanningsbereik (0 tot 5V = 5V), en de laagste spanning bij optellen (als dat geen 0 zou zijn, stel dat het bereik 5 tot 10V is). 512/1024*5 + 0=2.5V, zoals je verwacht bij een meting in het midden. Jouw methode doet 1024/512 = 2. Lijkt niet te kloppen dan...
True, dat moet gefixed worden :X (het was gisteren laat...).
2. "volgens mij". Is het dan een ja of nee? Geeft de compiler er een warning op? (evt compilen met de -Wall optie)
Geen errors of warnings ;).
3. Als het een int is, maak van de 1024 een 1024.0 (of (float)1024), dan is het float/float=per defintie float. Maar volgens mij is het zo dat als je int (operator) float doet, het altijd een float wordt :)
Ok.
Verder,
code:
1
float temp = ((voltage*200)*0.2222)-61.111; //<-- Uitkomst hiervanis volgens mij ook een int//

Zie puntje 3, maak van 200 een 200.0 (of voltage*(float)200).

Overigens, waarom print je de tSensorValue niet? Misschien had je daar al wat mee kunnen achterhalen :)
[/quote]
Die tSensorValue printte ik ook, zie mijn reply in de kroeg.


Ik meet atm 2.023V (Fluke 117, 1.5 jaar geleden gecalibreerd bij verkoop) als input.


Die comments bij de code zijn trouwens niet van mij ;). Dat volgens mij enzo....

[ Voor 22% gewijzigd door Boudewijn op 07-01-2009 15:11 ]

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • blackangel
  • Registratie: April 2002
  • Laatst online: 30-06 16:44
Boudewijn schreef op woensdag 07 januari 2009 @ 14:50:
[...]

Hmm hoe kom ik dan achter die referentiespanning? Ik ging er zelf vanuit dat dat 5V is.
http://www.arduino.cc/playground/CourseWare/AnalogInput

Normaal gesproken wordt een bereik van 0 tot 5V gebruikt bij uC's. Al hoewel dat per uC kan varieren.
Die tSensorValue printte ik ook, zie mijn reply in de kroeg.
Maar daar post je niet zo'n uitgebreidere output log bij ;)


Overigens stond 'mijn' oplossing ook al in de kroeg: jerbro in "De EL-kroeg deel 2"

Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Okay het gaat gewoon fout doordat ik die tSensorValue als float probeer te casten, dat wordt -24036.
Op zich hoeft die variabele ook geen float te zijn omdat de hele range ervan bestaat uit integers 0<=x<1024.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
float tSensorValue;

int tempPin= 3;
int fanPin = 9;



void setup()
{
  Serial.begin(9600); 

  pinMode(tempPin, INPUT);
  pinMode(fanPin, OUTPUT);   //PWM
}


void loop()
{

//int tSensorValue;

 float tSensorValue;
  tSensorValue=(float)analogRead(tempPin);
  //tSensorValue=analogRead(tempPin);

  float voltage = tSensorValue/1024.0;
  float temp = ((voltage*200.0)*0.2222)-61.111; 
//printf("%f\n\n",temp);

  Serial.println((int)tSensorValue);
  Serial.println((int)(100*voltage));
  Serial.println((int)(temp));
  Serial.println("");
  delay(1000);
  
}


Produceert atm doodleuk : 460 40 -43.

Dit bij 2.055 volt op pin3. Voeding van de sensor gebeurt met 5.05v, dus dat klopt wel redelijk.
Het voltage zou dan dus 0.4V zijn; en dat klopt niet volgens mijn berekening.
code:
1
  float voltage = tSensorValue/1024.0;

Op zich klopt dit wel, maar het voltage klopt niet.

Als ik 1024/460 doe, kom ik echter een stuk beter uit (2.23V), maar dat klopt ook nog steeds niet.


Daar zit atm dus een probleem :p.

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • jerbro
  • Registratie: September 2001
  • Niet online
code:
1
  float voltage = tSensorValue/1024.0;
Dit moet je ook nog vermenigvuldigen met de referentiespanning, omdat tSensorValue van 0 tot 1024 loopt, en dat een spanning betekend van 0 tot (waarschijnlijk) 5V.
code:
1
float voltage = (tSensorValue / 1024 )*5

Dit levert 2 Volt op, wat wel aardig in de richting komt :)

Acties:
  • 0 Henk 'm!

  • kluyze
  • Registratie: Augustus 2004
  • Niet online
Ideaal zou zijn een Vref van 5.12V Dan is het gewoon
code:
1
float voltage = (tSensorValue / 200 )
Maar nu is het inderdaad
code:
1
float voltage = (tSensorValue / 1024.0 )*5.0
(Float waarden om er zeker van te zijn dat je een float uitkomt, ja kan het ook door te casten maar dit is mooier leesbare code vind ik.)

[ Voor 29% gewijzigd door kluyze op 07-01-2009 16:01 ]


Acties:
  • 0 Henk 'm!

  • 0fbe
  • Registratie: Januari 2004
  • Laatst online: 01-07 12:53
jerbro schreef op woensdag 07 januari 2009 @ 15:56:
[...]

Dit moet je ook nog vermenigvuldigen met de referentiespanning, omdat tSensorValue van 0 tot 1024 loopt, en dat een spanning betekend van 0 tot (waarschijnlijk) 5V.
code:
1
float voltage = (tSensorValue / 1024 )*5

Dit levert 2 Volt op, wat wel aardig in de richting komt :)
Dat lijkt me ook de enige valide oplossing in het geval van een ADC is de standaard formule namelijk:
code:
1
 spanning(V) = (gemeten waarde / max waarde) * Vref

Overigens snap ik je floating-point approach niet zo. Waarom schaal je de outputs niet op en gebruik je ints? Een AVR heeft namelijk geen floating-point core en daarom zijn floatingpoint berekeningen nogal langzaam...

bijv. dit should do:
C:
1
2
3
4
5
6
7
8
9
10
11
int readout;
int voltage;
int temperature;

void main()
{
readout = analogread();
voltage = (readout * 5000) / 1023; // voltage is in mV
temperature = (voltage * 44) - 61111; // temperature in mC
printf("Temperatuur:  %d,%d",temperature/1000,temperature%1000);
}

[ Voor 33% gewijzigd door 0fbe op 07-01-2009 16:30 ]


Acties:
  • 0 Henk 'm!

  • blackangel
  • Registratie: April 2002
  • Laatst online: 30-06 16:44
Dat komt omdat je nog moet vermenigvuldigen met 5.
waarde:0meet1023
voltage:0bereken5


meet/reken = 1023/5
meet = 1023/5 * reken
meet*5/1023 = reken

Of met 1024, maar dat verschil boeit niet omdat je toch met 0.1% rekent, de afwijking van je tempsensor is al meer :P

[ Voor 20% gewijzigd door blackangel op 07-01-2009 16:04 ]


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hij lijkt nu een stuk beter te werken ja!


Heb hem even in de hand gehouden, en het stijgt.... en naar buiten gekieperd, en dat daalt hard.


Paar dingetjes nog:


1: Ik wil een ander soort sensor nemen. Deze kan niet ondergedomped worden, en ik wilde een waterkoelings-t-stukje nemen en daar een platina probe in hangen. Die in de WC schroeven.

http://cgi.ebay.nl/ws/eBa...EWNX:IT&item=250349181404
These sensors has a resistance of 1000 ohms at 0 Celsius and 1384 ohms at 100 Celsius, 2-wire configuration, Stripped Ends Termination.
Hoe doe ik dit nou slim?

Een spanning erover aanleggen, en dan meten. Vervolgens vergelijken met dezelfde spanning die over een 1k weerstand staat, en dan het verschil met een opampje mappen op 0-5V? Quatsch.


2: Ik heb dit naast mijn pc liggen met 1 meter aan montagedraad eraan (default is 60cm). Kan dat kwaad met afwijkingen door magnetische prut? Er kan, naast de pc, nog meer rommel naast komen te staan (versterkers, scope, spectrum analyser etc).

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • naftebakje
  • Registratie: Februari 2002
  • Laatst online: 01-07 10:07
Dé standaard om variabele weerstanden op te meten is de brug van Wheatstone, wikipedia heeft een aantal verschillende schema's met uitleg hier.
Voeg nog een opamp als verschilversterker toe, en je hebt een net geconditioneerd signaal om je A/D in te sturen.

Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Thanks naftebakje, we gaan daar eens leuk over lezen.

Bedankt voor de link!

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hmm ik zit nog even te denken over the wheatstone brug, maar is het niet veel makkelijker om een voltage divider te maken en daar een opamp overheen te zetten. Bij een wheatstone brug moet je je variabele weerstand afstellen nml.

Het idee komt hiervandaan:
http://www.avrfreaks.net/...B2&file=viewtopic&t=62318

Ik zit tussen de 1000 en de 1038 ohm met de temperatuur probe.


Als ik de 5V van de AVR gebruik kan ik met een voltage divider met een fixed resistor van 1500 ohm een 0.4V spanningsverschil tussen 1000 ohm en 1038 ohm.
De voltages over de variabele weerstand zijn 2 respectievelijk 2.4V.

Hier kan ik wat mee met de arduino (evt daar nog een opamp tussen hangen die 2V aan zijn - heeft die die 0.4V 12.5 keer versterkt).


Kan dit makkelijker\slimmer?

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • j-a-s-p-e-r
  • Registratie: December 2004
  • Laatst online: 17-06 21:58
Ik heb niet je hele topic gelezen omdat ik d'r ff geen tijd voor heb, maar is een Dallas One-Wire DS18b20 of iets uit die serie niet wat voor jou? Dat is een tweedraads digitale 8bit thermometer. Die kan je met de onewire library van arduino in notime aansturen. Ik heb hem hier in een loggertje zitten, werkt perfect eigenlijk.

Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Nee, ik wil een variabele weerstand gebruiken.
1: ivm plaatsing.
2: omdat het kan :). Ik wil leren, een simpele sensor aansluiten is vrij eenvoudig (okay na wat gepruts).
3: het moet kunnen met een wheatstone brug, maar lijkt me lastiger dan mijn oplossing.

Een overig IC is leuk ,maar niet de bedoeling.

i3 + moederbord + geheugen kopen?

Pagina: 1