IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series ESP32 & Cảm biến: Bài 12 – Đọc cảm biến DHT11: đo nhiệt độ/độ ẩm & theo dõi realtime

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 độđộ ẩ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
Độ ẩm20–90%
Sai sốCao
Tốc độ đọcChậ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

DHT11ESP32-C3
VCC3.3V
DATAGPIO4
GNDGND

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ếnGiao tiếpĐộ chính xácNên dùng
DHT11DigitalThấpHọc tập
DHT22DigitalTrung bìnhNâng cấp
AHT20I2CTốtIoT
SHT31I2CRất tốtChuyê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