Misurazione di temperatura e umidità con Arduino e il sensore DHT11

Iniziamo la trattazione della gestione dei sensori con Arduino con un componente molto facile da utilizzare, il sensore DHT11, grazie al quale stamperemo in output sul monitor seriale i dati di temperatura e umidità ambientale. Gli utilizzi del sensore non si limitano a quelli di una classica stazione meteo, ma spaziano dal semplice datalogger a sistemi di regolazione automatica (un sensore di temperatura può essere ad esempio utilizzato per migliorare la precisione di un sensore di prossimità) fino ad arrivare a sistemi di monitoraggio domestico e industriale più o meno complessi. Tutto ciò grazie al fatto che il sensore consente una connessione fino a 20 metri e di garantisce una certa precisione, oltre ad essere particolarmente economico. In questo articolo vedremo anche come utilizzare una libreria di classi già pronta per controllarlo (una libreria è appunto una raccolta di codice composto di funzioni e classi, riutilizzabile in più progetti).

Il sensore DHT11

Il DHT11 è un sensore digitale che si presenta composto da un involucro quadrangolare (di solito azzurro o bianco) e quattro piedini in uscita (di cui solo tre utili). Al suo interno si trovano:

  • un termistore NTC che ha lo scopo di misurare la temperatura tramite la variazione del valore di una resistenza; il suo acronimo sta per Negative Temperature Coefficient (coefficiente negativo di temperatura); in pratica il valore della resistenza diminuisce all’aumentare della temperatura, il cui range misurabile consentito va da 0° C a 50° C
  • una coppia di elettrodi per la rilevazione dell’umidità relativa (cioè la quantità di acqua presente nell’aria rispetto alla temperatura): tramite un substrato che trattiene l’umidità, si determina la resistenza tra di essi: minore è il valore della resistenza, maggiore sarà l’umidità relativa

Nel circuito di esempio utilizzeremo un sensore DHT11 già saldato a un circuito integrato (in gergo detto anche breakout board), che ne facilità l’utilizzo, dato che presenta i tre piedini utili alla connessione col sensore e contiene già una resistenza per le connessioni a una distanza inferiore a 20 metri:

Sensore di umidità e temperatura DHT11 su breakout board

Materiali e circuito di esempio

Per creare un prototipo di gestione del sensore DHT11 con Arduino, avremo bisogno di:

  • un sensore DHT11
  • 3 cavetti jumper di diverso colore
  • una breadboard
  • una scheda Arduino Uno
  • un cavo usb per collegare la scheda Arduino Uno al computer

Inseriamo quindi i tre piedini del DHT11 in tre fori al centro della breadboard. Nella foto sotto è possibile notare che il cavetto jumper rosso è stato collegato al pin digitale 8 di Arduino e al piedino più esterno a sinistra della brekout board del sensore, mentre il cavetto verde collega il piedino centrale al pin a 5 v di Arduino e, infine, il piedino a destra è stato connesso al pin GND di messa a terra.

Circuito di controllo sensore DHT11 con Arduino Uno

La libreria SimpleDHT11

Per concentrarci sulla logica del prototipo, utilizzeremo, come già anticipato, una libreria di classi già pronta all’uso, e cioè SimpleDHT, che tra l’altro gestisce anche il sensore DHT22. Affronteremo nel dettaglio tutto ciò che riguarda la programmazione a oggetti (OOP) con Arduino e la creazione di librerie in un prossimo articolo; nel frattempo possiamo familiarizzare con la terminologia di questo paradigma di sviluppo, notando che con il codice che importeremo potremo utilizzare un oggetto di tipo SimpleDHT11 che espone la funzione read che prende in ingresso tre parametri per riferimento:

  • ptemperature di tipo byte, in cui registrare i valori di temperatura letti dal sensore
  • phumidity di tipo byte, in cui registrare i valori di umidità letti dal sensore
  • pdata di tipo array di 5 elementi byte contenente i bit grezzi letti dal sensore

Provare a sfogliare il codice del repository appena linkato, sia quello della libreria che quello degli esempi, per cominciare a familiarizzare con i progetti open source.

Installazione della libreria

Per utilizzare la libreria basterà andare nel menu Sketch -> #include libreria -> Gestione librerie; si aprirà la finestra popup con un filtro di ricerca in cui inseriremo la chiave “SimpleDHT” come da screenshot:

Inclusione libreria SimpleDHT11 con il gestore librerie di Arduino Ide

In questa guida ho selezionato l’ultima versione inclusa nell’ide di Arduino 1.8.13, la 1.0.13. Al click sul tasto installa, la finestra si chiude, inserendo in cima allo sketch la seguente riga di codice:

#include <SimpleDHT.h>

che indica al compilatore di Arduino di includere il codice della libreria SimpleDHT11.

Lo sketch di esempio

In questo esempio ho deciso di rielaborare, semplificandolo, l’esempio creato dallo sviluppatore del repository per gestire anche eventuali errori del sensore e stampare in output alcuni dati sulla comunicazione tra Arduino e il DHT11. Vediamo subito il codice dello sketch:

#include <SimpleDHT.h>

#define DHT11_PIN 8

SimpleDHT11 dht11(DHT11_PIN);

void setup() {
  Serial.begin(9600);
}

void loop() {
  
  int contatore = 0;
  int contatoreErrori = 0;
  
  while (true) {
    contatore++;

    byte temperatura, umidita;
    
    int errore = dht11.read(&temperatura, &umidita, NULL);
    
    if (errore != SimpleDHTErrSuccess) {
      
      Serial.print("Errore durante la lettura del sensore DHT11: "); 
      
      Serial.print(SimpleDHTErrCode(errore));
      Serial.print(","); 
      Serial.print(SimpleDHTErrDuration(errore));
      
      contatoreErrori++;
      
    } 
    else {
      
      Serial.print("Temperatura: ");
      
      Serial.print((int)temperatura); 
      Serial.print("° C, ");

      Serial.print("umidità: ");
      Serial.print((int)umidita); 
      Serial.print("%");
    }
    
    Serial.print(", totale: "); 
    Serial.print(contatore);
    
    Serial.print(", errori: "); 
    Serial.print(contatoreErrori);

    float percentualeSuccesso = (contatore - contatoreErrori) * 100.0 / (float)contatore;
    
    Serial.print(", successo %: "); 
    Serial.print(percentualeSuccesso); 
    Serial.println("%");

    delay(1500);
  }
}

Viene subito definita la costante DHT11_PIN per gestire il pin digitale 8 di Arduino e, successivamente, si crea un oggetto di tipo SimpleDHT11 a cui viene passato il pin. Dopo aver inizializzato la comunicazione seriale nella funzione setup, vengono create in loop le variabili contatore e contatoreErrori con cui terremo traccia del numero di letture effettuate e del numero di errori verificatisi durante la lettura del sensore. Viene avviato quindi un ciclo while infinito (dato che passiamo come condizione True senza alcun altra istruzione di fine ciclo) addizionando un’unità alla variabile contatore ad ogni iterazione.

Dopo aver dichiarato le variabili temperatura e umidita, le passiamo per riferimento al metodo read dell’oggetto dht11. La funzione read restituisce in output un intero che possiamo utilizzare per capire se la lettura è andata a buon fine. Infatti, alla riga 43 del file SimpleDHT.h della libreria si trova la seguente dichiarazione:

// Success.
#define SimpleDHTErrSuccess 0

Se quindi il valore della variabile errore è uguale a SimpleDHTErrSuccess, la lettura è avvenuta correttamente e, quindi, si può procedere a stampare sul monitor seriale i valori di umidità e temperatura; altrimenti, passando agli oggetti di tipo SimpleDHTErrCode e SimpleDHTErrDuration il valore di errore, è possibile conoscere il tipo di errore avvenuto e la durata.

Alla fine del ciclo, otteniamo con una semplice espressione la percentuale di successo nel complesso totale delle letture.

Conclusione

In questo articolo abbiamo visto come controllare il sensore di umidtà e temperatura DHT11 con Arduino. Abbiamo descritto brevemente le caratteristiche del sensore e abbiamo approfittato del progetto di esempio per verificare come sia facile l’utilizzo di librerie di terze parti che affrontano tutti i dettagli di basso livello per la comunicazione con sensori e altro hardware. Abbiamo anche cominciato a familiarizzare con classi e oggetti che saranno oggetto di trattazione approfondita in un prossimo articolo.

Lascia un commento

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

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.