Calcoli per temperatura con LM35DZ

Ciao a tutti..!
Pian piano sto provando tutto quello che ho trovato dentro allo starter kit.. Oggi mi sono imbattuto in questo misuratore di temperatura.. Dopo aver smadonnato su internet per trovare come calcolare la temperatura sono arrivato a trovare (più di una volta, e persino su questo forum) questa riga di codice

temp = (5.0 * float(analogRead(A0)) * 100.0) / 1023.0);

Fin qua nessun problema, sono riuscito finalmente ad avere un risultato abbastanza coerente con le temperature normali in casa.. Il problema arriva confrontandolo col termostato del termosifone, perchè la temperatura che leggo sull'lcd è di qualche grado piu alta..
Ho provato di tutto, ma non riesco a sistemare questa cosa.. Non dico sia perfettamente uguale, ma almeno che sballi di non più di 1°C.. Finchè lo uso cosi a caso può andar bene, ma se dovessi usarla per progetti un pò più ambizioni sarebbe complicato..

Consigli..!? O sbaglio qualcosa io..!?

A parte che devi dividere per 1024.0 perché l'ADC dell'Arduino è a 10 bit (2^10=1024, ossia da 0 a 1023), devi considerare anche una minima tolleranza del sensore.
Se noti che la discrepanza fra temperatura misurata e temperatura reale è sempre uguale, puoi usare quel valore come correzione del dato letto.

Perchè 1024.0? Il sensore non arriva a massimo 1023.0?

Dovrei fare più prove per notare questa differenza..

leo72:
2^10=1024, ossia da 0 a 1023

Gli step sono 1024, non 1023.
1023 è sì il valore massimo ma tu non consideri che esiste anche lo 0 che è il primo step, mica non lo conti :wink:
Quindi da 0 a 1023 sono 1024 valori.

Aaaaaan.. Capisco..! Io facevo 1023.0, perchè ero convinto di dover dividere per il massimo che raggiungeva, non per gli step che faceva.. =(

Comunque, ora l'ho messo di fianco ad una sveglia col termometro, e lo lascio la per un pò..
È già partito con 2,5°C in più.. ma non resta fisso.. Pian piano (molto piano..) diminuisce.. Vediamo a che punto si ferma..

Sto cominciando a capire cosa mi sballa la temperatura..
Ho provato a staccare l'illuminazione dell'lcd, e ho guadagnato 1°C.. Ora su due termometri con cui ho confrontato mi son abbassato di temperatura ed è molto più giusta, la differenza si aggirava intorno al mezzo grado, o neanche..
Perchè sta roba??? :astonished:

Potrebbe essere dato dal fatto che l'lcd "cuccia" troppa corrente ad Arduino?Hai provato a mettere qualche resistenza? ti parlo da super ignorantone :slight_smile:

AleCune93:
Sto cominciando a capire cosa mi sballa la temperatura..
Ho provato a staccare l'illuminazione dell'lcd, e ho guadagnato 1°C.. Ora su due termometri con cui ho confrontato mi son abbassato di temperatura ed è molto più giusta, la differenza si aggirava intorno al mezzo grado, o neanche..
Perchè sta roba??? :astonished:

mah... già il fatto che ci stai vicino alzi la temperatura di un grado noi stessi siamo una "stufa" ambulante di 100 watt

poi ci possono essere mille disturbi,
comunque una misura della temperatura dell'aria appena attendibile dovrebbe essere effettuata a 2 metri di distanza da qualsiasi oggetto e all'ombra

Posso immaginare che la temp possa essere leggermente sbagliata per il calore che provoco toccandolo.. Ma adesso mi sto concentrando su questa differenza che viene creata dal collegamento con l'illuminazione dell'lcd.. Passi il calore del corpo, ma qua ho la corrente che mi crea uno sfasamento..!

Se hai un tester, misura la tensione tra il pin GND e il pin AREF (affianco al pin 13): dovrebbe essere 5V.
Se fosse inferiore devi correggere la formula:

temp = (VmisuratasuAref * float(analogRead(A0)) * 100.0) / 1024.0);

Non sono a casa adesso, appena arrivo verifico..

Comunque se può interessare ho misurato col tester la tensione che arriva al sensore dai pin 5v e GDN.. Più o meno si aggira sui 4.8v, e cala ai 4.6/4.7 quando collego i cavetti dell'illuminazione..

In ogni caso, se io rilevo un valore su AREF diverso da 5v, non ce un modo per rilevarla in tempo reale e cambiarla (nella variabile) al volo in base alla tensione che arriva?

No, ma puoi fare il contrario.
Fornire ad AREF una tensione stabile e impostarla come riferimento per i calcoli dell'AnalogRead.
Puoi usare anche il riferimento interno a 1.1V ma avresti una limitazione sul campo di misura della temperatura.

Intanto prova a vedere se mettendo un piccolo C da 100nF ceramico tra i pin Vin e Gnd dell'LM35 migliori la situazione. Ti dovrebbe però aiutare solo per gli sbalzi all'accensione del display. Ma se la tensione resta bassa fintanto che è accesa la retroilluminazione secondo me risolvi usando un'alimentazione a 5V stabili separata per il sensore. La retroilluminazione di un display LCD può succhiare diverse decine di mA, anche un centinaio, e gli sbalzi di tensione influenzano la lettura del sensore. Tempo fa anch'io notai lo stesso problema con un sensore simile al tuo ed un piccolo display Nokia3310.

Allora.. Ho provato la tensione sul pin AREF.. esce 4.88v senza illuminazione, con illuminazione invece scende ai 4.73v..
Potrei portarla a 1.1v, ma oltre alla limitazione cosa mi cambierebbe? Avrei maggiore stabilità? O i cali ci saranno comunque?

X leo: vedo se ne ho qualcuno in giro, anche se la vedo dura..

EDIT: infatti non ne ho.. =(
Comunque, ho misurato la tensione in uscita dal sensore.. sia con l'illuminazione che senza lui fa uscire sempre 0.25v.. Perchè poi arduino me lo legge diversamente se la tensione in uscita è sempre la stessa???

Perché cambia la tensione di riferimento, che normalmente è quella presente su VCC.
Puoi provare col consiglio di Paolo, inserendo nel pin AREF una tensione a 5V stabili, settando la tensione di riferimento su EXTERNAL con analogReference e poi leggendo il sensore.
Ricordati le masse in comune fra l'Arduino e l'alimentatore esterno.

Attualmente non ho niente da 5v da dargli al pin AREF.. In ogni caso ho settato l'analogReference ad INTERNAL, ed ovviamente dal punto AREF mi escono 1.1v.. Ho modificato la formula in modo che mi calcoli la temperatura basandosi sugli 1.1, misurando il punto AREF resta stabile sia che metto, sia che tolgo l'illuminazione all'lcd.. Ma la temperatura cambia lo stesso..

Mi sa che non ho capito bene come funziona sta analogReference :astonished:

Se imposti l'ADC per usare la tensione a 1,1V devi anche adattare la tensione in ingresso sui pin analogici affinché vari da 0 a 1,1V altrimenti non c'è proporzione fra il valore letto ed il riferimento.
Solo che perdi in range, come ti aveva detto anche Paolo.

leo72:
Se imposti l'ADC per usare la tensione a 1,1V devi anche adattare la tensione in ingresso sui pin analogici affinché vari da 0 a 1,1V altrimenti non c'è proporzione fra il valore letto ed il riferimento.
Solo che perdi in range, come ti aveva detto anche Paolo.

Ehm.. e come faccio ad adattarla sui pin..!? È una cosa software o hardware???

Comunque (se non sto sparando una cavolata) in uscita dal sensore leggo più o meno 0.2v stando a 20°C.. Anche se lo riduco a 1.1v penso di stare nel range che mi serve.. Se misuro delle temperature penso che mi servono al massimo tra i 10 e i 40°C..

LM35 se non sbaglio varia da 0 a 150°C ogni 10mv, quindi al massimo misuri 110°
Per la temperatura ambiente è sufficiente, ma non puoi andare sotto zero per le temperature invernali in nord italia.
Per adattare la tensione potresti usare un partitore resistivo, ma non hai questa necessità.

Controlla la tensione in entrata all'LM ed in uscita, dovrebbe rimanere stabile anche accendendo o spegnendo il display.

In uscita resta stabile, in entrata varia..