I sensori di temperatura si basano sulla proprietà dei semiconduttori (diodi e transistor) di possedere una tensione o una corrente dipendenti dalla temperatura. I circuiti integrati, come ad esempio il TMP36 presente nello Starter Kit di Arduino, impiegano diversi transistor e ne sfruttano la relazione fra la tensione base-emettitore e la corrente di collettore, in maniera tale che per valori fissati di corrente la tensione dipenda soltanto dalla temperatura.
Si tratta di un sensore di temperatura analogico, il quale fornisce un valore di tensione di 10 mV per grado direttamente proporzionale al valore di temperatura che viene rilevato. Può leggere un range di temperatura da –40 a 125°C. Come possiamo notare dalla figura, possiede tre pin:

  • piedino di alimentazione da +2,7 V a 5,5 V;
  • piedino di rilevazione tensione analogica di uscita;
  • piedino collegato a massa.

  

In questo esempio utilizziamo la scheda Arduino per rilevare la temperatura esterna e dopo averla esaminata far accendere alcuni LED. Se la temperatura rilevata è fino a 2 gradi sopra al valore minimo, i LED vengono mantenuti spenti. Se la temperatura è superiore fino a 4 gradi sopra al minimo accendiamo il LED verde, se è tra 4 e 6 gradi sopra al minimo accendiamo sia il LED verde che il LED giallo, se infine è superiore ai 6 gradi sopra al minimo accendiamo tutti i LED.

Soluzione

const int sensorPin = A0;
const float baselineTemp = 20;
void setup()
{
//Settaggio della porta seriale a 9600 baud
Serial.begin(9600);
//Settaggio pin LED 2, 3 e 4 in OUTPUT
for(int pinNumber = 2; pinNumber < 5; pinNumber++)
{
pinMode(pinNumber,OUTPUT);
digitalWrite(pinNumber, LOW);
}
}
void loop()
{
//Lettura del valore analogico pin 0
int sensorVal = analogRead(sensorPin);
//Visualizzazione su schermo del valore letto
Serial.print("Valore sensore: ");
Serial.print(sensorVal);
//Conversione temperatura (0-1023) in tensione (0-5)
float volt = (sensorVal/1024.0) * 5.0;
//Visualizzazione su schermo della tensione in Volt
Serial.print(", Tensione: ");
Serial.print(volt);
//Conversione della tensione in gradi (ogni 10 mV un grado)
Serial.print(", Gradi C: ");
float temperatura = (volt - .5) * 100;
Serial.println(temperatura);
//Controllo della temperatura
//Se minore di baselineTemp spengo tutti i LED
if (temperatura < baselineTemp)
{
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}//Se tra 2-4 gradi sopra al minimo accendo il verde
else if (temperatura>=baselineTemp+2 && temperatura< baselineTemp+4)
{
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}//Se tra 4-6 gradi sopra al minimo accendo il verde+giallo
else if (temperatura>=baselineTemp+4 && temperatura< baselineTemp+6)
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}//Se >6 gradi sopra al minimo accendo il verde+giallo+rosso
else if (temperatura>=baselineTemp+6)
{
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
}
delay(1);
}