Skip to content
logo9minuti120x48
Menu
  • Home
  • Tutorial
    • Zaini
    • Stampa 3d
    • ebook
    • Informatica
  • Scritti
    • Racconti
    • Articoli
    • Temi
    • Storia
  • Video
  • Progetti
    • Progetto Carcere
    • Progetto Istruzione
    • Progetto Acque pulite
    • Progetto Tecnologia
  • Chi siamo
    • LinkTree
  • Privacy Policy
    • Cookie Policy (EU)
  • Blog
  • Donazioni
Menu
dht 11 e arduino

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

Posted on 24 Maggio 20189 Novembre 2019 by Alessandro Oppo

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

Dammi un 5 virtuale, clicca like e condividi.

  • Fai clic qui per condividere su LinkedIn (Si apre in una nuova finestra)
  • Fai clic per condividere su Facebook (Si apre in una nuova finestra)
  • Fai clic qui per condividere su Twitter (Si apre in una nuova finestra)
  • Fai clic qui per condividere su Reddit (Si apre in una nuova finestra)
  • Fai clic per condividere su WhatsApp (Si apre in una nuova finestra)
  • Fai clic per condividere su Telegram (Si apre in una nuova finestra)
  • Fai clic per inviare un link a un amico via e-mail (Si apre in una nuova finestra)

Related

Cosa ne pensi? Fammelo sapere con un messaggio Annulla risposta

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

Scoprici sui social

  • YouTube
  • Telegram
  • Facebook
  • RSS Feed

    Ultimi post

    • Buzzurretto e la scuola – Racconto breve
    • Il mio punto di vista sul progetto scuola
    • Di nuovo nuvole – Racconto breve
    • L’intelligenza artificiale, la forza della logica e la morale – ChatGPT
    • Videogrep, how to extract a certain word from a video (or more)
    • Brucerò tutto non appena è stato scritto – Racconto breve
    • C’è del lavoro da fare – Racconto breve

    Newsletter

    ©2023 9minuti | Design: Newspaperly WordPress Theme
    Manage Cookie Consent
    Usiamo cookie per ottimizzare il nostro sito web ed i nostri servizi.
    Cookie funzionali Sempre attivo
    The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
    Preferences
    The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
    Statistics
    The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
    Marketing
    The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.
    Gestisci opzioni Gestisci servizi Gestisci fornitori Per saperne di più su questi scopi
    Visualizza preference
    {title} {title} {title}
     

    Caricamento commenti...