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
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
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.
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.
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
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?
@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: