Hướng dẫn kết nối cảm biến DHT11 với ESP32, đọc nhiệt độ và độ ẩm bằng Arduino IDE, in kết quả lên Serial Monitor và tối ưu chống lỗi đọc dữ liệu.
Mục lục
- Giới thiệu
- Nguyên lý DHT11
- Phần cứng cần chuẩn bị
- Sơ đồ kết nối
- Cài thư viện
- Mã nguồn ví dụ
- Giải thích mã
- Kết quả khi chạy
- Lỗi thường gặp & cách khắc phục
- Gợi ý mở rộng
1) Giới thiệu
DHT11 là cảm biến đo nhiệt độ (°C) và độ ẩm (%) phổ biến, giá rẻ. Kết hợp với ESP32, bạn có thể xây dựng các ứng dụng như trạm thời tiết mini, giám sát phòng, hay điều khiển quạt/humidifier theo ngưỡng.
2) Nguyên lý DHT11
- Giao tiếp 1-Wire (một dây dữ liệu).
- Chu kỳ đọc khuyến nghị: ≥1 giây/lần.
- Độ chính xác cơ bản: ±2–5% RH, ±2°C (tham khảo).
- Biến thể DHT22/AM2302 chính xác và dải đo rộng hơn (cùng cách dùng).
3) Phần cứng cần chuẩn bị
| Linh kiện | Số lượng | Ghi chú |
| ESP32 DevKit V1 (38 pin) | 1 | Board chính |
| Cảm biến DHT11 (module 3 chân hoặc sensor rời 4 chân) | 1 | Nên dùng module có sẵn điện trở kéo lên |
| Dây nối | Vài sợi | |
| Breadboard | 1 | (khuyến nghị) |
Ghi chú:
- Nếu dùng DHT11 rời (4 chân), thêm điện trở 10kΩ kéo DATA → 3.3V.
- Nếu dùng module DHT11 3 chân, đã tích hợp sẵn điện trở kéo lên.
4) Sơ đồ kết nối (Connection Diagram)

Nối chân
- DHT11 VCC → 3V3 của ESP32
- DHT11 GND → GND của ESP32
- DHT11 DATA → GPIO4 của ESP32
- (Nếu là sensor rời 4 chân) 10kΩ kéo DATA ↔ 3V3
Gợi ý chân Data khác có thể dùng: GPIO 5, 15, 16, 17…
5) Cài thư viện
Mở Arduino IDE → Tools → Manage Libraries… tìm và cài:
- DHT sensor library (by Adafruit)
- Adafruit Unified Sensor
6) Mã nguồn ví dụ
#include <Arduino.h>
#include <DHT.h>
#define DHTPIN 4 // Chân DATA của DHT11 nối GPIO4
#define DHTTYPE DHT11 // Nếu dùng DHT22: đổi thành DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
delay(500);
Serial.println(F("ESP32 - Đọc nhiệt độ & độ ẩm từ DHT11"));
dht.begin();
}
void loop() {
// DHT11 cần ~1-2 giây giữa các lần đọc
float h = dht.readHumidity();
float t = dht.readTemperature(); // °C
float f = dht.readTemperature(true); // °F
// Kiểm tra lỗi đọc
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(F("❌ Không đọc được từ cảm biến DHT!"));
delay(2000);
return;
}
// Tính heat index (chỉ số nóng bức)
float hif = dht.computeHeatIndex(f, h); // °F
float hic = (hif - 32) * 5.0 / 9.0; // đổi sang °C
Serial.print(F("Độ ẩm: ")); Serial.print(h); Serial.print(F("%"));
Serial.print(F(" | Nhiệt độ: ")); Serial.print(t); Serial.print(F("°C"));
Serial.print(F(" | Heat Index: ")); Serial.print(hic); Serial.println(F("°C"));
delay(2000);
}
7) Giải thích mã
- DHT
dht(DHTPIN, DHTTYPE);khởi tạo đối tượng DHT với chân DATA và loại cảm biến. dht.readHumidity()/dht.readTemperature(): trả về số thực (float).isnan()kiểm tra lỗi đọc (DHT khá “khó tính” về thời gian).computeHeatIndex()tính nhiệt độ cảm nhận (Heat Index) dựa trên T & RH.delay(2000)đảm bảo chu kỳ đọc ổn định cho DHT11.
8) Kết quả khi chạy
Trên Serial Monitor (115200), bạn sẽ thấy dạng:
ESP32 - Đọc nhiệt độ & độ ẩm từ DHT11
Độ ẩm: 63.00% | Nhiệt độ: 29.30°C | Heat Index: 31.12°C
Độ ẩm: 62.80% | Nhiệt độ: 29.40°C | Heat Index: 31.16°C
...
9) Lỗi thường gặp & cách khắc phục
- Serial báo “Không đọc được từ cảm biến”
→ Kiểm tra dây DATA, thay chân GPIO; tăng delay lên 2000–2500ms. - Cấp sai điện áp (nhầm 5V)
→ DHT11 hoạt động với 3.3V–5V, nhưng ESP32 logic 3.3V – ưu tiên 3V3. - Không có điện trở kéo lên (khi dùng sensor rời)
→ Thêm 10kΩ kéo DATA → 3V3. - Dây quá dài, nhiễu
→ Dùng dây ngắn hơn, hoặc thêm tụ lọc (100nF) gần cảm biến.
10) Gợi ý mở rộng
- Gửi dữ liệu lên MQTT/Web Server/Google Sheet.
- Lưu log ra SD Card hoặc SPIFFS/LittleFS.
- Thêm OLED hiển thị trực tiếp nhiệt độ/độ ẩm.
- Đặt ngưỡng cảnh báo (ví dụ RH > 80% bật quạt).
- Chuyển sang DHT22 để có độ chính xác và dải đo tốt hơn.


Để lại một bình luận