Categories: Arduino

Sensore di umidità e temperatura KY-015 / DHT11 con Arduino

Buongiorno, oggi vedremo insieme come utilizzare il sensore di umidità e temperatura DHT11 con un micocontrollore Arduino. Si tratta di un sensore molto comune nei kit e, se utilizzata la giusta libreria, anche molto semplice da usare. Il sensore resituisce un numero intero, quindi nè la temperatura nè l’umidità avranno cifre decimali. Se dovesse interessare una precisione maggiore esiste il sensore DHT21 che invece restituisce valori di tipo float. Per affrofondimenti vi invito a visitare il playground di Arduino.

Arduino Nano e KY-015

Utilizzeremo:

  • Arduino Uno (o modello analogo, io nell’esempio utilizzo un Arduino Nano che è uguale nelle funzionalità ma occupa meno spazio)
  • sensore KY-015 o DHT11 (il primo è montato su un pcb e ha già una resistenza, il secondo è ‘nudo’ e la resistenza la dobbiamo mettere noi.) Nell’esempio utilizzerò il KY-015
  • resistenza da 10k ohm nel caso si usi il sensore DHT11 ‘nudo’
  • libreria dht11 scaricabile da qui oppure dal gestore librerie di arduino

Di seguito lo schema di collegamento in entrambi i casi.

KY-015
DHT11 ‘nudo’
/*
codice scritto da Alessandro Oppo per 9minuti.it sulla base degli esempi pubblicati da Rob Tillaart, creatore della libreria.
*/#include <dht.h>
#define DHT11_PIN 5

dht DHT;
int umidita;
int temperatura;

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

void loop()
{
  DHT.read11(DHT11_PIN);
  
  umidita = DHT.humidity;
  temperatura = DHT.temperature;
  
  Serial.print("Umidità: ");
  Serial.println(umidita);
  Serial.print("Temperatura: ");
  Serial.println(temperatura);
  Serial.println();

  delay(2000);
}

Analizziamo il codice scritto.
1 includiamo la libreria dht.h di Rob Tillaart
2 indichiamo il pin digitale a cui attaccheremo il sensore tramite una #define
4 creazione di un oggetto DHT di tipo dht. Se ad esempio volessimo utilizzare due sensori di temperatura dovremmo scrivere:
dht sensore1;
dht sensore2;
5, 6 dichiarazione di due variabili intere in cui salveremo i valori
10 inizializziamo della porta seriale con un baud rate di 9600
15 chiamiamo il metodo read11 appartenente all’oggetto DHT, come parametro mettiamo il numero del pin digitale
17, 18 salviamo i valori di umidità e temperatura prendendoli dalle proprietà dell’oggetto DHT (humidity e temperature)
20-24 stampa dei valori ricavati
26 attesa di 2000 ms (2 secondi) prima di tornare all’inizio del loop

Faccio notare che se avessimo scritto
Serial.println(DHT.temperature);
avremmo potuto stampare direttamente la temperatura, ho però preferito salvare tutto in una variabile esterna per sottolineare la differenza fra proprietà di un oggetto e variabile normale.

Serial Monitor del primo esempio

Vediamo ora un altro esempio, ovvero lo sketch dht11_test trovabile nella libreria di Rob Tillaart. Questo sketch è particolarmente utile nel qual caso dovessero esserci dei problemi, infatti ha uno scopo di tipo diagnostico oltre che esemplificativo. Commenterò solamente i passaggi diversi.

//
//    FILE: dht11_test.ino
//  AUTHOR: Rob Tillaart
// VERSION: 0.1.01
// PURPOSE: DHT library test sketch for DHT11 && Arduino
//     URL:
//
// Released to the public domain
//

#include <dht.h>

dht DHT;

#define DHT11_PIN 5

void setup()
{
  Serial.begin(9600);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT_LIB_VERSION);
  Serial.println();
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}

void loop()
{
  // READ DATA
  Serial.print("DHT11, \t");
  int chk = DHT.read11(DHT11_PIN);
  switch (chk)
  {
    case DHTLIB_OK:  
    Serial.print("OK,\t"); 
    break;
    case DHTLIB_ERROR_CHECKSUM: 
    Serial.print("Checksum error,\t"); 
    break;
    case DHTLIB_ERROR_TIMEOUT: 
    Serial.print("Time out error,\t"); 
    break;
    case DHTLIB_ERROR_CONNECT:
        Serial.print("Connect error,\t");
        break;
    case DHTLIB_ERROR_ACK_L:
        Serial.print("Ack Low error,\t");
        break;
    case DHTLIB_ERROR_ACK_H:
        Serial.print("Ack High error,\t");
        break;
    default: 
    Serial.print("Unknown error,\t"); 
    break;
  }
  // DISPLAY DATA
  Serial.print(DHT.humidity, 1);
  Serial.print(",\t");
  Serial.println(DHT.temperature, 1);

  delay(2000);
}
//
// END OF FILE
//

21-25 stampa a schermo, da notare che il codice eseguito nella funzione setup viene eseuito una sola volta, all’avvio.
23 DHT_LIB_VERSION è una proprietà della libreria in cui è salvato la versione della stessa
25 \t è il comando per tabulare
32 chiamata del metodo read11() dell’oggetto DHT, il metodo restituisce come return un intero salvato all’interno della variabile chk.
33-56 costrutto di tipo switch case, a seconda del valore della variabile chk il programma eseguirà il codice contenuto tra un case e il proprio break. Se ad esempio la variabile contenesse DHTLIB_OK, il codice eseguito sarebbe Serial.print(“OK,\t”). Il break interromperebbe il costrutto switch e il codice riprenderebbe dalla riga 57. Come avrete notato i case in questo caso non sono numeri interi ma insiemi di caratteri, questo perchè l’autore della libreria ha dichiarato una #define assegnando un valore intero ad una parola, esattamente come abbiamo fatto noi per la dichiarazione del pin del sensore alla riga 2 dell’esempio precedente.
58-60 stampa dei valori, da notare il secondo parametro nella funzione Serial.print. Mi riferisco all’1, il quale segna la precisione dei numeri decimali, in questo caso, ovviamente, uno. Se noi provassimo a mettere 2 avremmo una precisione a doppia cifra, ma, come abbiamo visto prima, il sensore DHT11 restituisce un valore intero.

Serial Monitor del secondo esempio

Se qualcosa non dovesse essere chiaro, se aveste suggerimenti o critiche, vi pregherei di indicarmelo nei commenti.

Grazie mille,
Alessandro

Alessandro Oppo

Alessandro è un milanese che vorrebbe scappare da Milano, è appassionato di informatica ma vorrebbe vivere senza telefono, è un artigiano eppure vorrebbe robotizzare tutto, impara una cosa e già vorrebbe studiare dell’altro. Autodidatta da sempre, gli piace sbattere la testa finché tutto non funziona come vuole lui, spesso ci riesce anche! Visita il suo blog personale alexoppo.com Il motto che si ripete dentro la testa è: “Se ci sono riusciti gli altri ci posso riuscire anche io”.

Recent Posts

Ponti sospesi: cosa abbiamo sbagliato? cosa si potrebbe fare?

Poco prima di Natale ho avuto la fortuna di poter partecipare a un evento chiamato…

4 mesi ago

Siamo quel che facciamo? – racconto breve

Armando quel giorno era particolarmente stanco. Tutto, per quanto andasse bene, sembrava metterlo sotto pressione.…

9 mesi ago

Il limite è sempre la mente – Racconto breve

Armando guardò l’orologio e vide il proprio riflesso sul quadrante bianco. Il riflesso però non…

10 mesi ago

L’ultimo giorno del carcere – Racconto breve

I muri sono muri, lo sono sempre, anche quando le porte sono aperte. Era la…

10 mesi ago

Riflessioni sul carcere

Pochi di noi riflettono sull’esistenza nella nostra società del carcere. Il carcere è la concretizzazione…

12 mesi ago

Come dovremmo dialogare secondo me

Spesso intraprendiamo delle conversazioni e delle chiacchierate piuttosto inconsapevolmente. Voglio dire che non siamo molto…

12 mesi ago