Problema temperatura TMP36

Ciao,
mi sto approcciando da qualche settimana ad Arduino, per pura passione ma ho competenze in questo settore pari a 0.

Ho inserito il sensore TMP36 e collegato:
1° piedino - rosso - 5V
2° piedino - A0
3° piedino - GND

poi ho scritto poche righe di codice:

void setup() {
  pinMode(A0, INPUT);
  Serial.begin(9600);
}

void loop() {
  int valTMP = analogRead(A0);
  float temp = (((valTMP*5.0)/1023.0)-0.5)*100;
  Serial.print("Temp.: ");
  Serial.print(temp);
  Serial.println(" C");
  delay(500);
}

quando guardo il Serial Monitor mi escono valori di C° prossimi allo zero (0,34 - 1,81 - 0,83 etc) mentre quando ci avvicino la mano compare un -50.00° fisso...

io non capisco davvero cosa faccio di sbagliato, forse la formula è sbagliata... con -50° avrei i pinguini in casa :slight_smile:

grazie :slight_smile:

Ciao
non conosco benissimo il TMP36 pero' mi sembra che per una tensione di uscita di 0.5Vdc il sensore rileva la temperatura di 0°C.
quindi la formula che converte il valore acquisito in gradi centigradi dovrebbe essere

°C = ((valoreADC * PrecisioneADC) – TensioneZeroGradi) / stepGradoTensione

dove

°C = valore della temperatura in gradi centigradi
valoreADC = valore della conversione analogico digitale restituito da analogRead
PrecisioneADC = questo valore è ottenuto dividendo la tensione di riferimento dell’ADC (default 5Vdc) e il numero massimo restituito dalla conversione (1024). (5Vdc /1024 = 0.00488)
TensioneZeroGradi = indica la tensione di uscita dal sensore quando rileva una temperatura di 0°C
stepGradoTensione = indica la variazione di tensione per ogni variazione di grado (0.01 = 10 mV)

prova a modificare la riga

float temp = (((valTMP*5.0)/1023.0)-0.5)*100;

// con questa
float temp =((valTMP * 0.00488) - 0.5) / 0.01;

Riguardando bene il calcolo e' lo stesso, controlla i collegamenti.
altra cosa
pinMode(A0, INPUT);
Non serve a nulla in quanto il pin A0 e' solo un input analogico

Massimo

Non è vero: i pin A0...A5 sono ingressi e uscite come gli altri che, in più, hanno accesso all'ADC. Leggendo l'ADC con analogRead, però, è inutile dichiararli come ingressi o uscite digitali, perché la stessa funzione analogRead fa le impostazioni per la lettura dell'ADC.

Il TMP36 produce 500mV a 0°C e 750mV a 25°C:

La formula
float temp = (((valTMP*5.0)/1023.0)-0.5)*100;
o, più semplicemente:
float temp = (analogRead(A0)*5.0/1023-0.5)*100;
è corretta: è la tensione all'ingresso meno gli 0,5V a 0°C moltiplicato 100 per avere il valore 25 con 0,25V.

  1. Per sicurezza metti 100.0 invece di 100 (cosi forzi il calcolo tra float, non si sa mai)

  2. stampa anche in valore di valTMP perchè dalla formula -50 lo hai quando valTMP=0

  3. ma.... stai usando Arduino Uno ?? O altra scheda ?

  4. hai un link al modulo TMP36 che hai comprato ? non si sa mai non sia il solito

Controlla il cablaggio

1 Like

ciao Datmn
io credevo che i pin indicati come A0 A1 ecc. fossero solo input analogici, per poterli usare come digitali, e quindi input e output bisognasse chiamarli col numero. Esempio nell'arduino 1 per utilizzare il pin A0 come output
pinMode(14, OUTPUT).
Ma sicuramente mi sbaglio, probabilmente funziona anche
pinMode(A0, OUTPUT), anche se non ho mai verificato.

???...

Nell'ambiente di Arduino Uno, Nano e di tutte le schede basate su ATmega328p, sia A0 che 14 indirizzano lo stesso pin, così come A1 e 15, ecc.

Ti sbagli A0 e 14 stessa cosa, se stampi A0 ti da 14 (arduino uno)
cambia analogico/digitale in base al comando usato; digitalRead(A0) lo usi come digitale, analogRead(A0) lo usi come analogico

Grazie per l'informazione.
Quindi se capisco bene e' inutile definire il pin Mode se e' il comando che determina l'input analogico o digitale

pinMode serve solo per le uscite digitali e per il pull-up. All'accensione i pin sono impostati come ingressi, perciò impostarli come ingressi nel setup serve solo per far vedere che sono ingressi.

In casi particolari con scarsità di pin, è possibile fare commutazioni out/in/out durante l'esecuzione del programma. Io, per esempio, l'ho fatto pilotando un LED e leggendo periodicamente la tensione della batteria, applicata mediante un partitore che produce meno di 1V, per cui nella lettura è come se il LED non ci fosse.

si, certamente, questo lo sapevo. Io pensavo, non so perche', che A0 fosse automaticamente considerato input analogico (forse ho visto qualche esempio da qualche parte). Anche io ho usato i pin analogici come digitali input e output senza alcun problema.

Ciao,
uso Arduino Uno R3 ed il sensore TMP36 GZ, entrambi dello starter kit.
Ho provato a seguire le istruzioni per il cablaggio dal libro e semplificato un pò l'esercizio dell'Amorometro ma non va.
L'errore sembra infatti essere un problema con l'input del sensore: quando provo infatti a stampare il valore valTMP il risultato è 0.
Può darsi che il sensore sia rotto?

Lo hai collegato correttamente?

errore classico cho ho fatto più di una volta è stato leggere i piedini a rovescio

incredibilmente il sensore si è sempre salvato

Credo che lo abbiamo fatto tutti

Ciao,
Ho provato a ricopiare quello che faccio qui

Esempio
Nell'esempio ho trovato un DS18B20 ma in realtà uso un TMP36, quello dello starter kit.

Io purtroppo non riesco a capire cosa sbaglio.
Grazie della pazienza :slight_smile:

@giuseppe81: guarda, spesso capita di invertire i pin di quel sensore ... quindi, verifica attentamente guardando come è fatto (tieni d'occhio la parte piatta che ti permette di orientarlo) e vedendolo da sotto devi avere:

... verifica di aver collegato correttamente i pin e confermalo.

Guglielmo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.