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

8 Comments

  1. gian.tassinario 30 ottobre 2013
  2. darkstar55 27 maggio 2013
  3. darkstar55 27 maggio 2013
  4. Piero Boccadoro Piero Boccadoro 28 maggio 2013
  5. willygroup 28 maggio 2013
  6. buffi85 29 maggio 2013
  7. taraschi.nicola 29 maggio 2013
  8. Piero Boccadoro Piero Boccadoro 1 giugno 2013

Leave a Reply