// 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 #include #include 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 = "" "Trạm đo" "" "

Trạm đo OctaX

"; if (isnan(nhietDo)) h += "

Chưa đọc được cảm biến — kiểm tra dây DATA và điện trở kéo lên.

"; else h += "

" + String(nhietDo, 1) + " °C

" "

" + String(doAm, 0) + " %

"; 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; } } }