letture errate sensore lm35dz

ciao ragazzi,
stavo lavorando con gli analog input del mio arduino e provando a misurare la temperatura ambiente con un lm35dz ho riscontrato il problema che misura valori tendenti ai 490 gradi mi chiedevo se qualcuno sa indicarmi la formula per convertire il valore letto da arduino in un valore di temperatura espressa in gradi centigradi..
girando in rete ho trovato : 5.0 * analogRead(inPin) * 10.0) / 1024.0...
è corretta la formula e considero diffettoso il sensore oppure potrei avere altro?dubito in quanto il codice è talmente breve che ci possa essere possibilità di errore..
grazie a chi risponde

Di norma quando si chiedono conferme su dati errati da un hardware esterno, si pubblica oltre che lo sketch anche lo schemino o un link che riporti quello usato. Il fatto che il codice sia breve non è esente da errori.
Se hai usato un codice corretto e uno schema di connessione corretto, il sensore è da cestinare.
Questo solo tu lo sai :slight_smile:

pablos:
Di norma quando si chiedono conferme su dati errati da un hardware esterno, si pubblica oltre che lo sketch anche lo schemino o un link che riporti quello usato. Il fatto che il codice sia breve non è esente da errori.
Se hai usato un codice corretto e uno schema di connessione corretto, il sensore è da cestinare.
Questo solo tu lo sai :slight_smile:

ho provato con più codici e mi riporta sempre gli stessi valori..il più semplice usato è stato questo

01	int inPin = 2; // Pin di lettura
int temp = 0; // variabile temperatura
	 
	void setup()  {
	 Serial.begin(9600); // Avvia seriale a 9600 baud
	}
	 
	void loop() {	 temp = ( 5.0 * analogRead(inPin) * 100.0) / 1024.0; // Conversione voltaggio sensore in temperatura
	 Serial.println(temp); // invio temperatura via serial monitor (accendere serial monitor per vedere val)
	 delay(1000); // delay tra una lettura e l'altra
	}

per il collegamento su breadboard mi sono limitato a collegare il sensore al pin a2 e gnd e v+ alle uscite gnd e 5v

Prova a modificare il codice così:

int inPin = A2; // Pin di lettura
float temp = 0; // variabile temperatura
	 
void setup()  {
 Serial.begin(9600); // Avvia seriale a 9600 baud
}
	 
void loop() {
 temp = ( 5.0 * analogRead(inPin) / 1024.0) * 100.0; // Conversione voltaggio sensore in temperatura
 Serial.println(temp); // invio temperatura via serial monitor (accendere serial monitor per vedere val)
 delay(1000); // delay tra una lettura e l'altra
}

Usa float temp.

la formula è giusta, lo schema è questo http://www.tributemercury.com/wp/arduino-e-sensori-lm35-tmp36.html , non c'è molto altro da poterti dire se non fare misure a vuoto nel setup e fare la media di qualche valore prima di prenderlo in esame, questo serve solo per avere maggiori precisioni, ma non risolve il tuo dubbio, prova con un altro sensore

ciao

Che stai dicendo Paolo, i pin analog vanno da A0 ad A5 nel tuo disegno, lui lo può mettere dove gli pare sulle porte analog, su A2 perchè non dovrebbe andare?

posso benissimo scrivere analogRead(2) è inteso che si tratta dell' A2

pablos:
Che stai dicendo Paolo, i pin analog vanno da A0 ad A5 nel tuo disegno, lui lo può mettere dove gli pare sulle porte analog su A2 perchè non dovrebbe andare?

Leggendo di fretta mi era parso di capire che l'avesse collegato al pin 2 e non al pin A2.
Ho corretto.

PaoloP:
Prova a modificare il codice così:

int inPin = A0; // Pin di lettura

float temp = 0; // variabile temperatura

void setup()  {
 Serial.begin(9600); // Avvia seriale a 9600 baud
}
 
void loop() {	 temp = ( 5.0 * analogRead(inPin) * 100.0) / 1024.0; // Conversione voltaggio sensore in temperatura
 Serial.println(temp); // invio temperatura via serial monitor (accendere serial monitor per vedere val)
 delay(1000); // delay tra una lettura e l'altra
}



![](http://www.tributemercury.com/wp/wp-content/uploads/2012/01/fetch1.gif)

Usa float temp.

abbi pazienza ma sarà l'orario..oltre ad aver sostituito 2 con A0 cosa ci sarebbe di diverso?

PaoloP:
Leggendo di fretta mi era parso di capire che l'avesse collegato al pin 2 e non al pin A2.

Per un istante ho pensato anch'io che lo avesse messo sul pin digital 2, ma scrivendo analogread non c'e' errore :smiley:

PaoloP:

pablos:
Che stai dicendo Paolo, i pin analog vanno da A0 ad A5 nel tuo disegno, lui lo può mettere dove gli pare sulle porte analog su A2 perchè non dovrebbe andare?

Leggendo di fretta mi era parso di capire che l'avesse collegato al pin 2 e non al pin A2.
Ho corretto.

non so di preciso cosa sia accaduto ma ora funziona nella norma e rileva un temperatura verosimile a quella della mia stanza...senza nessuna modifica..misteri dell'elettronica...

Se stai usando lo sketch che ho postato, io ho modificato il tipo della variabile temp da int a float.

PaoloP:
Se stai usando lo sketch che ho postato, io ho modificato il tipo della variabile temp da int a float.

non avevo notato il float :smiley: comunque facendo la modifica nessuna variazione eccezion fatta per la presenza di due cifre decimali e una lettura dei valori meno monotona non segna fisso 20 gradi ma oscilla tra i 20 e i 21.50

Ho una scheda cablata di pulsanti, led, display, 4 lm35, relays, tsop, ho caricato lo schetch originale di mattwolf, mi indica 23° ...è giusto, deve solo vedere la parte hardware che sia corretta o che non sia guasta

Allora dovrebbe provare a rimettere il sensore sul A2.

pablos:
Ho una scheda cablata di pulsanti, led, display, 4 lm35, relays, tsop, ho caricato lo schetch originale di mattwolf, mi indica 23,85° ...è giusto, deve solo vedere la parte hardware che sia corretta o che non sia guasta

evidentemente è il mio sensore che da i numeri in tutti i sensi...poco male..ne comprerò un altro per essere sicuro e poi proseguo nell'ampliare questo segmento di progetto..un grazie a tutti!

Salve ragazzi,
anche io ho lo stesso problema di lettura errata!

Ho fatto un test con due tutorial diversi ed ho risultati totalmente diversi!

-TUTORIAL UNO-

Schema Fritzing

Codice usato

/*
 An open-source LM35DZ Temperature Sensor for Arduino. This project will be enhanced on a regular basis
 (cc) by Walter Esposito , http://www.arduinoproject.it
 http://creativecommons.org/license/cc-gpl
 */

float tempC;      //dichiarazione di variabile
int tempPin = A0;  //inizializzazione del pin di Arduino

void setup()
{
Serial.begin(9600); //apertura porta seriale, set della velocità a 9600 bps
}

void loop()
{
tempC = analogRead(tempPin);           //lettura valore del sensore
tempC = (5.0 * tempC * 100.0)/1024.0;  //conversione del dato analogico in temperatura
Serial.println(tempC);             //invia i dati alla seriale
Serial.print(" Celsius, ");

delay(1000);                           //aspetta 1 secondo prima di ripetere
}

Uscita seriale

Celsius, 0.00
Celsius, 499.51
Celsius, 499.51
Celsius, 499.51
Celsius, 0.00
Celsius, 0.00
Celsius, 0.00
Celsius, 0.00
Celsius, 0.00
Celsius, 371.09
Celsius, 499.51
Celsius, 499.51
Celsius, 193.36
Celsius, 0.00
Celsius, 0.00
Celsius, 0.00
Celsius, 0.00
Celsius, 380.86
Celsius, 499.51
Celsius, 499.51

A questo punto penso che il mio sensore non funzioni correttamente.
Provo quindi un altro tutorial

-TUTORIAL DUE-

Schema Fritzing

Codice usato

//TMP36 Pin Variables
int sensorPin = A0; //the analog pin the TMP36's Vout (sense) pin is connected to
                        //the resolution is 10 mV / degree centigrade with a
                        //500 mV offset to allow for negative temperatures
 
/*
 * setup() - this function runs once when you turn your Arduino on
 * We initialize the serial connection with the computer
 */
void setup()
{
  Serial.begin(9600);  //Start the serial connection with the computer
                       //to view the result open the serial monitor 
}
 
void loop()                     // run over and over again
{
 //getting the voltage reading from the temperature sensor
 int reading = analogRead(sensorPin);  
 
 // converting that reading to voltage, for 3.3v arduino use 3.3
 float voltage = reading * 5.0;
 voltage /= 1024.0; 
 
 // print out the voltage
 Serial.print(voltage); Serial.println(" volts");
 
 // now print out the temperature
 float temperatureC = (voltage - 0.5) * 100 ;  //converting from 10 mv per degree wit 500 mV offset
                                               //to degrees ((volatge - 500mV) times 100)
 Serial.print(temperatureC); Serial.println(" degrees C");
 
 // now convert to Fahrenheight
 float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
 Serial.print(temperatureF); Serial.println(" degrees F");
 
 delay(1000);                                     //waiting a second
}

Uscita seriale

0.15 volts
-35.35 degrees C
-31.63 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F
0.14 volts
-35.84 degrees C
-32.51 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F
0.14 volts
-35.84 degrees C
-32.51 degrees F
0.14 volts
-35.84 degrees C
-32.51 degrees F
0.14 volts
-35.84 degrees C
-32.51 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F
0.15 volts
-35.35 degrees C
-31.63 degrees F

Qua le cose sembrano andare meglio dal punto di vista della stabilità delle letture ma sono sempre errate perché sono tutte negative, forse perché ho un voltaggio di riferimento errato poichè reputo che nella mia stanza ci siano 15/17 gradi!

Per tutti e due i tutorial ho usato la mia Arduino UNO rev.3 con sensore di temperatura LM35DZ.
Potete aiutarmi a capire dove sta l'errore?
Grazie!

Prova con questo codice e dicci i risultati che visualizzi nel serial monitor

#define tempPin A0 //inizializzazione del pin di Arduino

int lettura = 0; // impostazione valore iniziale della variabile
int media = 30; //n° letture per calcolo media

void setup()
{
  Serial.begin(9600); //apertura porta seriale, set della velocità a 9600 bps
  // analogReference(INTERNAL); //setta il riferimento interno a 1,1V
}

void loop()
{
  lettura = 0; //azzera il totalizzatore
  for (int i = 0; i < media; i++) {
    lettura += analogRead(tempPin); //totalizza tutti i valori letti dall’ADC
  }
  lettura = lettura / media; //calcolo del valore medio di lettura
  Serial.print(lettura); //lettura valore ADC
 Serial.print(" --> ");
 Serial.println((float)((500*lettura)/1023.0));
 delay(1000); //pausa
}
30 --> 14.66
31 --> 15.15
31 --> 15.15
31 --> 15.15
31 --> 15.15
30 --> 14.66
31 --> 15.15
31 --> 15.15
31 --> 15.15
30 --> 14.66
31 --> 15.15
30 --> 14.66
30 --> 14.66
31 --> 15.15
31 --> 15.15
30 --> 14.66
30 --> 14.66
31 --> 15.15
31 --> 15.15
31 --> 15.15
30 --> 14.66
30 --> 14.66
31 --> 15.15
31 --> 15.15
31 --> 15.15
31 --> 15.15
30 --> 14.66
30 --> 14.66
31 --> 15.15
31 --> 15.15
31 --> 15.15
31 --> 15.15
30 --> 14.66

Direi perfetto! Dove sta l'inghippo?

Credo ci sia un errore nella formula dei 2 sketch precedenti.
Ma al momento no ho molta voglia di spulciarli. :disappointed_relieved:

Grazie tante @PaoloP, vedo di spremere le meningi e capirlo da me!
Ho notato un'altra stranezza posizionando un ventilatore ad aria calda vicino al sensore.
All'aumento della temperatura, sopra i 30.77° la temperatura passa in negativo e dimiusce, spegnendo il ventilatore la temperatura negativa aumenta e ritorna positiva nuovamente intorno ai 30.77°!

60 --> 29.33
59 --> 28.84
58 --> 28.35
57 --> 27.86
56 --> 27.37
55 --> 26.88
55 --> 26.88
54 --> 26.39
55 --> 26.88
57 --> 27.86
60 --> 29.33
62 --> 30.30
64 --> 31.28
67 --> -31.32
69 --> -30.34
71 --> -29.36
73 --> -28.38
74 --> -27.89
76 --> -26.92
77 --> -26.43
79 --> -25.45
80 --> -24.96
81 --> -24.47
82 --> -23.98
83 --> -23.50
84 --> -23.01
85 --> -22.52
86 --> -22.03
87 --> -21.54
88 --> -21.05
88 --> -21.05
89 --> -20.56
90 --> -20.07
90 --> -20.07
90 --> -20.07
91 --> -19.59
91 --> -19.59
92 --> -19.10
92 --> -19.10
93 --> -18.61
93 --> -18.61
94 --> -18.12
94 --> -18.12
94 --> -18.12
94 --> -18.12
92 --> -19.10
90 --> -20.07
87 --> -21.54
85 --> -22.52
83 --> -23.50
81 --> -24.47
79 --> -25.45
78 --> -25.94
76 --> -26.92
75 --> -27.41
73 --> -28.38
72 --> -28.87
70 --> -29.85
70 --> -29.85
68 --> -30.83
68 --> -30.83
67 --> -31.32
66 --> -31.80
66 --> -31.80
65 --> 31.77
64 --> 31.28
64 --> 31.28
63 --> 30.79