Misurazione accurata della temperatura con Arduino


10

Sto cercando di costruire un termostato con Arduino. Voglio alimentarlo usando la batteria / caricatore del telefono cellulare che rende la tensione del sistema abbastanza variabile. In questo momento uso Arduino Uno, ma una volta completato lo porterò su Lilypad.

Per prima cosa ho provato ad usare il sensore di temperatura TMP36 . Finora è stato un completo fallimento. Mentre il sensore stesso sembra essere molto stabile, non riesco a capire un modo per misurare con precisione la sua tensione.

L'uso del riferimento 5v integrato per i sensori analogici non funziona affatto, anche se alimentato da USB Arduino i + 5V sono in realtà + 4.8V (che sposta la temperatura misurata di pochi gradi). Quando la scheda è alimentata dalla batteria, la tensione scende a circa 4 V e la temperatura misurata aumenta. Ho anche provato a usare + 3.3V dalla scheda come riferimento. Sembra essere più stabile quando la scheda è alimentata da USB, ma la sua tensione diminuisce quando si scarica la batteria.

Esiste un altro modo per misurare in modo affidabile la tensione di uscita del sensore?

Per la seconda fase sto pensando di usare termistori. Ho appena ordinato un paio di questi termistori da 20K .

Da quello che ho capito, dovrebbero essere più facili da misurare con precisione se costruisco un partitore di tensione e utilizzo V_in come tensione di riferimento per ADC.

Un paio di domande su di loro:

  • Ha senso utilizzare pochi divisori di tensione con diversa resistenza fissa per aumentare la precisione?
  • Posso usare il pin programmabile come V_in e misurare la temperatura usando pochi livelli di tensione diversi. Sebbene non sia chiaro per me se questo aumenterà effettivamente la precisione.

Si prega di inserire il codice di conversione della temperatura.
geometrikal il

Si prega di definire cosa si intende per "accuratamente". Che tipo di risoluzione della temperatura e precisione assoluta stai cercando di ottenere?
Joe Hass,

Spero di ottenere una risoluzione di circa 1-2 gradi. Anche l'errore di calibrazione assoluta di 1-2 gradi dovrebbe andare bene. Da quello che capisco è relativamente facile ottenere un punto di riferimento a 0 ° C, e immagino di poter ottenere il secondo punto (molto più approssimativo) a temperatura ambiente mediante la calibrazione incrociata dei sensori.
Usov,

1-2 gradi per temperature comprese tra 5 e 25 ° C.
Usov,

@geometrikal Non ce l'ho a portata di mano in questo momento, ma è praticamente uguale a tutti gli altri: rilascia il primo campione, attendi qualche millis, campiona un paio di volte in più e campioni medi. Quindi ridimensionare in base a ciò che si ritiene sia la tensione di riferimento.
Usov,

Risposte:


2

Sembra che tu sia a conoscenza del problema con la modifica della tensione di riferimento e se usi un dispositivo come il TMP36 (fisso 10mV / degC) non puoi fare altro che utilizzare un riferimento di tensione da un chip per stabilizzare le cose.

Tuttavia, se si utilizza un RTD o un termistore, il problema non si presenta. L'ADC sta effettuando una misurazione raziometrica: confronta l'ingresso ADC con la sua tensione di riferimento MA, se si alimenta l'RTD o il termistore (tramite un resistore adatto) dalla stessa tensione di riferimento non influirà sulle letture. Se il riferimento aumenta del 10%, lo stesso vale per la tensione nell'ADC.


4

Penso che dovresti prendere in considerazione l'uso di un sensore di temperatura digitale come DS18B20 / DS18S20 perché non dipende dalla precisione del tuo ADC ATmega per misurare un segnale anaolg, ma utilizza un protocollo digitale a 1 filo per segnalare la temperatura.

Fare riferimento ai seguenti tutorial
http://playground.arduino.cc/Learning/OneWire
http://www.hobbytronics.co.uk/ds18b20-arduino


2
Questa risposta non è molto utile se non si spiega perché l'OP dovrebbe passare a un sensore diverso e non si è fornita alcuna giustificazione. Fornire i collegamenti in una risposta non è una buona idea perché spesso vanno a vuoto e il contenuto della risposta viene perso.
Joe Hass,

Piuttosto che scrivere la mia risposta sulla stessa linea, ho modificato questa A per rispondere alla preoccupazione sollevata da Joe.
RedGrittyBrick il

@JoeHass L'unica alternativa al collegamento ad articoli esterni è quella di allegare il codice nella risposta, ma non ho il mio codice da allegare e non sarebbe variabile allegare il codice di qualcun altro senza il loro consenso. Anche se i collegamenti si interrompono, è possibile trovare facilmente una libreria per Arduino utilizzando Google e DS18B20 come parola chiave. Per quanto riguarda la spiegazione, è stato un mio errore, ho pensato che menzionare il fatto che il sensore è digitale avrebbe spiegato il mio punto.
alexan_e,

Grazie per il commento. Per qualche ragione i sensori digitali sono piuttosto difficili da trovare. Né i fornitori locali (Maplin) né quelli economici (er) online (ho usato Spiraltronics) non ne vendono. £ 3 al pop + consegna lo rende ancora un'opzione relativamente costosa.
Usov,

@Usov A giudicare dai link che hai fornito, suppongo che tu viva nel Regno Unito. Di solito compro questi componenti a buon mercato dalla Cina, ma li ho trovati anche su ebay.uk per £ 1,49, forse sono adatti a te
alexan_e

3

La misurazione sarà buona quanto la tensione di riferimento per ADC è buona. Per impostazione predefinita, Arduino utilizza la tensione di alimentazione come tensione di riferimento, ma nel tuo caso il modo giusto per farlo sarebbe utilizzare il pin Aref di Arduino. Devi ottenere un chip speciale chiamato "Riferimento di tensione" e collegarlo al pin Aref, quindi impostare ADC per utilizzare il riferimento esterno nel codice Arduino ( analogReference(EXTERNAL))

La tensione del riferimento deve essere selezionata in modo tale che l'oscillazione completa del sensore di temperatura si adatti alla tensione di riferimento. TMP36 emetterà ~ 1,5 V a 100 ° C, quindi è necessario utilizzare un riferimento superiore a 1,5 V per misurare la temperatura fino a 100 ° C. Desideri che il tuo riferimento sia il più vicino possibile alla massima tensione misurata per ottenere la massima risoluzione possibile.

Atmega328p ha due riferimenti interni che possono essere utilizzati senza componenti esterni. Uno è 1,1 V, un altro 2,56 V. Di solito hanno una precisione un po 'peggiore di quella che otterresti utilizzando un componente esterno dedicato. Controllare la documentazione di Arduino per analogReference e la scheda tecnica Atmega328p per l'accuratezza del riferimento interno.

Se vuoi davvero ottenere dadi con intervalli diversi, puoi utilizzare diversi riferimenti esterni e cambiarli utilizzando un interruttore analogico come 74hc4051. Oppure puoi alternare tra due riferimenti interni.

Con i termistori si otterranno risultati migliori se si imposta una sorgente di corrente costante invece di utilizzare una resistenza muta. D'altra parte, una resistenza muta alimentata da un riferimento di tensione stabile funzionerebbe bene.

Quando si sceglie un riferimento esterno, assicurarsi di disporre di una tensione sufficiente per compensare la caduta di tensione quando l'alimentazione da batterie e le batterie sono scariche. Vref + Vdropout <Vbat-min.


Grazie per il tuo commento. Questo è fondamentalmente lo stesso commento che ho ricevuto oggi: costruisci la mia tensione di riferimento sul diodo zener o ottieni un regolatore di bassa tensione dedicato per AREF.
Usov,

Perché risultati migliori con corrente costante e termistore?
geometrikal,

2

Non avere un riferimento ADC stabile è in realtà un sintomo di un altro problema nel tuo circuito: non stai fornendo una tensione abbastanza alta alla scheda. Ciò è indicato dal fatto che l'alimentazione a 5 V scende a 4 V e anche la caduta a 3,3 V.

Il regolatore di tensione (MC33269D-5.0 IIRC) sulla scheda Arduino ha una tensione di interruzione di ~ 1,0 V, quindi è necessario fornire almeno 6 V per ottenere un'uscita 5 V stabile. Le batterie AA iniziano a 1,5-1,6 V e sono quasi scariche a 1,1 V, quindi è necessario alimentare la scheda con almeno 6 batterie AA per un'uscita stabile per l'intera durata della batteria.

Alimentato correttamente, è possibile utilizzare il riferimento ADC interno o le linee 5V o 3.3V. Poiché il sensore di temperatura varia di circa 10mV per grado Celcius, è possibile utilizzare un divisore di tensione per impostare la tensione di riferimento equivalente alla tensione di uscita massima prevista del sensore (ad esempio per 50 gradi C). Ciò fornirà una misurazione più precisa.

Se si desidera utilizzare meno di 6 batterie AA, provare un convertitore boost DC-DC, ad esempio https://www.sparkfun.com/products/10968 . L'esempio collegato prende 1 V - 4 V e produce 5 V. L'uscita verrebbe immessa direttamente nel pin 5V dell'Arduino, bypassando il suo regolatore.

Per prolungare la durata della scheda con le batterie, mettere l'MCU in pausa tra le letture del sensore. La libreria a basso consumo rocketscream è ottima per questo scopo. Ma è davvero utile solo quando si utilizza un regolatore / convertitore DC-DC efficiente poiché il regolatore Arduino standard utilizza 10 mA da solo!


1

Risposta alla domanda Esiste un altro modo per misurare in modo affidabile la tensione di uscita del sensore?

ADC utilizza la tensione di riferimento per la conversione da analogico a digitale. Pertanto, se si verifica una variazione della tensione di riferimento, i valori convertiti (ovvero il valore digitale) cambieranno. Il valore digitale sarà diverso per lo stesso ingresso analogico se la tensione di riferimento cambia.

Un'opzione semplice è utilizzare la tensione di riferimento interna all'interno di Arduino (cioè controller Atmega).

Vedere il collegamento seguente in cui viene fornito un codice di esempio per utilizzare l'ADC interno (nome della funzione Arduino - analogReference (DEFAULT))

http://tronixstuff.com/2013/12/12/arduino-tutorials-chapter-22-aref-pin/

Penso che questo risolverà il tuo problema e non è necessario passare ai termistori.


Non sono sicuro di quanto sia rilevante "Hacking Wifi finder": non riesco a trovare nulla di rilevante. Riguardo al riferimento interno ADC - ne ho scritto. Non funziona anche quando Arduino è alimentato da USB. E quando la scheda è alimentata dalla batteria del telefono cellulare (3,7 - 4,5 V) è anche peggio.
Usov il

Mi dispiace è un errore di copia / incolla. Correggerò presto il link!
Robomon il

Link @Usov corretto!
Robomon il

1.1 V interni possono fluttuare di oltre il 10% secondo le specifiche atmega328. Anche questo non sembra essere un riferimento molto affidabile.
Usov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.