Problema sensore di temperatura

Ciao a tutti.
Utilizzo Arduino da circa due settimane e non sono ancora molto pratico. L’idea è quella di realizzare un orologi,o con schermo LCD, che mi fornisca anche temperatura e umidità. Tutto acceso e spento da un pulsante.
Ora, siccome voglio capire tutti i passaggi che faccio, evitare gli errori nella programmazione e mettere stringhe inutili sto facendo le cose poco a poco. Per prima cosa ho impostato il pulsante con un led in modo tale che ogni volta viene schiacciato, cambia lo stato del led e di conseguenza di tutto il resto che verrà aggiunto successivamente. Ho montato il sensore della temperatura TMP36 il quale dovrebbe dirmi la temperatura rilevata sul monitor seriale (al momento sto usando lo schermo LCD), ma questo mi da sempre un valore che non varia al variare della temperatura. Sono abbastanza sicuro che il problema sia nella programmazione e non al livello di collegamenti sulla breadbord.
Voi che dite? Come potrei sistemare lo sketch?

sketch_sep15d.ino (1.67 KB)

Buona sera,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

ciao Manfredk,

dove hai trovato il tuo sketch?
tu scrivi (riporto solo le due righe che m'interessano):

    analogReference (INTERNAL);
    misure [i] =((0.107* valore) -50);

cioè usando una tensione di riferimento di 1,1 Volt.

nei 3-4 esempi che ho trovato io si usava la:

    analogReference (EXTERNAL);

collegando i 3,3 volt e utilizzando la seguente conversione:

val_Adc = analogRead(0);
temp = ((val_Adc * 0.00488) – 0.5) / 0.01;

quindi sei sicuro della conversione che fai?...e comunque...qual'è il valore che ti da?

gpb01:
Buona sera,
essendo il tuo primo post, nel rispetto del regolamento (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

Si certo, scusa! Mi sono presentano e ho letto il regolamento! :smiley:

ORSO2001:
ciao Manfredk,

dove hai trovato il tuo sketch?
tu scrivi (riporto solo le due righe che m'interessano):

    analogReference (INTERNAL);

misure [i] =((0.107* valore) -50);



cioè usando una tensione di riferimento di 1,1 Volt.

nei 3-4 esempi che ho trovato io si usava la:


analogReference (EXTERNAL);



collegando i 3,3 volt e utilizzando la seguente conversione:


val_Adc = analogRead(0);
temp = ((val_Adc * 0.00488) – 0.5) / 0.01;




quindi sei sicuro della conversione che fai?...e comunque...qual'è il valore che ti da?

Stavo seguendo delle lezione su slide del professore maffucci che ho trovato su internet. Il problema è che dopo la terza lezione, circuiti e sketch sono pieni di errori quindi sono molto meno affidabili..
In una lezione di queste spiegava come utilizzare il sensore TMP36 e spiegava alcuni sketch su come usarlo e come migliorare la precisione dei valori.
Il primo o il secondo metodo che spiegava è esattamente quello che dici tu: tensione di 3,3 Ve analogReference (EXTERNAL). Ma utilizzandolo mi sono trovato molto male, non ricordo con esattezza ma credo che i valori di temperatura che riportava erano sballati oppure, variando la temperatura, dava sempre lo stesso valore.
In un altro metodo usava una tensione di 1,1 V con analogReference (INTERNAL) ma ancora avevo valori con attendibili.
L'ultimo era questo, che proponeva una media fatta su otto valori calcolati (finge essere quindi il più preciso), e infatti con un errore di 0,5 °C era funzionante.
Ora che ho ripreso questa parte di sketch per realizzare questo progetto non funziona proprio.

Per rispondere alle tu domande: no, non sono per niente sicuro in realtà, perciò scrivo qua.
Sul monitor seriale dovrebbe spuntarmi:

Temperatura: XX °C

Spunta invece:
Temperatura: -50.00 °C

ciao,

per tornarti sempre -50.00 vuol dire che la tua lettura della variabile "valore" con analogRead(A0) è "0".
puoi fare una prova stampandoti anche "valore".

ORSO2001:
ciao,

per tornarti sempre -50.00 vuol dire che la tua lettura della variabile "valore" con analogRead(A0) è "0".
puoi fare una prova stampandoti anche "valore".

Ah infatti, era saltato il collegamento di entrata del sensore e non me ne ero accorto.
Ho cambiato la tensione di riferimento e i valori di conversione, ma è ancora sballata:

temperatura = (valore * 0.00488 - 0.5)/ 0.02;

A 25 °C mi da 30 °C circa e a 30 °C me ne da 35. Dove sbaglio?
Ho collegato l'uscita 3,3v con l'uscita AREF (da quello che ho letto sembra che dovrebbe aumentare la precisione ). Ma non si potrebbe semplicemente mappare i valori letti dal sensore con i valori della temperatura massima e minima che legge?

ciao...allora per essere precisi...
la formula per convertite il segnale letto da analogRead() è:

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

considerando la sonda tmp36 e il riferimento a 5 Volt la formula diventa:

°C = ((val_Adc * 0.00488) – 0.5) / 0.01;

°C è quello che voglio; val_ADC è il valore letto dal PIN A0 (o la media); PrecisoneADC è la minima differenza di tensione su A0 per far variare la sua lettura...in questo caso 5/1024=0.00488; 0.5 è il valore in Volt che la sonda ritorna a 0°C ; 0.01 è la differenza di tensione che la sonda invia tra un grado e l'altro.

se tu usi il riferimento a 3,3 Volt non sarà più 0.00488 ma 0.00322; e attenzione al 0.01 alla fine...0.02 è la precisone della sonda tmp37.

ORSO2001:
ciao...allora per essere precisi...
la formula per convertite il segnale letto da analogRead() è:

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

considerando la sonda tmp36 e il riferimento a 5 Volt la formula diventa:

°C = ((val_Adc * 0.00488) – 0.5) / 0.01;

°C è quello che voglio; val_ADC è il valore letto dal PIN A0 (o la media); PrecisoneADC è la minima differenza di tensione su A0 per far variare la sua lettura...in questo caso 5/1024=0.00488; 0.5 è il valore in Volt che la sonda ritorna a 0°C ; 0.01 è la differenza di tensione che la sonda invia tra un grado e l'altro.

se tu usi il riferimento a 3,3 Volt non sarà più 0.00488 ma 0.00322; e attenzione al 0.01 alla fine...0.02 è la precisone della sonda tmp37.

Perfetto grazie! Ho sistemato queste cose dopo aver fatto il post precedente. Funziona, però non è molto preciso.. a seconda della temperatura che impongo, il valore calcolato ha un errore che va da circa 0,5 a 1,5..
Posso aumentare ulteriormente la precisione o questo è il massimo che posso ottenere?
Considera che la situazione è la seguente: a 25 gradi me ne da 24,88; a 39 me ne da 39,92 e a 17 me ne da 18,16.. Diciamo che fin quando l'errore è di 0,12 ci può stare, però già a 39 gradi ha un errore di quasi un grado intero.. Non so, si può fare qualcosa?

bene…non ho esperienza con quel sensore…come hai testato la temperatura?..che non ci si a anche un fattore ambientale…

Manfredk: ... non so se hai letto le specifiche del TMP36, ma danno una accuratezza +/- 2°C ... quindi direi che sei nei normali limiti del sensore.

Guglielmo

Ah va bene, grazie! :smiley: