Pubblicato il Lascia un commento

Costruire un termostato con Arduino

Costruire un termostato con Arduino

Poco tempo fa è venuto a mancare il termostato che comandava la caldaia a casa mia, così mi sono subito adoperato a crearne uno semplicissimo con l’utilizzo di arduino, un display un sensore di temperatura e due pulsanti per l’impostazione della temperatura minima da mantenere all’interno dell’abitazione.

Costruirne uno è semplicissimo! Avrai bisogno di:

 

  • 2 led (uno verde e uno rosso)
  • 2 resistenze da circa 170 Ohm (per i due led)
  • 2 pulsanti
  • 2 resistenze da da 1 kOhm o più
  • 1 resistenza variabile da 4,7 kOhm (per la regolazione del contrasto del display)
  • 1 sensore di temperatura LM35
  • 1 display 20×4 (il programma si può adattare anche per display di dimensioni inferiori modificando i vaolori)
  • vari cavetti
  • una breadboard
  • un arduino (uno in questo caso, ma il codice è compatibile con tutti gli arduini)
  • un cavo usb per la programmazione

Ecco il circuito e il suo progetto:

 

fotoTerm termArduino

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

E qui sotto riporto il codice arduino (questa è la prima versione, devo apportare dei grandi miglioramenti sulla parte dell’aumento e diminuzione della temperatura minima)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

 

#include <LiquidCrystal.h>
/* Corrispondenza pin LCD <-> pin digitali di Arduino */
#define RS  12
#define EN  11
#define D7  5
#define D6  4
#define D5  3
#define D4  2
#define off 7
#define on  6
#define tempP  9
#define tempM  8
/* Numero del pin analogico sul quale è collegato l'LM35  */
#define LM35_pin 0
/* Definizioni globali */
float vref = 1.1;                        // Vref dell'ADC (quell'interno è di 1,1V)
int tempSoglia = 20;
LiquidCrystal lcd( RS, EN, D7, D6, D5, D4 ); // 'lcd' è una variabile di tipo LiquidCrystal */
/* Impostazione dell'hardware */
void setup()
{
  analogReference( INTERNAL );  // per l'ADC usiamo il Vref interno da 1,1V (migliore precisione)
  analogRead( LM35_pin );       // Prima lettura "a vuoto" (serve per l'assestamento dell'ADC)
  lcd.begin( 2, 16 );           // Impostazione per l' LCD (2×16)
    
  pinMode(off, OUTPUT);
  pinMode(on, OUTPUT);
    
  pinMode(tempP, INPUT);
  pinMode(tempM, INPUT);
    
}
void loop()
{
  float temp = readTemp();  // legge il valore della temperatura e la memorizza nella var. temp.
  sendTempToLCD( temp );    // invia il valore al LCD
    
  if(digitalRead(tempM) == HIGH){ tempSoglia–; }
  if(digitalRead(tempP) == HIGH){ 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_pin );              // legge il dato della tensione sul pin 'LM35_pin'
    temp = ( 100.0 *  vref * val ) / 1024.0;   // lo converte in °C
    somma += temp;                             // aggiunge alla somma delle temperature lette  
  }  
  return ( somma / nread );                     // ne calvola il valore medio
}
/* Invia la temperatura su un LCD (modo 4bit) */
void sendTempToLCD( float temp )
{
  lcd.clear();               // Pulisce lo schermo
  lcd.setCursor( 0, 0 );     // Va in posizione di home: colonna 1, riga 1
  lcd.print( "Temperatura di: ");
  lcd.setCursor( 0, 1 );     // Va in posizione di home: colonna 1, riga 2
  lcd.print( temp );         // Stampa solo la parte intera della temp.
  lcd.print( ' ' );          // Stampa uno spazio
  lcd.print( (char) 223 );   // Stampa '°'
  lcd.print( 'C' );
    
  lcd.setCursor( 0, 2 );
  lcd.print( "Temp di soglia: ");
  lcd.print( ' ' );          // Stampa uno spazio
  lcd.print(tempSoglia);
    
  if(temp <= tempSoglia){
    digitalWrite(on, HIGH);
    digitalWrite(off, LOW);
  }else{
    digitalWrite(off, HIGH);
    digitalWrite(on, LOW);
      
  }
    
    delay(1000);
    
}

 

 
 
Lascia un commento

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