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í | DHT22 | AHT20 |
|---|---|---|
| Giao tiếp | Digital riêng | I2C |
| Độ ổn định | Trung bình | Cao |
| Lỗi đọc | Thỉnh thoảng | Rất ít |
| Mở rộng | Khó | Dễ (chung bus) |
| Phù hợp IoT | Tạm ổn | Rấ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 độ và độ ẩ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)
| AHT20 | ESP32-C3 |
|---|---|
| VCC | 3.3V |
| GND | GND |
| SDA | GPIO8 |
| SCL | GPIO9 |
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


