ESP32 Webserver DHT11 Temperature and Humidity Measurement


Tujuan:
Peserta dapat membangun sistem webserver menggunakan ESP32 yang menampilkan data suhu dan kelembaban dari sensor DHT11 secara real-time melalui halaman web.
Alat dan Bahan:
- ESP32 Development Board
- Sensor DHT11
- Breadboard
- Kabel jumper
- Resistor 10kΩ (opsional untuk pull-up pada pin data DHT11)
- USB Cable (untuk menghubungkan ESP32 ke PC)
Perangkat Lunak:
- Arduino IDE (dengan dukungan ESP32)
- Library yang diperlukan:
- DHT sensor library by Adafruit
- ESPAsyncWebServer dan AsyncTCP (untuk web server)
Langkah-Langkah:
- Persiapan Hardware
- Rangkai komponen seperti gambar di bawah ini:
| DHT11 Pin | ESP32 Pin |
| VCC | 3.3V |
| GND | GND |
| DATA | GPIO 4 |
- Jika menggunakan resistor pull-up, hubungkan resistor 10kΩ antara VCC dan pin data sensor DHT11.
- Instalasi Library yang Diperlukan
- Buka Arduino IDE.
- Pastikan Anda sudah menginstal ESP32 board di Arduino IDE. Jika belum:
- Buka File > Preferences, lalu tambahkan URL ini di bagian Additional Board Manager URLs:
https://espressif.github.io/arduino-esp32/package_esp32_index.json
- Pergi ke Tools > Board > Board Manager, cari “ESP32”, dan instal.
- Instal DHT Sensor Library:
- Pergi ke Sketch > Include Library > Manage Libraries.
- Cari “DHT sensor library by Adafruit” dan instal.
- Instal library untuk webserver:
- ESPAsyncWebServer dan AsyncTCP:
- Buka Sketch > Include Library > Manage Libraries.
- Cari ESPAsyncWebServer dan AsyncTCP. Instal kedua library tersebut.
- ESPAsyncWebServer dan AsyncTCP:
- Kode Program
Berikut adalah kode program untuk ESP32 Webserver menggunakan sensor DHT11:
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
// Definisikan pin DHT dan tipe sensor
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// Konfigurasi Wi-Fi
const char* ssid = "Nama_WiFi"; // Ganti dengan nama WiFi Anda
const char* password = "Password_WiFi"; // Ganti dengan password WiFi Anda
AsyncWebServer server(80);
String readDHTTemperature() {
float t = dht.readTemperature();
if (isnan(t)) {
return "--";
} else {
return String(t);
}
}
String readDHTHumidity() {
float h = dht.readHumidity();
if (isnan(h)) {
return "--";
} else {
return String(h);
}
}
void setup() {
// Memulai serial monitor
Serial.begin(115200);
dht.begin();
// Hubungkan ke Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
Serial.println(WiFi.localIP());
// Rute untuk menampilkan halaman web
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
String html = "<!DOCTYPE html><html>";
html += "<head><meta name='viewport' content='width=device-width, initial-scale=1.0'>";
html += "<title>ESP32 DHT11 WebServer</title></head>";
html += "<body><h1>ESP32 DHT11 Sensor Data</h1>";
html += "<p>Temperature: " + readDHTTemperature() + " °C</p>";
html += "<p>Humidity: " + readDHTHumidity() + " %</p>";
html += "</body></html>";
request->send(200, "text/html", html);
});
// Memulai server
server.begin();
}
void loop() {
// Tidak ada kode dalam loop
}- Ubah SSID dan Password Wi-Fi
Di bagian berikut, ganti nama Wi-Fi dan password sesuai dengan jaringan Wi-Fi yang Anda gunakan:
const char* ssid = "Nama_WiFi"; const char* password = "Password_WiFi";
- Unggah Program ke ESP32
- Sambungkan ESP32 ke komputer menggunakan kabel USB.
- Pilih Tools > Board > ESP32 Dev Module.
- Pilih port yang sesuai di Tools > Port.
- Klik tombol Upload di Arduino IDE untuk mengunggah program ke ESP32.
- Uji Webserver
- Setelah proses upload selesai, buka Serial Monitor di Arduino IDE dengan baudrate 115200 untuk melihat alamat IP ESP32.
- Catat alamat IP tersebut (contoh: 192.168.1.10).
- Buka browser web di perangkat yang terhubung ke jaringan Wi-Fi yang sama, dan masukkan alamat IP yang ditampilkan di Serial Monitor.
- Halaman web akan menampilkan suhu dan kelembaban dari sensor DHT11 secara real-time.
Tugas Akhir:
- Tambahkan fitur untuk memperbarui data suhu dan kelembaban secara otomatis tanpa perlu me-refresh halaman secara manual.
- Buat laporan hasil implementasi, termasuk screenshot tampilan webserver yang berjalan.
Versi yang Lebih Baik: Baca Sensor di loop(), Halaman Update Otomatis
Kode di atas membaca DHT11 di dalam callback web server. Pembacaan DHT11 butuh waktu dan sensor ini hanya boleh dibaca sekitar sekali per detik, sehingga cara yang lebih aman adalah membaca sensor di loop() setiap 2 detik lalu menyimpan hasilnya. Versi berikut juga menjawab Tugas Akhir: halaman memperbarui angka sendiri tanpa refresh, lewat endpoint JSON /data.
#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
const char* ssid = "Nama_WiFi";
const char* password = "Password_WiFi";
AsyncWebServer server(80);
float suhu = NAN, rh = NAN;
unsigned long tBaca = 0;
const char HALAMAN[] PROGMEM = R"rawliteral(
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1">
<title>ESP32 DHT11</title></head><body>
<h1>ESP32 DHT11</h1>
<p>Suhu: <b id="t">--</b> °C</p>
<p>Kelembapan: <b id="h">--</b> %</p>
<script>
async function ambil() {
const r = await fetch('/data');
const d = await r.json();
document.getElementById('t').textContent = d.suhu;
document.getElementById('h').textContent = d.rh;
}
ambil(); setInterval(ambil, 2000);
</script></body></html>)rawliteral";
void setup() {
Serial.begin(115200);
dht.begin();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.println(WiFi.localIP());
server.on("/", HTTP_GET, [](AsyncWebServerRequest *req) {
req->send_P(200, "text/html", HALAMAN);
});
server.on("/data", HTTP_GET, [](AsyncWebServerRequest *req) {
String json = "{\"suhu\":" + (isnan(suhu) ? String("null") : String(suhu, 1)) +
",\"rh\":" + (isnan(rh) ? String("null") : String(rh, 0)) + "}";
req->send(200, "application/json", json);
});
server.begin();
}
void loop() {
if (millis() - tBaca >= 2000) {
tBaca = millis();
float t = dht.readTemperature();
float h = dht.readHumidity();
if (!isnan(t)) suhu = t;
if (!isnan(h)) rh = h;
}
}Catatan Library dan Versi Core ESP32
ESPAsyncWebServer versi lama dari repositori me-no-dev sering gagal dikompilasi di Arduino-ESP32 core 3.x. Gunakan versi yang dipelihara ESP32Async (ESPAsyncWebServer dan AsyncTCP) dari Library Manager. Jika memakai versi tersebut, send_P bisa diganti send biasa.
DHT11 vs DHT22
| Parameter | DHT11 | DHT22 |
|---|---|---|
| Rentang suhu | 0 – 50 °C | −40 – 80 °C |
| Akurasi suhu | ±2 °C | ±0,5 °C |
| Rentang kelembapan | 20 – 80 %RH (tipikal) | 0 – 100 %RH |
| Laju baca | 1 kali/detik | 1 kali per 2 detik |
Untuk mengganti ke DHT22, cukup ubah #define DHTTYPE DHT22.
Troubleshooting
| Gejala | Penyebab | Solusi |
|---|---|---|
| Halaman menampilkan “–” terus | Pin data tidak sesuai kode, atau tanpa pull-up | Pastikan DATA ke GPIO 4 (sesuai DHTPIN) dan pasang 10 kΩ ke 3,3 V jika modul tidak punya resistor |
| Halaman tidak bisa dibuka | HP/laptop beda jaringan dengan ESP32 | Sambungkan ke Wi-Fi yang sama, cek IP di Serial Monitor |
| Error kompilasi AsyncTCP | Versi library tidak cocok dengan core ESP32 | Pasang versi ESP32Async terbaru |
Baca juga: ESP32: Panduan Komprehensif untuk Pemula hingga Ahli (IoT, Pemrograman, & Proyek) untuk memahami roadmap lengkap belajar ESP32 dari dasar hingga proyek IoT.




