DHT11 và DHT22 - đo nhiệt độ, độ ẩm với ESP32 từ A đến Z

So sánh DHT11 vs DHT22, sơ đồ đấu nối ESP32, code mẫu với thư viện DHT và cách xử lý lỗi đọc NaN - cảm biến môi trường nhập môn cho dự án IoT. Trong bài viết này, chúng ta sẽ cùng tìm hiểu chi tiết và ứng dụng thực tế trong robot.
DHT11 và DHT22 là gì?
DHT11 và DHT22 (còn gọi AM2302) là hai cảm biến đo nhiệt độ và độ ẩm không khí phổ biến nhất trong các dự án Arduino/ESP32. Cả hai tích hợp cảm biến độ ẩm điện dung, nhiệt điện trở và một chip nhỏ chuyển kết quả thành tín hiệu số gửi qua một dây dữ liệu duy nhất — vì vậy còn được xếp vào nhóm giao thức "1-wire" (không phải chuẩn 1-Wire của Dallas).
Với robot và IoT giáo dục, đây là cảm biến môi trường nhập môn tiêu chuẩn: trạm thời tiết mini, giám sát nhà kính, robot báo nhiệt độ phòng đều bắt đầu từ đây.
DHT11 vs DHT22 - chọn con nào?
| Thông số | DHT11 | DHT22 (AM2302) |
|---|---|---|
| Dải nhiệt độ | 0 đến 50°C | -40 đến 80°C |
| Sai số nhiệt độ | ±2°C | ±0.5°C |
| Dải độ ẩm | 20-80% | 0-100% |
| Sai số độ ẩm | ±5% | ±2-5% |
| Tần suất đọc tối đa | 1 lần/giây | 1 lần/2 giây |
| Điện áp | 3-5.5V | 3.3-6V |
| Giá tham khảo | 15.000-25.000 đ | 45.000-70.000 đ |
Kết luận: DHT11 đủ cho học tập và demo (sai ±2°C không thành vấn đề khi học code); DHT22 cho dự án cần số liệu tin được — nhà kính, trạm thời tiết, nghiên cứu khoa học kỹ thuật của học sinh. Chênh lệch ~40.000 đ đáng giá khi dữ liệu quan trọng.
Đấu nối với ESP32
Cảm biến có 2 dạng: loại trần 4 chân và loại module 3 chân (đã gắn sẵn điện trở kéo).
| Chân cảm biến | Nối với | Ghi chú |
|---|---|---|
| VCC (chân 1) | 3V3 của ESP32 | Chạy 3.3V để tín hiệu an toàn cho GPIO |
| DATA (chân 2) | GPIO 4 | Kèm điện trở kéo lên 10kΩ giữa DATA và VCC |
| NC (chân 3, loại trần) | Không nối | |
| GND (chân 4) | GND |
Loại module 3 chân đã có sẵn điện trở kéo — nối thẳng VCC, DATA, GND là chạy. Loại trần 4 chân bắt buộc thêm điện trở 10kΩ kéo DATA lên VCC, thiếu nó là đọc lỗi chập chờn.
Code mẫu với thư viện DHT
Cài thư viện: Arduino IDE - Library Manager - tìm "DHT sensor library" của Adafruit (kèm Adafruit Unified Sensor).
#include "DHT.h"
#define DHTPIN 4
#define DHTTYPE DHT22 // đổi thành DHT11 nếu dùng DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
}
void loop() {
delay(2000); // DHT22 cần tối thiểu 2 giây giữa 2 lần đọc
float humidity = dht.readHumidity();
float tempC = dht.readTemperature();
if (isnan(humidity) || isnan(tempC)) {
Serial.println("Loi doc cam bien DHT!");
return;
}
// chỉ số cảm nhận nhiệt (heat index)
float heatIndex = dht.computeHeatIndex(tempC, humidity, false);
Serial.print("Nhiet do: ");
Serial.print(tempC);
Serial.print(" C | Do am: ");
Serial.print(humidity);
Serial.print(" % | Cam giac nhu: ");
Serial.print(heatIndex);
Serial.println(" C");
}Điểm cần nhớ trong code:
- Bắt buộc delay tối thiểu 2000 ms giữa hai lần đọc DHT22 (1000 ms với DHT11) — đọc dày hơn là nhận NaN
- Luôn kiểm tra isnan trước khi dùng giá trị — mất kết nối tạm thời là chuyện thường
readTemperature()trả độ C mặc định; truyềntrueđể lấy độ F
Lỗi thường gặp và cách sửa
Đọc ra NaN liên tục
Theo thứ tự xác suất: thiếu điện trở kéo 10kΩ (loại trần); sai chân DATA trong code; khai báo sai DHTTYPE (cắm DHT22 nhưng khai DHT11); dây quá dài (trên 2 m cần hạ điện trở kéo xuống 4.7kΩ); cảm biến hỏng do hàng kém chất lượng — thử con khác.
Đọc được nhưng thỉnh thoảng NaN
Bình thường nếu tần suất thấp (dưới 5%) — cứ bỏ qua lần lỗi và giữ giá trị cũ. Nếu dày hơn: nguồn nhiễu (thêm tụ 100nF sát chân VCC-GND), hoặc đọc quá dày (kiểm tra lại delay).
Số liệu đứng im không đổi
DHT là cảm biến chậm — độ ẩm cần hàng chục giây để phản ánh thay đổi môi trường. Thổi hơi thở vào cảm biến: độ ẩm phải vọt lên trên 90% trong vài giây; không nhúc nhích nghĩa là cảm biến chết.
Nhiệt độ cao hơn thực tế 2-3 độ
Cảm biến đặt gần nguồn nhiệt: sát bo ESP32 (chip tỏa nhiệt), trong hộp kín không thông gió, hoặc dưới nắng trực tiếp. Đưa cảm biến ra xa bo mạch ít nhất 5 cm và che nắng nhưng thoáng khí.
Ứng dụng trong dự án học tập
- Trạm thời tiết WiFi: ESP32 + DHT22 + BMP280, đẩy số liệu lên dashboard MQTT — dự án IoT kinh điển, xem bài MQTT nhập môn ở mục Kiến thức
- Nhà kính thông minh: đọc nhiệt độ độ ẩm, tự bật quạt qua relay khi vượt ngưỡng — bài học điều khiển vòng kín đầu tiên
- Robot môi trường: xe robot mang DHT22 đo và vẽ bản đồ nhiệt độ các phòng
- Nghiên cứu KHKT: ghi log nhiệt ẩm ra thẻ SD phục vụ đề tài thi khoa học kỹ thuật của học sinh
Cảm biến thay thế khi cần hơn
| Cảm biến | Ưu điểm so với DHT | Giá tham khảo |
|---|---|---|
| SHT31 | I2C, sai số ±0.3°C, đọc nhanh | 90.000-130.000 đ |
| BME280 | I2C, thêm áp suất, rất được ưa trong IoT | 100.000-150.000 đ |
| DS18B20 | Chỉ nhiệt độ, chống nước, dây dài 1-3 m | 25.000-45.000 đ |
Khi dự án lớn dần, nhóm cảm biến I2C (SHT31, BME280) tiện hơn hẳn: đọc nhanh, không kén thời gian, mắc chung bus với các cảm biến khác chỉ bằng 2 dây.
Câu hỏi thường gặp
DHT11 có đo được nhiệt độ âm không?
Không — dải đo của DHT11 bắt đầu từ 0°C. Đo tủ lạnh, tủ đông hay thời tiết miền núi mùa đông cần DHT22 (xuống -40°C) hoặc DS18B20 (-55°C).
Một chân GPIO đọc được mấy con DHT?
Mỗi con DHT cần một chân GPIO riêng — giao thức của nó không hỗ trợ nhiều thiết bị chung dây như I2C. Cần nhiều điểm đo thì dùng nhiều chân, hoặc chuyển sang DS18B20 (chuẩn 1-Wire thật, mắc song song hàng chục con trên 1 dây).
DHT22 dùng ngoài trời được không?
Được với điều kiện che mưa và nắng trực tiếp nhưng thoáng gió — chuẩn khí tượng gọi là lồng Stevenson, tự chế bằng chồng đĩa nhựa úp ngược. Cắm mưa cắm nắng trực tiếp thì cảm biến chết trong vài tuần.
Vì sao hai con DHT22 đặt cạnh nhau đọc lệch nhau?
Sai số ±0.5°C mỗi con nghĩa là hai con lệch nhau đến 1°C vẫn trong chuẩn. Muốn số liệu thống nhất giữa nhiều điểm đo, hiệu chuẩn phần mềm: đặt tất cả cạnh nhau 1 giờ, tính độ lệch từng con so với trung bình rồi trừ hao trong code.
Tài nguyên tải về
Tải bản PDF của bài viết để in giáo án hoặc gửi trước cho học viên.



