Robotica educativa/Termostato

Indice del libro

Ora che si è appreso come misurare la temperatura ambiente, si procede alla realizzazione di un vero e proprio termostato.

Principio di funzionamento modifica

Una volta acquisita la temperatura ambiente, tramite il sensore di temperatura DHT11, si può procedere a diverse cose:

  • attivare un impianto di riscaldamento, se questa è inferiore a una soglia prefissata;
  • attivare un impianto di refrigerazione, quando la temperatura supera una soglia prestabilita.

Le due azioni, apparentemente in contrasto tra loro, sono le due modalità di lavoro di ogni comune termostato domestico. Rispettivamente, vengono chiamate modalità invernale e modalità estiva.

L'accensione dell'impianto (di riscaldamento, come di raffreddamento) corrisponde all'accensione e allo spegnimento di un led. Per esempio: un led rosso quando si attiva l'impianto di riscaldamento e un led blu quando si attiva l'impianto di raffreddamento.

Di seguito lo pseudocodice dove t corrisponde alla temperatura restituita dal sensore, mentre t_min è la temperatura minima, sotto la quale l'impianto di riscaldamento deve attivarsi. Similmente t_max è la temperatura massima, superata la quale, si attiverà l'impianto di climatizzazione.

// Modalita' invernale
if (t < t_min)
    riscaldamento = HIGH;
else
    riscaldamento = LOW;
    
// Modalita' estiva
if (t > t_max)
    raffreddamento = HIGH;
else
    raffreddamento = LOW;
Impianto di climatizzazione con Arduino. Qui è realizzata solo la modalità estiva.

L'impianto che realmente è presente nelle abitazioni è comandato da un codice molto simile a questo. Si potrebbe obiettare che l’impianto di casa è più complesso di un singolo led. Questo è vero, ma non nella parte di controllo e automazione. In casa vi è un sensore (o più se si è fatta una divisione, come zona giorno e zona notte, ma questo non cambia il principio di funzionamento) che data la temperatura ambiente invia un impulso all'impianto di accensione o spegnimento.

Il codice che è stato mostrato fa esattamente questo. Non rimane altro da fare che:

  • stabilire i valori di temperatura minima e massima (possono essere fissi o variabili);
  • visualizzare lo stato del nostro impianto per avere un riscontro di cosa sta accadendo;
  • inviare al monitor seriale la temperatura acquisita, così da capire se si stanno commettendo errori.

Schema di montaggio modifica

Di seguito lo schema di montaggio. Si noti che il sensore di temperature è l'ingresso. Le uscite sono due: il led rosso è la modalità invernale, quando si scende al di sotto di una temperatura prestabilita rappresenta l'impianto di riscaldamento; viceversa, il led blu è la modalità estiva, al di sopra di una temperatura limite attiva il climatizzatore che - in questo caso - è stato realizzato con un motore a corrente continua collegato a una ventola.

 

Si noti che i led sono connessi a una resistenza da  , questo per evitare che passino a miglior vita non appena gli arriva un segnale alto ( ). In quel caso la loro resistenza si abbassa drasticamente e la corrente erogato sarebbe troppo elevata.

La scelta della resistenza dipende da quanta luminosità vogliamo dai led: una bassa resistenza implica alta luminosità, ma minor vita media; viceversa, alzando il valore della resistenza, diminuisce la luminosità, ma aumenta la vita media dei componenti.[1]

Codice modifica

Si noti che la prima parte del codice ricalca l'esempio precedente. In aggiunta vengono definiti i due valori di soglia t_min e t_max, così da poterli modificare agevolmente, e i pin a cui si collegato i led e il motore (quest'ultimo non serve definirlo perché si aziona assieme al led blu). Inoltre, nel setup si deve specificare che i pin connessi ai led sono uscite.

#include "DHT.h"        // Driver per i sensori della serie DHT

#define t_min 18        // Temperatura sotto la quale si attiva il riscaldamento
#define t_max 22        // Temperatura sopra la quale si attiva il climatizzatore

#define LED_B  2        // Pin connesso al led blu
#define LED_R  3        // Pin connesso al led rosso
#define DHTPIN 4        // Pin connesso al sensore
#define DHTTYPE DHT11   // Tipo di sensore utilizzato 

// Il pin 1 (a sinistra) serve per l'acquisizione dati
// Il pin 2 va a +5 V
// Il pin 3 va a massa (0 V)

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);       // Inizializza il monitor seriale
  dht.begin();              // Inizializza il sensore DHT
  pinMode(LED_B, OUTPUT);   // Specifica che il led blu e' una uscita
  pinMode(LED_R, OUTPUT);   // Specifica che il led rosso e' una uscita
}

void loop() {
  // Acquisisce la temperatura in Celsius (parametro di default)
  float t = dht.readTemperature();

  // Controlla se il sensore ha fornito tutti gli output prima di proseguire
  if (isnan(t)) {
    Serial.println(F("+---------------------------+"));
    Serial.println(F("| Sensore DHT non connesso! |"));
    return;   // Questo comando provoca l'uscita dalla funzione che verra' rieseguita
  }

  // Modalita' invernale
  if (t < t_min)
    digitalWrite( LED_R, HIGH );
  else
    digitalWrite( LED_R, LOW );
    
  // Modalita' estiva
  if (t > t_max)
    digitalWrite( LED_B, HIGH );
  else
    digitalWrite( LED_B, LOW );

  // Invia la temperatura al monitor seriale
  Serial.println("+-------------------------------------------------------");
  Serial.println("| Temperatura:           " + String(t)   + "C ");

  // Attende due secondi prima di eseguire una nuova misurazione
  delay(2000);  
}

Si noti che le poche righe dello pseudocodice, mostrato all'inizio, rappresentano il cuore di tutto il programma.

In totale si trovano:

  1. definizioni che è buona prassi inserire sempre in testa al codice, così da ritrovarle e poterle modificare agevolmente;
  2. impostazioni iniziali contenute nel setup che vengono eseguite una sola volta (e dopo la pressione del tasto di reset);
  3. lettura della temperatura dal sensore DHT11;
  4. verifica che il dato esista;
  5. azionamento dell'impianto di riscaldamento o ventilazione;
  6. invio dei dati alla porta seriale;[2]
  7. intervallo tra due azioni.[3]

Espansioni suggerite modifica

  • Chi ha seguito con attenzione avrà sicuramente notato che per modificare le temperature di soglia occorre modificare il codice. Quindi la prima e più semplice espansione è l'aggiunta di due potenziometri che impostino le temperature di comfort, così da poter utilizzare il dispositivo senza doverlo riprogrammare.
  • Per gli appassionati di controlli automatici, non è difficile inserire un ciclo di isteresi (data una temperatura di soglia, far si che accensione e spegnimento siano leggermente spostate sopra e sotto di essa). Questo è ciò che avviene nella pratica quotidiana, per prolungare la vita media dei dispositivi ed evitare che un impianto di riscaldamento (a una temperatura pari a quella di soglia) si accenda e spenga in continuazione.

Note modifica

  1. Non si pensi al costo del singolo componente (un led costa davvero poco, meno di un centesimo) ma una volta inserito in un circuito, dissaldarlo e sostituirlo non è affatto economico, in particolare se il componente è molto piccolo.
  2. Si noti che questi possono essere visualizzati anche sotto forma di grafico.
  3. Anche in questo caso è bene ricordare che si è utilizzato un tempo pari a   per non appesantire troppo l'attesa. In una situazione domestica si esegue una lettura ogni due minuti per via dell'inerzia termica.