Vật tư
- ESP32 DevKit
- Cảm biến DHT22 (AM2302)
- Điện trở 10 kΩ
- Dây cắm, bảng mạch thử
- Cáp USB, nguồn 5V
Các bước
- Cài Arduino IDE, thêm bo ESP32 (Espressif) và thư viện "DHT sensor library" của Adafruit.
- Nối DHT22: chân 1 → 3V3, chân 2 (DATA) → GPIO4 và điện trở kéo lên 10 kΩ về 3V3, chân 4 → GND.
- Mở mã nguồn, điền tên WiFi và mật khẩu vào TEN_WIFI, MAT_KHAU.
- Nạp mã, mở Serial Monitor (115200) để xem địa chỉ IP.
- Mở trình duyệt điện thoại (cùng WiFi) vào địa chỉ IP đó: trang tự làm mới mỗi 10 giây.
Mã nguồn
// Trạm đo nhiệt độ – độ ẩm WiFi — OctaX.vn (CC BY 4.0)
// Bo: ESP32. DHT22 DATA → GPIO4 (kéo lên 10 kΩ về 3V3). Cần thư viện "DHT sensor library" (Adafruit).
#include <WiFi.h>
#include <WebServer.h>
#include <DHT.h>
const char* TEN_WIFI = "ten-wifi"; // ← điền tên WiFi
const char* MAT_KHAU = "mat-khau-wifi"; // ← điền mật khẩu WiFi
DHT dht(4, DHT22);
WebServer may(80);
float nhietDo = NAN, doAm = NAN;
unsigned long lanDoTruoc = 0;
// Trang web gọn: tự làm mới mỗi 10 giây
void trangChu() {
String h = "<!doctype html><meta charset=utf-8><meta name=viewport content='width=device-width'>"
"<meta http-equiv=refresh content=10><title>Trạm đo</title>"
"<body style='font-family:sans-serif;text-align:center;background:#0f172a;color:#e2e8f0'>"
"<h2>Trạm đo OctaX</h2>";
if (isnan(nhietDo)) h += "<p>Chưa đọc được cảm biến — kiểm tra dây DATA và điện trở kéo lên.</p>";
else h += "<p style='font-size:48px;margin:10px'>" + String(nhietDo, 1) + " °C</p>"
"<p style='font-size:32px;color:#60a5fa'>" + String(doAm, 0) + " %</p>";
may.send(200, "text/html; charset=utf-8", h);
}
// Trả dữ liệu dạng JSON cho ứng dụng khác đọc (vd OctaX MiniApp)
void duLieu() {
may.send(200, "application/json", "{\"nhietDo\":" + String(nhietDo, 1) + ",\"doAm\":" + String(doAm, 0) + "}");
}
void setup() {
Serial.begin(115200);
dht.begin();
WiFi.begin(TEN_WIFI, MAT_KHAU);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }
Serial.print("\nMở trình duyệt vào: http://"); Serial.println(WiFi.localIP());
may.on("/", trangChu);
may.on("/du-lieu", duLieu);
may.begin();
}
void loop() {
may.handleClient();
// DHT22 chỉ nên đọc tối đa 1 lần / 2 giây
if (millis() - lanDoTruoc > 2500) {
lanDoTruoc = millis();
float t = dht.readTemperature(), a = dht.readHumidity();
if (!isnan(t) && !isnan(a)) { nhietDo = t; doAm = a; }
}
}