Home
Accesso / Registrazione
 di 

Arduino ed i sensori di temperatura

Sensori di temperatura

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:

immagine 1

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

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di darkstar55

Ottimo!!!

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....

ritratto di Piero Boccadoro

Si, hai ragione. Quando ho

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.

ritratto di darkstar55

dimenticavo...

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...

ritratto di willygroup

Proprio oggi mi sono arrivati

Proprio oggi mi sono arrivati 2 DS18B20.
Per testarli ho utilizzato la libreria OneWire che si trova qui:
http://playground.arduino.cc/Learning/OneWire

ritratto di Piero Boccadoro

Si, conosco la libreria. L'ho

Si, conosco la libreria. L'ho usata e mi ci son trovato abbastanza bene.

ritratto di buffi85

Salve, io sto facendo un

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

ritratto di taraschi.nicola

arduino

non mi è ben chiaro il linguaggio connesso all'atmega 8535 ovvero come sia il sistema hardware .

ritratto di gian.tassinario

sensore microchip

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

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Chi è online

Ultimi Commenti