5. DHT11/DHT22
Ghid complet pentru Senzor de umiditate și temperatură DHT11/DHT22 cu Arduino
Acest articol este un ghid pentru senzorii populari de temperatură și umiditate DHT11 și DHT22 cu Arduino. Vom explica cum funcționează, arată câteva dintre caracteristicile sale și prezintă un exemplu de proiect Arduino pe care îl puteți modifica pentru a fi utilizat în proiectele proprii.
Pentru mai multe ghiduri despre alți senzori populari, verificați compilația a peste 60 de tutoriale și proiecte Arduino : 60+ Proiecte Arduino și Tutoriale.
Introducerea senzorilor DHT11 și DHT22
Senzorii DHT11 și DHT22 sunt utilizați pentru a măsura temperatura și umiditatea relativă. Acestea sunt foarte populare printre producătorii și pasionații de electronice.
Acești senzori conțin un cip care face conversia analogic-digitală și scoate un semnal digital cu temperatura și umiditatea. Acest lucru le face foarte ușor de utilizat cu orice microcontroler.
DHT11 vs DHT22
DHT11 și DHT22 sunt foarte asemănători, dar diferă în specificațiile lor. Următorul tabel compară unele dintre cele mai importante specificații ale senzorilor de temperatură și umiditate DHT11 și DHT22. Pentru o analiză mai aprofundată a acestor senzori, vă rugăm să verificați foaia de date a senzorilor.
DHT11
DHT22
Interval de temperatură
Intervalul de umiditate
Rezoluţie
Tensiune de lucru
Alimentare curent
Perioada de eșantionare
Preț
Pentru cumpărare
0 până la 50°C +/- 2°C
20 până la 90% +/- 5%
Umiditate: 1%
Temperatura: 1ºC
3 - 5,5 V DC
0,5 - 2,5 mA
1 secundă
$ 1 până la $ 5
-40 la 80ºC +/- 0,5ºC
0 până la 100%+/- 2%
Umiditate: 0,1%
Temperatura: 0,1ºC
3 - 6 V DC
1 - 1,5 mA
2 secunde
$ 4 până la $ 10
Senzorul DHT22 are o rezoluție mai bună și o gamă mai mare de măsurare a temperaturii și umidității. Cu toate acestea, este un pic mai scump și puteți solicita citiri numai la interval de 2 secunde.
DHT11 are o gamă mai mică și este mai puțin precisă. Cu toate acestea, puteți solicita citirea senzorilor în fiecare secundă. Este, de asemenea, un pic mai ieftin.
În ciuda diferențelor lor, ele funcționează într-un mod similar și puteți utiliza același cod pentru a citi temperatura și umiditatea. Trebuie doar să selectați în cod tipul de senzor pe care îl utilizați.
Pinii DHT
Senzorii DHT au patru pini, după cum se arată în figura următoare. Totuși, dacă obțineți senzorul dvs. DHT într-un breakout bord, acesta vine cu doar trei pini și cu o rezistență pull-up internă pe PIN 2.
În tabelul următor se afișează pinii DHT22 și DHT11. Când senzorul este cu fața, numerotarea pinului începe la 1 de la stânga la dreapta.
pin DHT Conectați la
1 5V
2 Orice GPIO digital; de asemenea, conectați un rezistor pull-up de 10 kOhm
3 Nu se conectează
4 GND
Unde să cumpăr?
Puteți să consultați pagina "Instrumente de consultanță pentru producători" și să găsiți cel mai bun preț pentru aceste module:
Senzor de temperatură și umiditate DHT11cu Arduino
În această secțiune, vom construi un proiect simplu cu Arduino care citește temperatura și umiditatea și afișează rezultatele pe monitorul serial.
Piese necesare
Pentru a finaliza acest tutorial, aveți nevoie de următoarele componente:
Arduino UNO - citiți Best Arduino Starter Kits
Schema
Urmați următoarea diagramă schematică pentru a conecta senzorul de temperatură și umiditate DHT11 (sau DHT22) la Arduino.
Iată conexiunile (de la stânga la dreapta):
Pin DHT Arduino
Pin 1 5V
Pin 2 D2 sau oricare pin digital
Pin 3 nu conectați
Pin 4 GND
Notă: dacă utilizați un modul cu un senzor DHT, acesta este în mod normal disponibil doar cu trei pini. Pinii trebuie să fie etichetați astfel încât să știți cum să îi legați. În plus, multe dintre aceste module vin deja cu un rezistor pull-up intern, deci nu trebuie să adăugați unul la circuit.
Instalarea bibliotecilor
Pentru a citi de la senzorul DHT, vom folosi biblioteca DHT de la Adafruit. Pentru a utiliza această bibliotecă, trebuie să instalați și biblioteca Adafruit Unified Sensor. Urmați pașii următori pentru a instala acele biblioteci.
Deschideți Arduino IDE și mergeți la Sketch > Include Library > Manage Libraries . Managerul de bibliotecă trebuie să se deschidă.
Căutați "DHT" în caseta Search și instalați biblioteca DHT de la Adafruit.
După instalarea bibliotecii DHT de la Adafruit, tastați "Adafruit Unified Sensor" în caseta de căutare. Derulați până la capăt pentru a găsi biblioteca și a o instala.
După instalarea bibliotecilor, reporniți Arduino IDE.
Cod
După instalarea bibliotecilor necesare, puteți încărca un exemplu de cod din bibliotecă.
În Arduino IDE, accesați File > Examples > DHT Sensor library > DHTtester
Următorul cod trebuie încărcat. Citește temperatura și umiditatea și afișează rezultatele în Monitorul Serial.
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
#include "DHT.h"
#define DHTPIN 2 // what pin we're connected to
// Uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor for normal 16mhz Arduino
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println("DHTxx test!");
dht.begin();
}
void loop() {
// Wait a few seconds between measurements.
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();
// Read temperature as Fahrenheit
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Compute heat index
// Must send in temp in Fahrenheit!
float hi = dht.computeHeatIndex(f, h);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hi);
Serial.println(" *F");
}
Cum funcționează codul
Începeți prin includerea bibliotecii DHT :
#include "DHT.h"
Apoi, definiți pinul la care este conectat senzorul DHT. În acest caz este conectat la pinul digital 2.
#define DHTPIN 2 // what digital pin we're connected to
Apoi, trebuie să definiți tipul de senzor DHT pe care îl utilizați. În exemplul nostru folosim DHT11.
#define DHTTYPE DHT11 // DHT 11
Dacă utilizați un alt senzor DHT, trebuie să comentați linia anterioară și să dezactivați unul dintre următoarele:
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
Apoi, inițializați un obiect DHT numit dht cu PIN-ul și tipul definit anterior:
DHT dht(DHTPIN, DHTTYPE);
În setup (), inițializați Monitorul Serial la o rată de transfer de 9600 pentru depanare.
Serial.begin(9600);
Serial.println("DHTxx test!");
Inițializați senzorul DHT cu metoda .begin () .
dht.begin();
În bucla () , la început, există o întârziere de 2 secunde. Această întârziere este necesară pentru a acorda suficient timp senzorului pentru a citi. Rata maximă de eșantionare este de două secunde pentru DHT22 și o secundă pentru DHT11.
delay(2000);
Citirea temperaturii și a umidității este foarte simplă. Pentru a obține umiditate, trebuie doar să utilizați metoda readHumidity () pe obiectul dht. În acest caz, salvăm umiditatea în variabila h. Rețineți că metoda readHumidity () readuce o valoare de tip float.
float h = dht.readHumidity();
În mod similar, pentru a citi temperatura, utilizați metoda readTemperature ().
float t = dht.readTemperature();
Pentru a obține temperatura în grade Fahrenheit, doar treci true la metoda readTemperature () după cum urmează:
float f = dht.readTemperature(true);
Această bibliotecă vine și cu metode de calcul al indicelui de căldură în Fahrenheit și Celsius:
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
În final, toate citirile sunt afișate pe Monitorul Serial.
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
Demonstrație
După încărcarea codului în Arduino, deschideți monitorul serial la o rată de transfer de 9600. Trebuie să obțineți citirea senzorului la fiecare două secunde. Iată ce ar trebui să vedeți în monitorul serial Arduino IDE.
Depanare - Nu a putut citi de la senzorul DHT
Dacă încercați să citiți temperatura și umiditatea din senzorul DHT11/DHT22 și primiți un mesaj de eroare în monitorul dvs. serial, urmați pașii următori pentru a vedea dacă puteți face senzorul să funcționeze (sau citiți Ghidul dedicat pentru depanarea DHT).
"Nu a putut citi de la senzorul DHT!" sau citirea Nan
Dacă senzorul dvs. DHT returnează mesajul de eroare "Nu a putut citi de la senzorul DHT!" sau valorile DHT revin "Nan":
Încercați unul dintre următoarele sfaturi de depanare:
Cablare: atunci când construiți un proiect de electronică, trebuie să verificați de două ori atribuirea legăturii sau pinului. După verificarea și testarea faptului că circuitul dvs. este conectat corect, dacă tot nu funcționează, continuați să citiți următoarele sfaturi de depanare.
Puterea: senzorul DHT are un domeniu de funcționare de 3V până la 5,5V (DHT11) sau de la 3V la 6V (DHT22). Dacă alimentați senzorul de la un pin de 3,3V, în unele cazuri alimentarea DHT cu 5V rezolvă problema.
Port USB nepotrivit sau cablu USB: uneori alimentarea dispozitivului Arduino direct de la un port USB al PC-ului nu este suficientă. Încercați să conectați la un hub USB alimentat de o sursă externă de alimentare. Ar putea fi de ajutor înlocuirea cablului USB cu unul mai bun sau mai scurt. Având un port USB care furnizează suficientă energie sau utilizând un cablu USB bun, această problemă se rezolvă adesea.
Sursa de alimentare: după cum s-a menționat în sfatul anterior, Arduino ar putea să nu furnizeze suficientă putere pentru a citi corect de la senzorul DHT. În unele cazuri, este posibil să aveți nevoie să alimentați Arduino cu o sursă de alimentare care oferă mai mult curent.
Tipul senzorului: verificați dacă nu ați comandat în codul dvs. senzorul potrivit pentru proiectul dvs. În acest proiect, am folosit DHT22:
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
Rata de eșantionare: senzorul DHT este foarte lent pentru obținerea citirilor (citirea senzorului poate dura până la 2 secunde). În unele cazuri, creșterea timpului dintre citiri rezolvă problema.
Senzorul DHT este ars sau rupt: din păcate, acești senzori ieftini, uneori, arată foarte bine, dar sunt arși/rupți. Deci, chiar dacă ați asamblat circuitul și codul corect, acesta nu va reuși să obțină citirile. Încercați să utilizați un senzor diferit pentru a vedea dacă vă remediază problema.
Rata de transfer greșită sau nu ați reușit să încărcați codul: dacă nu vedeți nimic în dispozitivul serial Arduino IDE, verificați dacă ați selectat rata corectă de transfer, portul COM sau că ați încărcat codul cu succes.
În timp ce construim proiectele noastre, am întâlnit probleme similare cu DHT și a fost întotdeauna rezolvată urmând una din metodele descrise mai devreme.
Fatal error: Adafruit_Sensor.h: No such file or directory
Există, de asemenea, o eroare comună care se întâmplă atunci când încercați să compilați codul. Dacă primiți următoarea eroare:
fatal error: Adafruit_Sensor.h: No such file or directory
#include <Adafruit_Sensor.h>
Trebuie să instalați biblioteca driver Adafruit Unified Sensor. În Arduino IDE, tastați caseta de căutare "Adafruit Unified Sensor", derulați până jos pentru a găsi biblioteca și a o instala.
După instalarea bibliotecii, reporniți Arduino IDE și codul trebuie să fie compilat fără mesajul de eroare.
Sper că ați găsit acest ghid util. Alte ghiduri cu senzorul de temperatură și umiditate DHT11 / DHT22:
ESP8266 DHT11 / DHT22 Server de temperatură și umiditate Web - Arduino IDE
ESP32 cu DHT11 DHT22 Temperatura Umiditate Web Server - Arduino IDE
MicroPython: ESP32 / ESP8266 cu senzor de temperatură și umiditate DHT11 / DHT22
Dacă vă place Arduino, vă recomandăm, de asemenea, următoarele resurse: