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:

Figura 1

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

Figura 2

±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:

Figura 2

Figura 3

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.

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Ti sei iscritto alla newsletter

There was an error while trying to send your request. Please try again.

Quattrodispositivi utilizzerà le informazioni fornite in questo modulo per restare in contatto con te e fornire aggiornamenti del sito