Hướng dẫn dùng cảm biến DHT11/DHT22 với ESP32 (Nhiệt độ & Độ ẩm)

Trong bài này, bạn sẽ học cách kết nối cảm biến DHT11 hoặc DHT22 với ESP32 để đọc nhiệt độ và độ ẩm bằng Arduino IDE. Đây là cảm biến rất phổ biến trong các dự án IoT, giám sát môi trường, và nhà thông minh.
DHT11 vs DHT22 — Khác nhau ở đâu?

| Thông số | DHT11 | DHT22 |
|---|---|---|
| Dải nhiệt độ | 0 – 50°C | -40 – 80°C |
| Độ chính xác nhiệt độ | ±2°C | ±0.5°C |
| Dải độ ẩm | 20 – 80% | 0 – 100% |
| Độ chính xác độ ẩm | ±5% | ±2–5% |
| Chu kỳ lấy mẫu | 1 lần/giây | 0.5 lần/giây |
| Giá thành | Rẻ hơn | Đắt hơn |
➡️ Chọn DHT22 nếu cần độ chính xác cao. Chọn DHT11 nếu cần tiết kiệm chi phí cho dự án đơn giản.
Sơ đồ chân (Pinout)
DHT11
DHT22
DHT22 chi tiết
Cả DHT11 và DHT22 đều có 3 chân hoạt động: VCC (3.3V–5V), Data, và GND. Chân Data cần điện trở kéo lên (pull-up) 10kΩ về VCC.
Sơ đồ kết nối với ESP32

| DHT11/DHT22 | ESP32 |
|---|---|
| VCC | 3.3V |
| Data | GPIO 4 (kèm 10kΩ pull-up về 3.3V) |
| GND | GND |
Cài thư viện

Vào Arduino IDE → Sketch → Include Library → Manage Libraries, cài 2 thư viện:
- DHT sensor library by Adafruit
- Adafruit Unified Sensor by Adafruit
Code Arduino – Đọc nhiệt độ và độ ẩm
Nếu dùng DHT22, đổi dòng #define DHTTYPE DHT11 thành #define DHTTYPE DHT22. Nếu dùng chân khác GPIO 4, thay đổi #define DHTPIN 4.
// Example testing sketch for various DHT humidity/temperature sensors written by ladyada
// REQUIRES the following Arduino libraries:
// - DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
// - Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
#include "DHT.h"
#define DHTPIN 4 // Digital pin connected to the DHT sensor
// Feather HUZZAH ESP8266 note: use pins 3, 4, 5, 12, 13 or 14 --
// Pin 15 can work but DHT must be disconnected during program upload.
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println(F("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 (the default)
float t = dht.readTemperature();
// Read temperature as Fahrenheit (isFahrenheit = true)
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(F("Failed to read from DHT sensor!"));
return;
}
// 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);
Serial.print(F("Humidity: "));
Serial.print(h);
Serial.print(F("% Temperature: "));
Serial.print(t);
Serial.print(F("°C "));
Serial.print(f);
Serial.print(F("°F Heat index: "));
Serial.print(hic);
Serial.print(F("°C "));
Serial.print(hif);
Serial.println(F("°F"));
}
Kết quả trên Serial Monitor

Mở Serial Monitor ở 115200 baud. Mỗi 2 giây sẽ in ra nhiệt độ (°C và °F) và độ ẩm (%). Nếu thấy "Failed to read from DHT sensor", kiểm tra lại kết nối dây và điện trở pull-up.
Xử lý lỗi thường gặp

- ❌ "Failed to read from DHT sensor!" → Kiểm tra kết nối dây, thêm điện trở pull-up 10kΩ, thay đổi GPIO pin
- ❌ "NaN" readings → Cảm biến bị lỗi hoặc nguồn không ổn định — thử cấp nguồn 5V thay vì 3.3V
- ❌ "Fatal error: Adafruit_Sensor.h" → Chưa cài thư viện Adafruit Unified Sensor
Ứng dụng thực tế
Sau khi đọc được nhiệt độ và độ ẩm, bạn có thể mở rộng dự án:
- 📊 Gửi dữ liệu lên web server / MQTT broker để theo dõi từ xa
- 📱 Hiển thị lên màn hình OLED hoặc LCD
- 🔔 Gửi cảnh báo qua Telegram khi nhiệt độ vượt ngưỡng
- 🌡️ Làm trạm thời tiết mini trong nhà
- 🤖 Kích hoạt relay bật/tắt điều hòa tự động
📖 Nguồn: Random Nerd Tutorials – ESP32 with DHT11/DHT22 Temperature and Humidity Sensor