Arduino costituisce una risorsa hardware economica e con software a corredo molto vasto che ne consente il rapido interfacciamento con molti sensori e componenti. Scopo di questo articolo è l’interfacciamento con le tipologie più comune di sensori di temperatura.
Le routines di lettura dei sensori vengono assemblate come blocchi autonomi di codice che, inserite nel programma di utilizzo, possono essere utilizzate tramite la chiamata alla stessa routine. La temperatura viene visualizzata su un display LCD e, contemporaneamente, tramite PROCESSING, viene prodotto il grafico temperatura-tempo.
I sensori di temperatura
Per consentire la più estesa possibilità di scelta abbiamo implementato diversi trasduttori:
Figura 1: pinout del LM35
LM35. LM35 è un sensore analogico (figura 1) ed ha una uscita analogica di 10 mv /°C ed una accuratezza di ±1⁄4°C a temperature ambiente. A 0°C l’uscita è 0 Volt. Il componente può essere connesso direttamente all’alimentazione 5V di Arduino. L’uscita viene connessa ad un suo qualsiasi ingresso analogico e letta con l’istruzione N=analogRead(porta). Se è inserita l’istruzione analogReference(INTERNAL) nella routine SETUP , il valore letto di 1023 (Arduino ha una conversione ADC a 10 bit , quindi 210=1024) è fatto corrispondere a 1, 1 volt su Arduino Uno. Essendo l’uscita del LM35 di 10mv/°C a partire da 0°C la temperatura t è = 110● N /1023. Se la tensione di riferimento è 1,1 V quando v=1,1 Volt N=1023 e pertanto t=110°C.
float lm35(int porta){
float ur;
int letto;
float t;
delay(100);
letto=analogRead(porta);
t=letto*0.107527;
return t;
}
La routine che determina la temperatura sul canale analogico con LM35
LM335. E’ simile al LM35 , ma l’uscita è 0V a -273°C. Il potenziometro va tarato per avere una uscita di riferimento:ad esempio 2,93 V a 20°C.
Figura 2: pinout del sensore LM335
DS18B20. Questo componente è un sensore digitale e non analogico. Ha un campo di misura da -55°C a +125°C ed una accuratezza di ±0.5°C nel campo -10-85°C . La connessione è fatta anche in questo caso prelevando l’alimentazione da ARDUINO mentre l’uscita va ad un pin digitale e non analogico. Il software di lettura, reperibile su INTERNET, si avvale della libreria ONEWIRE.H di ARDUINO.
Figura 3: pinout del sensore DS18B20. La resistenza è di 4,7 kOhm.
NTC 10K. Questo componente è in sostanza una resistenza variabile con la temperatura. La relativa connessione è riportata in figura 3. In questo caso il NTC è inserito in un partitore di tensione ad alimentazione 5V stabilizzata . La tensione di uscita è Vout=5/(1+R) , dove R è la resistenza in kohm del componente che vale quindi : R=(5-Vout)/Vout . La tensione di uscita è VOUT =N* VRIF/1023. Nota che sia la tensione d’uscita il software determina la temperatura tenendo conto che per lo NTC vale la relazione:
R= R0 e b (1/T1/T0)
dove R0 è la resistenza alla temperatura di riferimento di 25°C (per un NTC 10k R0=10 kOhm, b è una costante caratteristica del materiale del termistore (tipicamente 3450) . La temperatura t[°C] viene ricavata dall’espressione:
t= 1/[(1/ b) LN (R/R0)+1/T0] - 273,15
La lettura della temperatura è basata sulla funzione NTC_GEN a cui vengono passati due parametri: la resistenza di riferimento e la porta analogica. (Se il componente ha una resistenza alla temperatura di riferimento , ad esempio 1 Kohm ,allora la funzione chiamata è ntc_1k , che si appoggia sulla precedente.
Figura 4: collegamento del NTC
float ntc_gen(float n ,byte porta) { float r1; float beta=3450; float tensione; float rx ; float R;* int letto; letto=analogRead(porta); tensione=letto*0.00489; R=(5000-1000*tensione)/tensione; R=R/n; rx=log(R)/log(exp(1)); rx=rx/beta+0.003355705; rx=1/rx; rx=rx-273; return rx; } float ntc_10k(byte porta) { float n=10000; float r; r=ntc_gen(n,porta); return r; }
Quanto avete letto è la routine in uso per il termistore NTC.
Termocoppia. Una termocoppia è un sensore di temperatura basato sull’effetto termoelettrico. La giunzione T fra i 2 fili di materiale metallico diverso di cui è costituita la termocoppia genera ai suoi capi una differenza di tensione proporzionale alla differenza fra la temperatura del giunto Tp , che costituisce il punto di misura e quella dell’altro capo Ta ( tipicamente l’ambiente nel quale è inserito lo strumento associato alla termocoppia). La relazione fra tensione generata e la differenza Tp-Ta è con buona approssimazione lineare. Poiché questa tensione è molto piccola deve essere amplificata. Supponiamo che anche la tensione amplificata sia lineare. Pertanto Tp-Ta= K ●∆ V, dove ∆ V rappresenta l’uscita OUT dell’amplificatore che va connessa ad un ingresso analogico di ARDUINO.
Figura 5: collegamento della termocoppia R1=R3=10 kOhm, R2=2MOhm, amplificatore operazione=LM324.
Il software su ARDUINO
Il programma su ARDUINO legge la temperatura e la visualizza su un display LCD e contemporaneamente invia il valore di temperatura sulla porta seriale. Un apposito programma in ambiente PROCESSING visualizza il grafico temperatura-tempo.
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
if ( !ds.search(addr)) {
lcd.print("Sensore non presente");
delay(1000);
ds.reset_search();
return; }
if ( OneWire::crc8( addr, 7) != addr[7]) {
lcd.print("CRC non valido!");
delay(1000);
return;
}
}
void loop(void) {
temp=lm35(porta);
lcd.setCursor(0,0);
lcd.print("lm35 =");lcd.println(temp,1);
temp=getTemp();
lcd.print("Ds18b20="); lcd.print(temp,1);
lcd.setCursor(0,1);
temp=ntc_10k(porta);
lcd.print("ntc 10k="); lcd.print(temp,1);
Serial.println(temp,1);
delay(1000);
}
La routine LOOP E SETUP su Arduino che richiamano la lettura dei sensori (LM35 e DS18B20)
Figura 6: grafico su PROCESSING
String inString = myPort.readStringUntil('\n'); if (inString != null) { inString = trim(inString); float inByte = float(inString);
Quello appena visto è il codice su PROCESSING che legge il valore di temperatura inviato da ARDUINO.
Conclusioni e sviluppi.
La lettura dei sensori di temperatura , se non fine a se stessa,è la parte fondamentale di una regolazione di temperatura . La scelta del sensore va fatta in base al range di temperatura e alla precisione richiesta. Fattori importanti sono anche l'inerzia termica e l'isolamento del sensore rispetto al fluido nel quale è immerso, se questo, ad esempio, è acqua. Il vantaggio dei sensori digitali, come il DS18B20, è quello di non soffrire dei disturbi che sono tipici dei sensori analogici. In un prossimo articolo illustreremo un software che permette di attuare la regolazione secondo le varie tipologie: on-off, proporzionale e proporzionale-integrale, con una uscita verso un attuatore di potenza secondo la modalità impostata.
Image credits | Adrirobot
Complimenti..
Articoli come questi sono di grande aiuto. Sono come dei blocchetti Lego che uniti tra loro consentono splendide costruzioni.
Attendo con impazienza gli algoritmi che permettano di attuare la regolazione proporzionale e proporzionale-integrale ed anche la derivativa, così da poter usare Arduino (ma anche altri uC, basta trasporre l’algoritmo) in controlli “seri”.
Attendo….
Sarebbe interessante vedere esempi di interfacciamento con Processing, in modo da realizzare quanto un tempo si faceva con il VB6.
Tra l’altro non ho mai capito perchè MS lo abbia dismesso a favore dell’attuale VB, la cui sintassi è ostica e ridondante, al solo fine di inseguire la pedanteria di Java e in genere dei linguaggi OOP…
Ma esite un clone di VB6 su Windows??? Io ci facevo meraviglie, e con poco sforzo !!!! Tempo fa c’era Jabaco ma non è stato più continuato. Su Linux esiste Gambas.. ma io sono costretto a lavorare su Windows…
Si, hai ragione.
Quando ho letto questo articolo ho personalmente pensato la stessa cosa.
Dal punto di vista didattico è perfetto.
La tua osservazione sulla portabilità potrebbe essere di ispirazione per il prossimo articolo e per questo, contiamo sul riscontro dell’autore.
Proprio oggi mi sono arrivati 2 DS18B20.
Per testarli ho utilizzato la libreria OneWire che si trova qui:
http://playground.arduino.cc/Learning/OneWire
Salve, io sto facendo un termometro con LM35 con atmega8535, quindi è simile all’argomento dell’articolo che è molto interessante, l’unica cosa che non capisco è come faccio a trasformare il dato digitalizzato che ho nel registro del mio ADC in un dato binario che mi indichi il valore della temperatura esatte. Esempio se ho una temperatura di 25,5°C LM35 fornisce una uscite di 255mV che vado a digitalizzare con l’ADC, il risultato dell’ADC come lo posso trasformare in modo da ottenere 25,5 in stringa binaria…
Grazie e buona giornata
non mi è ben chiaro il linguaggio connesso all’atmega 8535 ovvero come sia il sistema hardware .
Si, conosco la libreria. L’ho usata e mi ci son trovato abbastanza bene.
Interessantissimo argomento , specie per neofiti come me….
Mi permetto di suggerire uno spunto circa il Sensore Digitale di Temperatura TCN75A Microchip da interfacciare con Arduino attraverso bus I2C.
grazie
ciao
grazie dell articolo.
avrei un quesito sugli NTC. Ne ho a disposizione uno, ma non riesco a rintracciare modello/datasheet.
Sul corpo del sensore è riportato TDC 220. La sua forma è simile ad un condensatore ceramico.
puoi aiutarmi a capire come interfacciarlo nel modo ottimale con arduino.
inoltre possiedo un sensore di temp a disco, con stampigliata la serigrafia “NTC 33”. sai di cosa si tratta?
grazie
plotino
lo NTC si caratterizza per la sua resistenza termica a 25°C . quindi ntc 10k=10.000 ohm a 25°C. il circuito di figura 4 ed il listato di cui sotto è già pronto per arduino. è in programmazione un articolo con librerie specifiche sui sensori di temperatura e regolazione
Buonasera.. leggendo l’articolo ho viato che lei citava un articolo successivo in erente alla regolazione con controllo proporzionale e proporzionale integrale.. ma poi è stato fatto? Ho fatto una ricerca sommaria ma purtroppo non ho trovato nulla.. mi può aiutare??
Salve volevo fare una domanda banale: i sensori sono contactless?
I sensori di temperatura se vengono usati per misurare una superficie hanno bisogno del contatto altrimenti misurano l’aria attorno.
In altri casi si usano strumenti per la misura della radiazione infrarossa caratteristica dei corpi in genere, ma non è il caso di arduino. La cosa è più complessa