Lettura della temperatura con il sensore TMP36 (Lezione 10)
Introduzione
Tenere sotto controllo la temperatura di un dispositivo è fondamentale per la longevità e il corretto funzionamento di un sistema, pertanto, è indispensabile monitorarla costantemente, infatti, i processori dei PC integrano un sensore di temperatura, se dovesse aumentare fino al limite massimo consentito dal dispositivo, c’e’ un sistema di protezione che interrompe l’alimentazione per evitare un’ulteriore riscaldamento della CPU .
Possiamo catalogare i sensori di temperatura in digitali o analogici, la prima tipologia genera un codice binario, proporzionale alla temperatura rilevata, mentre il secondo tipo fornisce un segnale analogico, che può essere in corrente o in tensione. In questo post, utilizziamo il sensore di temperatura TMP36, è analogico, quindi, per poter conoscere la temperatura rilevata, il segnale, prodotto dal sensore, deve essere convertito in forma digitale, con l’ADC integrato nel microcontrollore di Arduino e il valore letto sara’ visualizzato sul terminale UART dell’IDE VSC o quello proprietario di Aduino.
Le nozioni che verranno analizzate in questo articolo sono le seguenti:
- Analisi del datasheet del sensore di temperatura TMP36
- Conversione in gradi centigradi della tensione letta in ingresso
Leggere un sensore TMP36
Il sensore di temperatura TMP36, prodotto da Analog Device, e’ lineare, cioe’, la tensione d’uscita è proporzionale alla temperatura in gradi centigradi.
Diamo un’occhiata al datasheet
Le caratteristiche principali del sensore TMP36, sono le seguenti:
Andiamo ad analizzare ogni singola caratteristica riportata sopra:
Low voltage operation (2.7 V to 5.5 V)
Sensore puo’ essere alimentato con la tensione compresa nell’intervallo tra 2.7 e 5.5V, in pratica può lavorare con quasi tutti i microcontrollori in commercio, in particolare, nel nostro caso, possiamo alimentarlo con al tensione d’uscita a 5V di Arduino Uno.
Calibrated directly in °C
La caratteristica riportata in Figura 2 indica il comportamento del sensore in funzione della tensione d’uscita e la temperature, come si puo’ osserva c’e’ una corrispondenza di tipo lineare, ogni incremento di temperatura di un 1 °C corrisponde un aumento di tensione d’uscita di 10 mV:
10 mV/°C
±2°C accuracy over temperature (typ)
Il sensore può discostarsi, tipicamente, dalla temperatura reale di ±2°C, che nella stragrande maggioranza dei casi e’ un’accuratezza più che sufficiente.
±0.5°C linearity (typ)
La risposta del sensore può avere uno scarto, tipico, dal comportamento lineare di ±0.5°C.
Stable with large capacitive loads
Anche con valori di capacità relativamente alti (10000 pF, valore presente all’interno del datasheet), la tensione d’uscita rimane stabile.
Specified −40°C to +125°C, operation to +150°C
Intervallo di temperatura operativa del sensore.
Less than 50 µA quiescent current
La corrente di assorbimento del sensore è minore di 50 µA, pertanto, può essere usato a anche in applicazione dove e’ richiesto un basso consumo d’energia.
Low self-heating
Nel normale funzionamento, il sensore non perturba la misura della temperatura perché’ ha un basso livello di auto riscaldamento, legato anche al parametro visto nel punto precedente.
Modello matematico per la lettura della temperatura
Nel datasheet è indicato, nella prima pagina, che alla temperatura di 25 °C, la tensione d’uscita del sensore e’ di 0,75 V, mentre a 125 °C è 1,75 V invece a -50 °C è 0V.
Dato che, il sensore ha un comportamento lineare, possiamo ricavare l’equazione della retta passante per le temperature, indicate nel datasheet, in modo d’avere una relazione matematica che ci semplifichi il calcolo della temperatura rilevata dal sensore e da inserire nel nostro codice, come vedremo di seguito. L’equazione di una retta ha la seguente relazione:
Nel nostro caso, y e’ la temperatura in gradi centigradi, mentre m è il coefficiente angolare che indica di quanto la retta è inclinata, in ultimo n è il valore noto e rappresenta la coordinata Y dove la retta s’interseca.
Dalle relazioni della temperatura in funzione della tensione d’uscita, riportate precedentemente, possiamo ricavare il valore di m, data dalla seguente relazione:
A questo punto abbiamo tutti i valori:
- m = 100
- n = -50
- x = è il valore di tensione d’uscita del sensore
Con l’equazione della retta possiamo determinare immediatamente la temperatura in corrispondenza del segnale analogico generato dal sensore, infatti, dalla relazione riportata sopra, basta sostituire alla x il valore di tensione d’uscita del sensore e otteniamo la temperatura in gradi centigradi.
Schema elettrico
Di seguito è riportato la pin function e lo schema elettrico per collegare il sensore TMP36, alla scheda Arduino:
Ho usato un diodo LED multicolore con scopo di segnalare tre livelli di temperatura (in un prossimo progetto collegheremo un display LCD) , usiamo il colore verde, per indicare che la temperatura è sotto la soglia massima, mentre il colore blu ci indica che siamo quasi vicino alla soglia massima < 5 °C e con il colore rosso il sensore ha raggiunto e superato la soglia massima di lavoro.
Analizziamo il codice
// Temperature Alert! const int BLED=9; // Il LED blu è collegato al Pin 9 const int VLED=11; // Il LED verde è collegato al Pin 10 const int RLED=10; // Il rosso verde è collegato al Pin 11 const int TEMP=0; // L'uscita del sensore di temeperatura e' connesso ad A0 const int PRIMO_LIMITE = 30; // soglia limite 5 °C const int SECONDO_LIMITE = 49; // soglia limite 5 °C const int TERZO_LIMITE=50; // soglia massima float analog; float val = 0; // varibile per la lettura del segnale analogico float temperatura = 0; void setup() { pinMode (BLED, OUTPUT); // impostiamo come uscita il pin collegato al LED blu pinMode (VLED, OUTPUT); // impostiamo come uscita il pin collegato al LED verde pinMode (RLED, OUTPUT); // impostiamo come uscita il pin collegato al LED rosso // Impostiamo le uscite a valore alto, per spegnere i tre diodi LEDS all'accensione digitalWrite(BLED, HIGH); digitalWrite(VLED, HIGH); digitalWrite(RLED, HIGH); Serial.begin(9600); } void loop() { val = analogRead(TEMP); analog = val * 5/1023; temperatura = (100*analog)-50; // temperatura in gradi centigradi Serial.println("Temperatura: " + String(temperatura) + "°C"); delay(1000); // LED is Blue if (temperatura > PRIMO_LIMITE && temperatura <= SECONDO_LIMITE ) { digitalWrite(RLED, HIGH); digitalWrite(VLED, HIGH); digitalWrite(BLED, LOW); } // LED is Red else if (temperatura >= TERZO_LIMITE) { digitalWrite(RLED, LOW); digitalWrite(VLED, HIGH); digitalWrite(BLED, HIGH); } // LED is Green else { digitalWrite(RLED, HIGH); digitalWrite(VLED, LOW); digitalWrite(BLED, HIGH); } }
val = analogRead(TEMP); con la funzione analogRead() leggiamo l’ingresso analogico convertito in codice binario.
analog = val * 5/1023; Con questa istruzione convertiamo il segnale campionato in un valore analogico, che deve essere inserito nell’equazione lineare del sensore.
temperatura = (100*analog)-50; Convertiamo il valore letto dal sensore di temperatura in gradi centigradi.
if (temperatura > PRIMO_LIMITE && temperatura <= SECONDO_LIMITE ) Se il valore letto è compreso tra due limiti prestabiliti, se è vera accendiamo il dido LED blu (digitalWrite(BLED, LOW);)
else if (temperatura >= TERZO_LIMITE) Altrimenti se abbiamo superato il limite massimo accendiamo il diodo LED rosso(digitalWrite(RLED, LOW);)
else (riga 49) Altrimenti se non siamo nelle due condizioni precedenti accendiamo il dido LED verde.