Trong bài này, chúng ta làm quen với cảm biến DHT11 – một trong những cảm biến nhiệt độ/độ ẩm phổ biến nhất cho người mới bắt đầu.
Bạn sẽ học cách đọc dữ liệu từ DHT11 bằng ESP32 và gửi dữ liệu realtime lên IoTLabs Cloud qua MQTT.
⚠️ Lưu ý: DHT11 không phải I2C, nhưng được đưa vào Level 2 để:
- So sánh với các cảm biến I2C chất lượng cao hơn (AHT20, SHT31)
- Hiểu rõ giới hạn của cảm biến “rẻ – dễ dùng”
1. Giới thiệu nhanh về DHT11
- Đo nhiệt độ và độ ẩm
- Giao tiếp Digital (1-wire riêng của DHT)
- Giá rẻ, dễ mua
- Thư viện phổ biến, dễ dùng
Thông số cơ bản
| Thông số | DHT11 |
|---|---|
| Nhiệt độ | 0–50°C |
| Độ ẩm | 20–90% |
| Sai số | Cao |
| Tốc độ đọc | Chậm (≥1s/lần) |
📌 DHT11 phù hợp học tập, demo – không phù hợp đo chính xác lâu dài.
2. Chuẩn bị
Phần cứng
- ESP32-C3 SuperMini
- Cảm biến DHT11 (module hoặc chân rời)
- Điện trở kéo lên 10kΩ (nếu dùng DHT11 rời)
Kết nối
| DHT11 | ESP32-C3 |
|---|---|
| VCC | 3.3V |
| DATA | GPIO4 |
| GND | GND |
3. Thư viện sử dụng
Cài thư viện:
- DHT sensor library (Adafruit)
- Adafruit Unified Sensor
4. Ví dụ 1 — Đọc DHT11 local (Serial)
Code mẫu
#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
}
void loop() {
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Failed to read DHT11");
delay(2000);
return;
}
Serial.print("Temp: ");
Serial.print(temperature);
Serial.print(" °C | Humidity: ");
Serial.print(humidity);
Serial.println(" %");
delay(2000);
}
📌 DHT11 không nên đọc nhanh hơn 1–2 giây.
5. Chuẩn dữ liệu gửi IoTLabs Cloud
Payload JSON thống nhất toàn series:
{
"ts": 1760000000,
"metrics": {
"temperature": 28,
"humidity": 65
}
}
6. Ví dụ 2 — Gửi dữ liệu DHT11 realtime qua MQTT
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// ===== CONFIG =====
const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_PASS";
const char* MQTT_HOST = "mqtt.iotlabs.vn";
const int MQTT_PORT = 8883;
const char* MQTT_USER = "YOUR_MQTT_USER";
const char* MQTT_PASS = "YOUR_MQTT_PASS";
const char* MQTT_TOPIC =
"iotlabs/<orgId>/devices/<deviceId>/telemetry";
WiFiClientSecure net;
PubSubClient mqtt(net);
unsigned long lastSend = 0;
void connectWiFi() {
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) delay(500);
}
void connectMQTT() {
net.setInsecure();
mqtt.setServer(MQTT_HOST, MQTT_PORT);
while (!mqtt.connected()) {
mqtt.connect("esp32c3-dht11", MQTT_USER, MQTT_PASS);
delay(1000);
}
}
void setup() {
Serial.begin(115200);
dht.begin();
connectWiFi();
connectMQTT();
}
void loop() {
if (!mqtt.connected()) connectMQTT();
mqtt.loop();
if (millis() - lastSend > 5000) {
lastSend = millis();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) return;
long ts = millis() / 1000;
String payload = "{";
payload += "\"ts\":" + String(ts) + ",";
payload += "\"metrics\":{";
payload += "\"temperature\":" + String(t, 1) + ",";
payload += "\"humidity\":" + String(h, 1);
payload += "}}";
mqtt.publish(MQTT_TOPIC, payload.c_str());
Serial.println(payload);
}
}
7. Ứng dụng thực tế
- Theo dõi nhiệt độ phòng
- Demo trạm thời tiết
- Học cấu trúc payload đa metric
- So sánh với DHT22 / AHT20 / SHT31
8. DHT11 vs các cảm biến Level 2 tiếp theo
| Cảm biến | Giao tiếp | Độ chính xác | Nên dùng |
|---|---|---|---|
| DHT11 | Digital | Thấp | Học tập |
| DHT22 | Digital | Trung bình | Nâng cấp |
| AHT20 | I2C | Tốt | IoT |
| SHT31 | I2C | Rất tốt | Chuyên nghiệp |
👉 DHT11 là bước đệm – không phải đích đến.
9. Tổng kết Bài 12
Sau bài này, bạn đã:
- Đọc 2 metric trong 1 cảm biến
- Chuẩn hoá payload IoT
- So sánh được digital vs I2C
- Sẵn sàng nâng cấp lên cảm biến chất lượng cao hơn
👉 Bài tiếp theo: Bài 13 – Hướng dẫn đọc cảm biến DHT22 (AM2302) bằng ESP32: đo nhiệt độ/độ ẩm chính xác hơn & theo dõi realtime


