Temperatura con LM35

Ciao a tutti
Avendo a disposizione un display 1602 e un sensore di temperatura LM35 ,ho provato leggere sul display la temperatura di casa confrontandola con alcuni termometri digitali in mio possesso. Tutti i termometri rilevano la stessa temperatura con uno scarto di due decimi di grado,purtroppo il mio LM35 mi fornisce una temperatura superiore di tre gradi e tre decimi , non riesco capire. Il sensore l’ho collegato così:guardandolo dal lato piatto il pin di sinistra al +5v,il centrale al pin analogico arduino A0 il destro al GND,grazie a tutti in anticipo

/*
 Questo sketch stampa sul display LCD il valore di temperatura misurata dal sensore LM35

  The circuit:
 * LCD        pin 1   GND
 * LCD        pin 2   +5v
 * LCD        pin 3   potenziometro 10k
 * LCD RS     pin 4   pin 12 arduino
 * LCD R/W    pin 5   GND
 * LCD Enable pin 6   pin 11 arduino
 * LCD D4     pin 11  pin 5  arduino
 * LCD D5     pin 12  pin 4  arduino
 * LCD D6     pin 13  pin 3  arduino
 * LCD D7     pin 14  pin 2  arduino
 * LCD        pin 15  220 homm +5v
 * LCD        pin 16  GND
 */
int sensore     = A0;                                // sensore LM35 collegato al pin analogico A0
int sensorValue = 0;                                 // variabile per lettura sensore
float celsius   = 0;                                 // temperatura variabile
float millivolt = 0;                                 // dichiarazione di variabile tensione (float è per i numeri con la virgola)                           

#include <LiquidCrystal.h>                           // Includo il codice della libreria :

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);               // Inizializzo la libreria con i numeri dei pin dell'interfaccia

void setup() {
  lcd.begin(16, 2);                                  // Imposto il numero del display LCD di colonne e righe :
  lcd.print("TEMPERATURA");                          // visualizzo il messaggio TEMPERATURA sul display
}
void loop() {
  sensorValue=analogRead(sensore);                   // lettura valore del sensore LM35 messo sull'ingresso analogico A0
  millivolt=(sensorValue/1023.0)*5000;               //formula per ottenere la tensione di uscita dell'LM35 in millivolts
  celsius = millivolt/10;                            // valore espresso in gradi Celsius (l'out del sensore è 10mv per grado)
  lcd.setCursor(0,1);                                // Imposto il cursore sulla colonna 0  , linea 1
  lcd.print("C.");                                    // stampa sul display C.
  lcd.setCursor(2,1);                                // Imposto il cursore sulla colonna 2  , linea 1
  lcd.print(celsius);                                // stampa sul display il valore di temperatura in gradi Celsius
  delay(1000);
 }

Prima di tutto la formula che hai applicato è sbagliata per due motivi:

  1. il numero di elementi su cui dividere è 1024 e non 1023 (sono 10 bit, 0 .. 1023 sono 1024 passi)

  2. Dai per scontato che i 5V siano veramente 5V stabili, cosa che raramente è e questo influenza l'ADC della MCU

Ti consiglio, prima di tutto, per stabilizzare le letture, di fare una media (es. leggi 10 volte, sommi e, alla fine, dividi per 10), e poi di inserire una parte di "calibrazione" con cui aggiusterai il valore dato dal sensore con un tuo termometro di riferimento.

Guglielmo

Ciao a tutti grazie Guglielmo per la dritta,ho diviso per 1024 e mi sono avvicinato,per la media vedo cosa posso fare. grazie ancora. Guido

Buongiorno,

sto perfezionando il mio termostato digitale, cercando di calcolare la temperatura media per rendere più stabile la temperatura visualizzata a display. Ho implememntato il software facendo fare 5 scansioni all'ADC di Arduino, prima di mandare il risultato all'LCD, ma ancora la temperatura letta a display è piuttosto instabile (considerate che sono visibili anche i decimi), per cui ho inserito un'attesa di qualche secondo fra una lettura e l'altra. Il risultato è migliore e la temperatura è leggermente più stabile, però, al contempo, l'esecuzione del programma è ovviamente più lenta. Ritenete che ci siano soluzioni per ovviare a quest'ultimo problema? Grazie per le eventuali risposte.

Fabrizio

ciao..se per perfezionare intendi velocizzare l'esecuzione del programma....se hai usaro il delay() per ritardare le letture...la soluzione è usare millis() al posto del delay()...se intendi migliorare la stabilità...ci sono molti fattori in gioco (tolleranza del sensore, stabilità dell'alimentazione); un metodo potrebbe essere fare una ulteriore media tra il valore attualmente a display e la media ottenuta dalle tos scansioni e se diverso, o fuori da un certo range, dell'attuale valore aggiornare il display.

ORSO2001: ciao..se per perfezionare intendi velocizzare l'esecuzione del programma....se hai usaro il delay() per ritardare le letture...la soluzione è usare millis() al posto del delay()...se intendi migliorare la stabilità...ci sono molti fattori in gioco (tolleranza del sensore, stabilità dell'alimentazione); un metodo potrebbe essere fare una ulteriore media tra il valore attualmente a display e la media ottenuta dalle tos scansioni e se diverso, o fuori da un certo range, dell'attuale valore aggiornare il display.

Ciao, intendo velocizzare l'esecuzione del programma. Con attese in secondi, l'esecuzione del programma rallenta parecchio (ho usato "delay"), per cui ritengo che la soluzione di effettuare le media con il valore attuale a display, che mi hai proposto, sia la [u]migliore[/u]. Ci avevo pensato anch'io in precedenza, ma non sapevo come implementare il programma. Mi dovrò concentrare un po'... poi ti faccio sapere... Grazie per il consiglio, Fabrizio