In questo articolo come si evince dal titolo voglio presentarvi un termostato realizzato con Arduino UNO, dove attraverso due pulsanti è possibile regolare la soglia di temperatura.

Il sensore utilizzato è il classico LM35, perchè è molto semplice da utilizzare e da collegare, in quanto si presenta un contenitore di tipo TO92 analogo a quello di un normale transistor, e necessita solo di un collegamento ad una porta analogica (ADC)  per la lettura del valore di tensione fornito dal sensore. Il sensore ha  3 terminali: uno per l’alimentazione, uno di massa e uno per l’uscita della tensione proporzionale alla temperatura rilevata che è pari a 10 mV/°C , ed è calibrato in gradi Cesius.

LM35

Per l’occasione ho utilizzato la LCD shield (compatibile). Essa è costituita da un LCD HD44780, un trimmer da 10K per la regolazione del contrasto del display e infine una piccola tastiera  composta da 5 tasti utili per diverse applicazioni. La schield si presenta così:

350px-Arduino_Shield8

Per il pin out della shield vi lascio al link: http://www.dfrobot.com/index.php?route=product/product&product_id=51#.Uq8hMfTuJnE

Prima di mostrarvi lo schema elettrico e il programma voglio parlarvi dell’ isteresi. L’isteresi in elettronica è la caratteristica di un sistema di reagire in ritardo alle sollecitazioni applicate e in dipendenza dello stato precedente .In un termostato l’isteresi è fondamentale.

Questo è il grafico dell’isteresi:

isteresi

Voglio precisare che per impostare la soglia del termostato ho utilizzato due pulsanti con resistenza di pull-up. Quindi per poter incrementare o decrementare il valore di soglia è necessario seguire la configurazione di pull-up: in uscita avremo lo stato logico  HIGH senza premere il pulsante, mentre premendo il pulsante avremo lo stato logico LOW. Questo è lo schema per intenderci:

Pull-up

Vi mostro il codice già commentato:

#include <LiquidCrystal.h>
#define outPin 2
#define tempP 0
#define tempM 1
#define LM35 A1

float vref = 1.1; // Vref dell'ADC (quell'interno è di 1,1V)
int tempSoglia = 20;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // 'lcd' è una variabile di tipo LiquidCrystal

void setup()
{
 analogReference(INTERNAL); // per l'ADC usiamo il Vref interno da 1,1V (migliore precisione)
 analogRead(LM35); // Prima lettura "a vuoto" (serve per l'assestamento dell'ADC)
 pinMode(outPin,OUTPUT);
 pinMode(tempP,INPUT);
 pinMode(tempM,INPUT);

 lcd.begin(16,2);
 lcd.setCursor(3,0);
 lcd.print("Termostato");
 lcd.setCursor(4,1);
 lcd.print("Digitale");
 delay(2000);
}

void loop()
{
 float temp = readTemp(); // legge il valore della temperatura e la memorizza nella var. temp.
 LCD(temp); // invia il valore al LCD

 if(digitalRead(tempM) == LOW){ tempSoglia--; } // decrementa il valore di tempSoglia
 if(digitalRead(tempP) == LOW){ tempSoglia++; } // incrementa il valore di tempSoglia
}

/* Legge la temperatura */

float readTemp()
{
 float temp = 0.0; // valore convertito in temperatura (°C)
 int val = 0; // valore quantizzato dall'ADC [0..1023]
 int nread = 5; // numero di letture (da 5 a 8)
 float somma = 0.0; // somma delle letture

 for (int i=0; i<nread; i++)
 {
 val = analogRead(LM35); // legge il dato della tensione sul pin 'LM35'
 temp = (100.0 * vref * val)/1024.0; // converte la temperatura in °C
 somma += temp; // aggiunge alla somma delle temperature lette
 }
 return ( somma / nread ); // calcola il valore medio
}

/* scrive i valori di temperatura su LCD */

void LCD( float temp )
{
 lcd.clear(); // pulisce lo schermo LCD
 lcd.setCursor(0,0); // cursore in posizione di home: colonna 1, riga 1
 lcd.print("Temp: ");
 lcd.print(temp,1); // Stampa la parte intera e un decimale della temp
 lcd.print(' '); // Stampa uno spazio
 lcd.print((char)223); // Stampa '°'
 lcd.print('C');

 lcd.setCursor(0,2); // cursore in posizione: colonna 1, riga 2
 lcd.print("Soglia: ");
 lcd.print(' '); // Stampa uno spazio
 lcd.print(tempSoglia); // Stampa il valore di tempSoglia sullo schermo

 /* accensione del relè con isteresi */

 if(temp < tempSoglia-2)
 {
 digitalWrite(outPin, HIGH);
 }
 if(temp > tempSoglia+2)
 {
 digitalWrite(outPin, LOW);
 }
 delay(1000); // attende 1 secondo
 }


Alcune  foto della realizzazione:

Termostato

Termostato_2

Grazie per l’attenzione!! Al prossimo articolo.