Problema con sensore tmp36GZ

Salve a tutti,
Mi è venuto in mente di creare una piccola serra per far crescere dei peperoncini. Prima di tutto ho voluto fare il codice per gestire la temperatura, per fare ciò utilizzero un sensore tmp36GZ, che mi è stato fornito con lo starter kit di arduino. Ma la temperatura mi risulta troppo alta (70 gradi), di seguito vi posto il codice:

#define sensore A0

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

}

void loop() {
  float val = analogRead(sensore);
  float mV = val / 1023.0 * 5000;
  float temperatura = mV / 10;
  Serial.println(temperatura);
  delay(500);

}

Credo che sia derivato da un malfunzionamento del sensore, avete qualche idea?
Vi ringrazio in anticipo :slight_smile:

Il sensore puoi controllarlo facilmente. Da come uscita da 10mV per °C con un offset di 500mV.
Se misuri 25°C il sensore da una tensione di 500mV + 25 * 10mV = 750mV. Basta misurare la tensione con un multimetro.

Spesso i 5V di alimentazione che viene usato come riferimento non sono 5V.
Usa il riferimneto interno di 1,1V per avere una misura piú precisa.

Ciao Uwe

Va bene grazie, mi scuso per la tarda risposta, domani proverò e le farò sapere

e comunque quella formula è errata


  float temperatura = ((analogRead(sensore) * (5.0/1024))-0.5)/0.01;

Mi scuso per la tarda risposta ma in questi giorni ho avuto da fare,
@uwefed facendo varie prove e controllando la giusta temperatura con un altro termometro, ho usato una temperatura di riferimento di 1820 e la temperatura risulta abbastanza precisa
@brunello22 ho provato ad usare la tua formula e la temperatura differisce di tre gradi rispetto a quella del termometro che ho di riferimento. Comunque potresti spiegarmi il funzionamento di questa formula?
Grazie mille a tutti

Il valore 1024 é sbagliato perché il valore di finerange é 1023. La tensione di riferimento corrisponde a 1023 e non 1024. Comunque l'errore é sotto il 0,1%.

*5,0 ... 5V tensione di alimentazione usata per default come riferimento.
/1023 ... Valore analogico che corrisponde alla tensione di riferimento (1,1V , 2,56V o tensione di alimentazione o qualsiasi tensione che metti sul pin AREF)
-0,5 ... offset di 0,5V che corrisponde a 0°C per poter misurare temperature negative fino -50°C;
/0,01... corrisponde a una moltiplicazione di 100. Nella Tua formula é nascosto in *5000/10.

@ christian2007 La Tua formula é sbagliata perché manca la sottrazione del offset.

Ciao Uwe

NO Uwe, stai sbagliando, se ne è discusso più volte, si deve dividere per 1024 step anche se il valore massimo che raggiungerai è 1023 ... leggi QUI.

Lo step è dato da Vref / 1024, quindi 5/1024 = 4.882 mV, mentre l'ADC si attesterà fisso sul valore 0x03FFF al superamento del valore di tensione di 4.995V ... "0x3FF represents the selected reference voltage minus one LSB." (DS40002061A page 256).

Guglielmo

va bene, grazie ora modifico la formula
grazie mille a tutti :slight_smile:

Prova ad usare la tensione di riferimento interna

#define sensore A0

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

}

void loop() {
  float temperatura = ((analogRead(sensore) * (1.1/1024))-0.5)/0.01;
  Serial.println( temperatura );
  delay( 500 );
}