IoTLabs

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

Series ESP32 & Cảm biến: Bài 14 – Đọc cảm biến AHT20 (I2C): đo nhiệt độ/độ ẩm ổn định & theo dõi realtime

Sau khi làm quen với DHT11/DHT22, chúng ta chuyển sang AHT20 – một cảm biến nhiệt độ/độ ẩm giao tiếp I2C, cho độ ổn định và độ tin cậy cao hơn, rất phù hợp cho các dự án IoT chạy lâu dài.

Bài này tập trung vào:

  • Làm chủ I2C sensor thực sự
  • Đọc nhiệt độ/độ ẩm ổn định, ít lỗi
  • Gửi dữ liệu realtime lên IoTLabs Cloud MQTT

1. Vì sao nên dùng AHT20 thay cho DHT22?

Tiêu chíDHT22AHT20
Giao tiếpDigital riêngI2C
Độ ổn địnhTrung bìnhCao
Lỗi đọcThỉnh thoảngRất ít
Mở rộngKhóDễ (chung bus)
Phù hợp IoTTạm ổnRất tốt

👉 AHT20 là lựa chọn “ngon – bổ – hợp lý” cho các hệ IoT DIY nghiêm túc.

2. Giới thiệu cảm biến AHT20

  • Đo nhiệt độđộ ẩm
  • Giao tiếp I2C
  • Địa chỉ I2C mặc định: 0x38
  • Độ chính xác tốt, đo mượt

📌 Thường dùng cho:

  • Trạm thời tiết
  • Smart home
  • Giám sát môi trường phòng
  • Hệ IoT chạy 24/7

3. Chuẩn bị & nối dây

Phần cứng

  • ESP32-C3 SuperMini
  • Cảm biến AHT20 (module)

Kết nối I2C (quy ước series)

AHT20ESP32-C3
VCC3.3V
GNDGND
SDAGPIO8
SCLGPIO9

4. Kiểm tra I2C address (bắt buộc)

Trước khi đọc cảm biến, hãy chắc chắn ESP32 nhìn thấy AHT20 trên bus I2C.

#include <Wire.h>

void setup() {
  Serial.begin(115200);
  Wire.begin(8, 9);
  Serial.println("Scanning I2C...");
}

void loop() {
  for (byte addr = 1; addr < 127; addr++) {
    Wire.beginTransmission(addr);
    if (Wire.endTransmission() == 0) {
      Serial.print("Found I2C device at 0x");
      Serial.println(addr, HEX);
    }
  }
  delay(5000);
}

👉 Nếu thấy 0x38 → OK.

5. Ví dụ 1 — Đọc AHT20 local (Serial)

Thư viện sử dụng

  • Adafruit AHTX0

Code mẫu

#include <Wire.h>
#include <Adafruit_AHTX0.h>

Adafruit_AHTX0 aht;

void setup() {
  Serial.begin(115200);
  Wire.begin(8, 9);

  if (!aht.begin()) {
    Serial.println("AHT20 not found");
    while (1) delay(10);
  }
  Serial.println("AHT20 ready");
}

void loop() {
  sensors_event_t humidity, temperature;
  aht.getEvent(&humidity, &temperature);

  Serial.print("Temp: ");
  Serial.print(temperature.temperature, 1);
  Serial.print(" °C | Humidity: ");
  Serial.print(humidity.relative_humidity, 1);
  Serial.println(" %");

  delay(2000);
}

📌 AHT20 cho dữ liệu rất mượt, ít bị NaN như DHT.

6. Chuẩn payload gửi IoTLabs Cloud

{
  "ts": 1760000000,
  "metrics": {
    "temperature": 26.8,
    "humidity": 63.9
  }
}

7. Ví dụ 2 — Gửi dữ liệu AHT20 realtime qua MQTT

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_AHTX0.h>

Adafruit_AHTX0 aht;

// ===== 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-aht20", MQTT_USER, MQTT_PASS);
    delay(1000);
  }
}

void setup() {
  Serial.begin(115200);
  Wire.begin(8, 9);
  aht.begin();

  connectWiFi();
  connectMQTT();
}

void loop() {
  if (!mqtt.connected()) connectMQTT();
  mqtt.loop();

  if (millis() - lastSend > 5000) {
    lastSend = millis();

    sensors_event_t h, t;
    aht.getEvent(&h, &t);

    long ts = millis() / 1000;

    String payload = "{";
    payload += "\"ts\":" + String(ts) + ",";
    payload += "\"metrics\":{";
    payload += "\"temperature\":" + String(t.temperature, 1) + ",";
    payload += "\"humidity\":" + String(h.relative_humidity, 1);
    payload += "}}";

    mqtt.publish(MQTT_TOPIC, payload.c_str());
    Serial.println(payload);
  }
}

8. Kinh nghiệm thực tế với AHT20

  • Đặt cảm biến xa ESP32 và nguồn để tránh nhiệt giả
  • Không cần đọc quá nhanh (2–5s là đủ)
  • Rất phù hợp cho chạy lâu, ít bảo trì

9. Tổng kết Bài 14

Sau bài này, bạn đã:

  • Dùng I2C sensor đúng chuẩn
  • Đọc nhiệt độ/độ ẩm ổn định
  • Gửi dữ liệu multi-metric realtime
  • Sẵn sàng cho cảm biến chất lượng cao hơn

👉 Bài tiếp theo: Bài 15 – Hướng dẫn đọc cảm biến SHT31 bằng ESP32: đo nhiệt độ/độ ẩm chất lượng cao & theo dõi realtime