1. Apa Itu ESP8266 / NodeMCU?
ESP8266 adalah chip System-on-Chip (SoC) berfitur WiFi yang dikembangkan oleh Espressif Systems, produsen asal Shanghai, Tiongkok. Chip ini merevolusi dunia IoT kelas pemula dengan menawarkan konektivitas WiFi 802.11 b/g/n yang terintegrasi dalam satu paket kecil, hemat daya, dan — yang paling penting — sangat terjangkau.
NodeMCU adalah nama board (papan pengembangan) open-source yang menggunakan chip ESP8266 sebagai jantungnya. Board ini mempermudah penggunaan ESP8266 dengan menambahkan regulator tegangan, USB-to-Serial converter, dan breakout pin siap pakai. Tanpa NodeMCU, kamu harus merancang board sendiri untuk memprogram ESP8266.
Di dunia maker, istilah "ESP8266" dan "NodeMCU" sering digunakan secara bergantian. Namun secara teknis, ESP8266 merujuk pada chip-nya, sedangkan NodeMCU merujuk pada board pengembangannya. Untuk tutorial ini, keduanya merujuk pada hal yang sama.
Spesifikasi Utama ESP8266
| Parameter | Spesifikasi |
|---|---|
| Prosesor | Tensilica L106 RISC @ 80/160 MHz |
| RAM | 160 KB SRAM |
| Flash | 4 MB (tergantung modul) |
| WiFi | 802.11 b/g/n (2.4 GHz) |
| Bluetooth | Tidak ada |
| GPIO | 11 pin (4 usable untuk I/O digital) |
| ADC | 1 channel, 10-bit (0–1V) |
| SPI / I2C / UART | 1 / 1 / 1 (software-based) |
| Operating Voltage | 3.3V |
| Input Voltage (via USB) | 5V (via regulator onboard) |
| Konsumsi Daya ( aktif WiFi ) | ~80 mA |
┌─────────────────────────────────────────────────┐ │ ESP8266 SoC │ │ │ │ ┌──────────────────────────────┐ │ │ │ Tensilica L106 RISC Core │ │ │ │ Single-Core @ 80/160 MHz │ │ │ └──────────────────────────────┘ │ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ WiFi 2.4GHz │ │ 80 KB RAM │ │ │ │ 802.11 b/g/n│ │ (usable) │ │ │ └──────────────┘ └──────────────┘ │ │ │ │ ┌────────┐ ┌────────┐ ┌────────────────────┐ │ │ │ ADC │ │ PWM │ │ GPIO (11 pins) │ │ │ │ 10-bit │ │ 8-ch │ │ 4 digital I/O │ │ │ └────────┘ └────────┘ └────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────┐ │ │ │ Flash (4MB) | SPI | I2C | UART | Timer │ │ │ └──────────────────────────────────────────┘ │ └─────────────────────────────────────────────────┘
Perbandingan ESP8266 vs ESP32 vs Arduino Uno
| Fitur | ESP8266 (NodeMCU) | ESP32 | Arduino Uno |
|---|---|---|---|
| Prosesor | Single-Core 80/160 MHz | Dual-Core 240 MHz | ATmega328P @ 16 MHz |
| RAM | 160 KB | 520 KB | 2 KB |
| Flash | 4 MB | 4 MB | 32 KB |
| WiFi | ✅ Built-in | ✅ Built-in | ❌ (perlu modul) |
| Bluetooth | ❌ | ✅ BLE 4.2 | ❌ |
| GPIO | 11 pin | 34 pin | 14 pin |
| Harga | ~Rp 30.000 | ~Rp 50.000 | ~Rp 80.000 |
| Konsumsi Daya | Sedang | Rendah–Sedang | Tinggi |
ESP8266 beroperasi pada tegangan 3.3V. Memberikan tegangan 5V langsung ke pin GPIO akan merusak chip secara permanen! Selalu gunakan level shifter atau voltage divider jika kamu ingin menghubungkan sensor 5V.
Kelebihan ESP8266 untuk Pemula
- Harga sangat terjangkau — Mulai dari Rp 25.000 hingga Rp 40.000 untuk board siap pakai.
- WiFi built-in — Tidak perlu module tambahan untuk koneksi internet.
- Banyak pilihan board — NodeMCU, Wemos D1 Mini, Adafruit HUZZAH, dan banyak lagi.
- Komunitas besar — Ribuan tutorial, library, dan contoh proyek tersedia.
- Mendukung Arduino IDE — Bisa diprogram menggunakan IDE yang sudah familiar.
- ESP-IDF & MicroPython — Bisa juga diprogram menggunakan framework lain yang lebih canggih.
ESP8266 memiliki jumlah pin GPIO terbatas (hanya 4 pin digital usable untuk I/O), tidak memiliki Bluetooth, dan ADC hanya satu channel dengan rentang 0–1V. Jika proyekmu membutuhkan banyak GPIO atau Bluetooth, pertimbangkan untuk menggunakan ESP32 sebagai gantinya.
2. Perbedaan Board ESP8266
Ada banyak varian board berbasis ESP8266 yang beredar di pasaran. Berikut adalah tiga yang paling populer dan sering digunakan oleh maker Indonesia:
NodeMCU (ESP-12E)
NodeMCU adalah board paling populer untuk pemula. Ukurannya cukup besar, tapi sangat mudah digunakan karena sudah memiliki USB-to-Serial converter (CP2102 atau CH340G), regulator 3.3V, dan semua pin ESP8266 sudah di-breakout ke header 2.54mm. Cocok untuk breadboard tapi agak kelebaran untuk breadboard standar (memakan 2 kolom).
Wemos D1 Mini
Wemos D1 Mini adalah pilihan favorit untuk proyek kompak. Ukurannya hampir setara Arduino Nano dan sangat pas di breadboard. Menggunakan chip USB CH340G. Wemos juga menjual shield ekspansi seperti DHT shield, relay shield, dan OLED shield yang bisa ditumpuk langsung ke atas D1 Mini.
WeMos WiFi & Recharge
WeMos WiFi & Recharge adalah varian yang sudah dilengkapi baterai lithium built-in dan modul charging. Cocok untuk proyek IoT portabel yang membutuhkan daya dari baterai. Board ini juga lebih kecil dari NodeMCU standar.
Perbandingan Ketiga Board
| Fitur | NodeMCU (ESP-12E) | Wemos D1 Mini | WeMos WiFi & Recharge |
|---|---|---|---|
| Ukuran | Besar (48 × 26 mm) | Kecil (34 × 26 mm) | Kecil (33 × 23 mm) |
| USB Chip | CP2102 / CH340G | CH340G | CH340G |
| Modul WiFi | ESP-12E (4 MB) | ESP-12E (4 MB) | ESP-12E (4 MB) |
| Baterai | ❌ | ❌ | ✅ Lithium built-in |
| Shield Ekspansi | Limited | Banyak opsi | Terbatas |
| Cocok untuk | Pemula, belajar | Proyek kompak | IoT portabel |
| Harga | ~Rp 30.000 | ~Rp 35.000 | ~Rp 50.000 |
Semua board di atas menggunakan chip ESP8266 yang sama dan diprogram dengan cara yang identik. Pilihan board tergantung kebutuhan fisik proyekmu — apakah butuh ukuran kecil, baterai built-in, atau banyak pin breakout.
3. Setup Arduino IDE untuk ESP8266
Arduino IDE adalah lingkungan pengembangan (IDE) yang paling umum digunakan untuk memprogram ESP8266. Berikut adalah langkah-langkah lengkapnya:
Langkah 1: Install Arduino IDE
Download dan install Arduino IDE versi terbaru dari arduino.cc. Arduino IDE 2.x atau 1.8.x keduanya kompatibel.
Langkah 2: Tambahkan URL Board ESP8266
Buka File → Preferences, lalu tambahkan URL berikut ke kolom "Additional Boards Manager URLs":
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Langkah 3: Install Board ESP8266
Buka Tools → Board → Boards Manager. Ketik "esp8266" di kolom pencarian, lalu install paket bernama "esp8266 by ESP8266 Community".
Langkah 4: Pilih Board
Sambungkan board NodeMCU ke komputer menggunakan kabel micro-USB. Buka Tools → Board → esp8266, lalu pilih "NodeMCU 1.0 (ESP-12E Module)" jika menggunakan NodeMCU, atau "LOLIN(WEMOS) D1 R2 & mini" jika menggunakan Wemos D1 Mini.
Langkah 5: Pilih Port
Buka Tools → Port dan pilih port COM yang sesuai. Di Windows biasanya muncul sebagai COM3, COM4, atau sejenisnya. Di Linux/Mac muncul sebagai /dev/ttyUSB0 atau /dev/tty.wchusbserial*.
# Jika port tidak muncul di Linux: sudo chmod 666 /dev/ttyUSB0 # Install driver CH340G untuk Windows: # Download dari http://www.wch-ic.com/downloads/CH341SER_EXE.html # Cek apakah device terdeteksi (Linux): ls /dev/ttyUSB* ls /dev/ttyACM*
Langkah 6: Pilih Upload Speed
Di Tools → Upload Speed, pilih 115200. Kecepatan ini paling stabil untuk proses upload. Jika upload gagal, coba turunkan ke 9600.
ets Jan 8 2013,rst cause:1, boot mode:(3,6)
load 0x40100000, len 26380, room 4
tail 12
chksum 0x86
load 0x3ffe8000, len 2192, room 4
tail 4
chksum 0x3c
load 0x40001000, len 316, room 8
...
4. Program Pertama: LED Blink
Program "LED Blink" adalah hello world di dunia mikrokontroler. Di NodeMCU, terdapat LED built-in yang terhubung ke pin D4 (GPIO2). LED ini aktif low, artinya LED menyala saat pin di-set LOW dan mati saat di-set HIGH.
// ============================================
// Program LED Blink untuk ESP8266 NodeMCU
// LED built-in terhubung ke pin D4 (GPIO2)
// Aktif LOW: HIGH = mati, LOW = menyala
// ============================================
#define LED_BUILTIN D4 // GPIO2 pada NodeMCU
void setup() {
// Inisialisasi Serial Monitor
Serial.begin(115200);
Serial.println();
Serial.println("=== LED Blink ESP8266 ===");
// Atur pin LED sebagai OUTPUT
pinMode(LED_BUILTIN, OUTPUT);
// Matikan LED di awal (HIGH = OFF untuk aktif LOW)
digitalWrite(LED_BUILTIN, HIGH);
}
void loop() {
// Nyalakan LED
digitalWrite(LED_BUILTIN, LOW);
Serial.println("LED ON");
delay(1000); // Tunggu 1 detik
// Matikan LED
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("LED OFF");
delay(1000); // Tunggu 1 detik
}
Pada ESP8266, nama pin di Arduino IDE menggunakan format "D" + nomor, misalnya D1, D2, D4. Ini berbeda dari nomor GPIO-nya! D4 = GPIO2, D5 = GPIO14, D6 = GPIO12, dst. Perhatikan pinout diagram boardmu sebelum wiring.
Mapping Pin NodeMCU
NodeMCU Pinout (Bagian Depan)
┌──────────────────────────────────┐
│ [USB Port] │
├──────────────────────────────────┤
│ 3V3 │ D0 (GPIO16) GND │
│ EN │ D1 (GPIO5/SCL) A0 │
│ D3 │ D2 (GPIO4/SDA) RSV │
│ D5 │ D6 (GPIO12/MISO) D7 │
│ D8 │ D4 (GPIO2/LED) RX │
│ D0 │ TX (GPIO1) GND │
├──────────────────────────────────┤
│ [Pin Header] │
└──────────────────────────────────┘
Pin Analog: A0 (GPIO17/ADC0) → hanya 1 channel
Pin PWM: Semua pin digital bisa PWM
Pin Serial: RX (GPIO3), TX (GPIO1)
5. Mengakses GPIO: LED, Relay, Buzzer
ESP8266 memiliki kemampuan untuk mengontrol berbagai komponen eksternal melalui pin GPIO. Mari kita bahas cara mengakses tiga komponen yang paling sering digunakan:
5.1 LED Eksternal
Untuk menghubungkan LED eksternal, kamu membutuhkan resistor pembatas arus (220Ω–330Ω). Jangan lupa — ESP8266 hanya menyediakan arus maksimal 12mA per pin GPIO.
// ============================================
// LED Eksternal dengan PWM (Fade Effect)
// Koneksi: GPIO5 (D1) → Resistor 220Ω → LED → GND
// ============================================
#define LED_PIN D1 // GPIO5
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// Fade in: brightness naik dari 0 ke 1023
for (int brightness = 0; brightness <= 1023; brightness++) {
analogWrite(LED_PIN, brightness);
delay(2);
}
// Fade out: brightness turun dari 1023 ke 0
for (int brightness = 1023; brightness >= 0; brightness--) {
analogWrite(LED_PIN, brightness);
delay(2);
}
Serial.println("Fade cycle selesai!");
}
5.2 Relay Module
Relay digunakan untuk mengontrol perangkat AC (lampu, kipas, pompa) menggunakan sinyal digital dari ESP8266. Gunakan modul relay 5V yang sudah memiliki transistor driver dan optocoupler. Modul relay biasanya aktif LOW — artinya relay ON saat pin GPIO di-set LOW.
// ============================================
// Kontrol Relay 1 Channel
// Koneksi: GPIO2 (D4) → IN pin Relay Module
// ============================================
#define RELAY_PIN D4 // GPIO2
void setup() {
Serial.begin(115200);
pinMode(RELAY_PIN, OUTPUT);
// Matikan relay di awal
digitalWrite(RELAY_PIN, HIGH); // HIGH = OFF untuk relay aktif LOW
Serial.println("Relay: OFF");
}
void loop() {
// Nyalakan relay (misal: nyalakan lampu)
digitalWrite(RELAY_PIN, LOW); // LOW = ON untuk relay aktif LOW
Serial.println("Relay: ON - Lampu menyala");
delay(5000); // Nyala selama 5 detik
// Matikan relay
digitalWrite(RELAY_PIN, HIGH);
Serial.println("Relay: OFF - Lampu mati");
delay(5000); // Mati selama 5 detik
}
Jangan pernah menghubungkan relay secara langsung ke pin GPIO ESP8266 tanpa transistor driver! Pin GPIO hanya mampu mengeluarkan arus maksimal 12mA, jauh di bawah arus yang dibutuhkan coil relay (30–80mA). Gunakan modul relay yang sudah memiliki driver transistor dan optocoupler untuk isolasi keamanan.
5.3 Buzzer
Buzzer aktif hanya membutuhkan sinyal HIGH/LOW untuk menghasilkan suara. Buzzer pasif membutuhkan sinyal PWM untuk mengatur frekuensi nada. Berikut contoh untuk kedua jenis buzzer:
// ============================================
// Buzzer: Aktif dan Pasif
// Koneksi: GPIO14 (D5) → Buzzer (+) → GND
// ============================================
#define BUZZER_PIN D5 // GPIO14
void setup() {
Serial.begin(115200);
pinMode(BUZZER_PIN, OUTPUT);
}
// Fungsi untuk memainkan nada
void playTone(int frequency, int duration) {
// Hitung period dari frekuensi
int period = 1000000 / frequency;
int halfPeriod = period / 2;
unsigned long endTime = millis() + duration;
while (millis() < endTime) {
digitalWrite(BUZZER_PIN, HIGH);
delayMicroseconds(halfPeriod);
digitalWrite(BUZZER_PIN, LOW);
delayMicroseconds(halfPeriod);
}
}
void loop() {
// Mode 1: Beep sederhana (buzzer aktif)
Serial.println("Mode 1: Beep sederhana");
digitalWrite(BUZZER_PIN, HIGH);
delay(200);
digitalWrite(BUZZER_PIN, LOW);
delay(100);
// Mode 2: Melodi sederhana (buzzer pasif)
Serial.println("Mode 2: Melodi");
playTone(262, 300); // Do
delay(50);
playTone(294, 300); // Re
delay(50);
playTone(330, 300); // Mi
delay(50);
playTone(349, 300); // Fa
delay(50);
playTone(392, 300); // Sol
delay(1000);
}
6. Koneksi WiFi: Station & Access Point
ESP8266 mendukung dua mode WiFi utama: Station (STA) dan Access Point (AP). Kamu juga bisa menggabungkan keduanya secara bersamaan (STA+AP mode).
6.1 Station Mode (STA)
Dalam mode ini, ESP8266 terhubung ke jaringan WiFi yang sudah ada (misalnya WiFi rumah atau kantor) sebagai client. Ini adalah mode yang paling sering digunakan untuk proyek IoT yang perlu mengirim data ke internet.
// ============================================
// WiFi Station Mode (STA)
// ESP8266 terhubung ke WiFi rumah
// ============================================
#include <ESP8266WiFi.h>
// Ganti dengan WiFi kamu
const char* ssid = "NamaWiFi";
const char* password = "PasswordWiFi123";
void setup() {
Serial.begin(115200);
Serial.println();
// Mulai koneksi WiFi
WiFi.mode(WIFI_STA); // Station mode
WiFi.begin(ssid, password);
Serial.print("Menghubungkan ke WiFi");
int attempts = 0;
// Tunggu hingga terhubung (max 20 detik)
while (WiFi.status() != WL_CONNECTED && attempts < 40) {
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println();
Serial.println("✅ WiFi terhubung!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
Serial.print("RSSI: ");
Serial.print(WiFi.RSSI());
Serial.println(" dBm");
} else {
Serial.println();
Serial.println("❌ Gagal terhubung ke WiFi!");
Serial.println("Periksa SSID dan password kamu.");
}
}
void loop() {
// Cek koneksi WiFi secara berkala
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi terputus! Mencoba reconnect...");
WiFi.reconnect();
delay(5000);
}
delay(60000); // Cek setiap 60 detik
}
Gunakan WiFi.begin(ssid, password) untuk koneksi pertama kali, dan WiFi.reconnect() untuk reconnect otomatis jika koneksi terputus. ESP8266 akan menyimpan kredensial WiFi di flash memory sehingga tidak perlu diinisialisasi ulang setiap restart.
6.2 Access Point Mode (AP)
Dalam mode AP, ESP8266 membuat jaringan WiFi sendiri. Perangkat lain bisa terhubung ke ESP8266 seperti halnya terhubung ke WiFi router. Mode ini berguna untuk konfigurasi awal perangkat (captive portal) atau komunikasi peer-to-peer.
// ============================================
// WiFi Access Point Mode (AP)
// ESP8266 membuat WiFi sendiri
// ============================================
#include <ESP8266WiFi.h>
void setup() {
Serial.begin(115200);
Serial.println();
// Konfigurasi Access Point
WiFi.mode(WIFI_AP);
WiFi.softAP("ESP8266_AP", "password123");
Serial.println("✅ Access Point aktif!");
Serial.print("SSID: ");
Serial.println(WiFi.softAPSSID());
Serial.print("IP Address: ");
Serial.println(WiFi.softAPIP()); // Biasanya 192.168.4.1
Serial.print("Jumlah klien: ");
Serial.println(WiFi.softAPgetStationNum());
}
void loop() {
// Monitor jumlah klien yang terhubung
static int lastCount = 0;
int count = WiFi.softAPgetStationNum();
if (count != lastCount) {
Serial.print("Klien terhubung: ");
Serial.println(count);
lastCount = count;
}
delay(5000);
}
6.3 Mode Ganda (STA+AP)
ESP8266 bisa beroperasi dalam mode STA+AP secara simultan. Ini memungkinkan ESP8266 tetap terhubung ke internet (melalui STA) sekaligus membuat access point sendiri (untuk konfigurasi atau komunikasi lokal).
// ============================================
// WiFi Dual Mode: Station + Access Point
// ============================================
#include <ESP8266WiFi.h>
const char* sta_ssid = "WiFiRumah";
const char* sta_password = "password123";
void setup() {
Serial.begin(115200);
// Aktifkan mode ganda
WiFi.mode(WIFI_AP_STA);
// Setup Access Point
WiFi.softAP("ESP8266_Config", "config123");
Serial.print("AP IP: ");
Serial.println(WiFi.softAPIP());
// Setup Station (konek ke WiFi)
WiFi.begin(sta_ssid, sta_password);
Serial.print("Menghubungkan ke WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("STA IP: ");
Serial.println(WiFi.localIP());
}
7. Web Server Sederhana di ESP8266
Salah satu kemampuan terbaik ESP8266 adalah bisa menjalankan web server sendiri! Artinya kamu bisa mengakses ESP8266 dari browser smartphone atau komputer tanpa internet. ESP8266 menyediakan library bawaan ESP8266WebServer yang sangat mudah digunakan.
// ============================================
// Web Server Sederhana di ESP8266
// Kontrol LED dari Browser
// ============================================
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
// WiFi credentials
const char* ssid = "NamaWiFi";
const char* password = "PasswordWiFi123";
// Inisialisasi web server di port 80
ESP8266WebServer server(80);
#define LED_PIN D4
// Status LED global
bool ledState = false;
// ============================================
// Handler: Halaman Utama (GET /)
// ============================================
void handleRoot() {
String html = "<!DOCTYPE html><html lang='id'><head>";
html += "<meta charset='UTF-8'>";
html += "<meta name='viewport' content='width=device-width, initial-scale=1'>";
html += "<title>ESP8266 Control Panel</title>";
html += "<style>";
html += "body{font-family:sans-serif;text-align:center;margin-top:50px;background:#1a1a2e;color:#eee;}";
html += "h1{color:#00d2ff;}button{";
html += "padding:15px 30px;font-size:18px;border:none;border-radius:8px;cursor:pointer;margin:10px;}";
html += ".on{background:#00d2ff;color:#000;}";
html += ".off{background:#ff6b6b;color:#fff;}";
html += ".status{font-size:24px;margin:20px;}";
html += "</style></head><body>";
html += "<h1>🔌 ESP8266 Control Panel</h1>";
html += "<p class='status'>Status LED: <b>";
html += ledState ? "🟢 MENYALA" : "🔴 MATI";
html += "</b></p>";
html += "<a href='/led/on'><button class='on'>ON</button></a>";
html += "<a href='/led/off'><button class='off'>OFF</button></a>";
html += "<p><small>IP: " + WiFi.localIP().toString() + "</small></p>";
html += "</body></html>";
server.send(200, "text/html", html);
}
// ============================================
// Handler: Nyalakan LED (GET /led/on)
// ============================================
void handleLedOn() {
digitalWrite(LED_PIN, LOW); // Aktif LOW
ledState = true;
server.sendHeader("Location", "/");
server.send(302);
}
// ============================================
// Handler: Matikan LED (GET /led/off)
// ============================================
void handleLedOff() {
digitalWrite(LED_PIN, HIGH);
ledState = false;
server.sendHeader("Location", "/");
server.send(302);
}
// ============================================
// Handler: API JSON status (GET /api/status)
// ============================================
void handleApiStatus() {
String json = "{\"led\":";
json += ledState ? "true" : "false";
json += ",\"ip\":\"" + WiFi.localIP().toString() + "\"";
json += ",\"rssi\":" + String(WiFi.RSSI());
json += ",\"uptime\":" + String(millis() / 1000);
json += "}";
server.send(200, "application/json", json);
}
// ============================================
// Handler: 404 Not Found
// ============================================
void handleNotFound() {
server.send(404, "text/plain", "404: Halaman tidak ditemukan");
}
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH);
// Koneksi WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Menghubungkan ke WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Web server aktif di: http://");
Serial.println(WiFi.localIP());
// Daftarkan route handler
server.on("/", handleRoot);
server.on("/led/on", handleLedOn);
server.on("/led/off", handleLedOff);
server.on("/api/status", handleApiStatus);
server.onNotFound(handleNotFound);
// Mulai server
server.begin();
Serial.println("HTTP server dimulai!");
}
void loop() {
server.handleClient(); // Proses request HTTP
}
Menghubungkan ke WiFi...
✅ WiFi terhubung!
Web server aktif di: http://192.168.1.45
HTTP server dimulai!
--- Buka browser → http://192.168.1.45 ---
8. Proyek: Monitoring Suhu dengan Web Dashboard
Sekarang kita akan menggabungkan semua konsep yang sudah dipelajari ke dalam proyek nyata: sistem monitoring suhu dan kelembaban dengan web dashboard real-time.
Yang Dibutuhkan
- Board NodeMCU ESP8266
- Sensor DHT11 atau DHT22 (suhu & kelembaban)
- Resistor pull-up 10kΩ
- Breadboard & jumper wire
Wiring Diagram
NodeMCU DHT11
┌────────┐ ┌────────┐
│ │ │ VCC │──── 3.3V (NodeMCU)
│ D2 │────────│ DATA │
│ │ │ │
│ │ ┌─────│ NC │
│ │ │ │ GND │──── GND (NodeMCU)
└────────┘ │ └────────┘
│
┌───┴───┐
│ 10kΩ │ ← Pull-up resistor
└───┬───┘
│
3.3V
Catatan: DATA pin DHT11 → GPIO4 (D2) pada NodeMCU
Resistor 10kΩ antara DATA dan VCC (pull-up)
Kode Program Lengkap
// ============================================
// Proyek: Monitoring Suhu dengan Web Dashboard
// ESP8266 NodeMCU + DHT11 + Web Server
// ============================================
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>
// ---- Konfigurasi WiFi ----
const char* ssid = "NamaWiFi";
const char* password = "PasswordWiFi123";
// ---- Konfigurasi Sensor ----
#define DHTPIN D2 // GPIO4
#define DHTTYPE DHT11 // Ganti ke DHT22 jika pakai DHT22
#define LED_PIN D4 // LED indikator
// ---- Inisialisasi ----
DHT dht(DHTPIN, DHTTYPE);
ESP8266WebServer server(80);
// ---- Variabel Penyimpan Data ----
float currentTemp = 0.0;
float currentHumidity = 0.0;
unsigned long lastReadTime = 0;
const int READ_INTERVAL = 2000; // Baca sensor tiap 2 detik
// Riwayat data untuk grafik (simpan 60 data terakhir)
float tempHistory[60];
float humHistory[60];
int historyIndex = 0;
bool historyFull = false;
// ============================================
// Fungsi: Baca Sensor
// ============================================
void readSensor() {
if (millis() - lastReadTime >= READ_INTERVAL) {
float t = dht.readTemperature();
float h = dht.readHumidity();
if (!isnan(t) && !isnan(h)) {
currentTemp = t;
currentHumidity = h;
// Simpan ke riwayat
tempHistory[historyIndex] = t;
humHistory[historyIndex] = h;
historyIndex = (historyIndex + 1) % 60;
if (historyIndex == 0) historyFull = true;
// Log ke serial
Serial.printf("Suhu: %.1f°C | Kelembaban: %.1f%%\n", t, h);
} else {
Serial.println("⚠️ Gagal membaca sensor DHT!");
}
lastReadTime = millis();
}
}
// ============================================
// Fungsi: Generate Data JSON untuk Grafik
// ============================================
String getHistoryJson(String data[], int count, bool full) {
String json = "[";
int start = full ? count : 0;
int total = full ? count : count;
for (int i = 0; i < total; i++) {
int idx = full ? ((count + i) % 60) : i;
if (i > 0) json += ",";
json += String(data[idx].toFloat(), 1);
}
json += "]";
return json;
}
// ============================================
// Handler: Dashboard Utama
// ============================================
void handleDashboard() {
String tempStr = String(currentTemp, 1);
String humStr = String(currentHumidity, 1);
// Tentukan status berdasarkan suhu
String statusColor, statusText;
if (currentTemp < 25) {
statusColor = "#22d3ee"; statusText = "🌀 Dingin";
} else if (currentTemp < 30) {
statusColor = "#3ecf8e"; statusText = "✅ Normal";
} else if (currentTemp < 35) {
statusColor = "#fb923c"; statusText = "🟡 Hangat";
} else {
statusColor = "#ff6b6b"; statusText = "🔴 Panas!";
}
String html = R"rawliteral(
<!DOCTYPE html><html lang="id"><head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>ESP8266 Monitoring Dashboard</title>
<style>
*{margin:0;padding:0;box-sizing:border-box;}
body{font-family:'Segoe UI',sans-serif;background:#0f1117;color:#e0e0e0;}
.header{text-align:center;padding:30px 20px;background:linear-gradient(135deg,#0f1117,#1a1d2e);}
.header h1{font-size:28px;color:#fff;margin-bottom:8px;}
.header p{color:#888;font-size:14px;}
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:20px;padding:20px;max-width:800px;margin:0 auto;}
.card{background:#1a1d2e;border-radius:12px;padding:24px;text-align:center;border:1px solid #2a2d3e;}
.card .value{font-size:48px;font-weight:700;margin:10px 0;}
.card .label{color:#888;font-size:14px;text-transform:uppercase;letter-spacing:1px;}
.status{padding:20px;text-align:center;}
.status span{font-size:18px;padding:8px 24px;border-radius:20px;font-weight:600;}
.chart-section{max-width:800px;margin:20px auto;padding:20px;}
canvas{width:100%;height:200px;background:#1a1d2e;border-radius:12px;padding:10px;}
.footer{text-align:center;padding:20px;color:#555;font-size:12px;}
</style></head><body>
<div class="header">
<h1>🌡️ ESP8266 Monitoring Dashboard</h1>
<p>Real-time suhu & kelembaban • Auto-refresh tiap 5 detik</p>
</div>
<div class="cards">
<div class="card">
<div class="label">Suhu</div>
<div class="value" id="temp" style="color:)rawliteral"
+ statusColor + R"rawliteral()">)rawliteral"
+ tempStr + R"rawliteral(°C</div>
</div>
<div class="card">
<div class="label">Kelembaban</div>
<div class="value" id="hum" style="color:#7c5cff;">)rawliteral"
+ humStr + R"rawliteral(%</div>
</div>
</div>
<div class="status">
<span style="background:)rawliteral"
+ statusColor + R"rawliteral(;color:#000;">)rawliteral"
+ statusText + R"rawliteral(</span>
</div>
<div class="footer">
ESP8266 IoT Dashboard • Auto refresh 5 detik • IP: )rawliteral"
+ WiFi.localIP().toString() + R"rawliteral(
</div>
<script>
setInterval(function(){
fetch('/api/data')
.then(r=>r.json())
.then(d=>{
document.getElementById('temp').textContent = d.temp + '°C';
document.getElementById('hum').textContent = d.hum + '%';
location.reload();
});
}, 5000);
</script>
</body></html>)rawliteral";
server.send(200, "text/html", html);
}
// ============================================
// Handler: API Data JSON
// ============================================
void handleApiData() {
String json = "{";
json += "\"temp\":" + String(currentTemp, 1) + ",";
json += "\"hum\":" + String(currentHumidity, 1) + ",";
json += "\"rssi\":" + String(WiFi.RSSI()) + ",";
json += "\"uptime\":" + String(millis() / 1000) + ",";
json += "\"ip\":\"" + WiFi.localIP().toString() + "\"";
json += "}";
server.send(200, "application/json", json);
}
void setup() {
Serial.begin(115200);
Serial.println("\n=== ESP8266 Monitoring Suhu ===");
// Inisialisasi sensor DHT
dht.begin();
pinMode(LED_PIN, OUTPUT);
// Inisialisasi riwayat
for (int i = 0; i < 60; i++) {
tempHistory[i] = 0;
humHistory[i] = 0;
}
// Koneksi WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("Menghubungkan ke WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Dashboard: http://");
Serial.println(WiFi.localIP());
// Daftarkan route
server.on("/", handleDashboard);
server.on("/api/data", handleApiData);
server.begin();
Serial.println("✅ Web server dimulai!");
}
void loop() {
server.handleClient();
readSensor();
// Blink LED setiap pembacaan sensor berhasil
digitalWrite(LED_PIN, LOW);
delay(50);
digitalWrite(LED_PIN, HIGH);
}
Untuk proyek nyata, pertimbangkan menggunakan library LittleFS untuk menyimpan file HTML/CSS di flash memory ESP8266, sehingga kamu tidak perlu meng-embed seluruh kode HTML di dalam sketch C++. Ini membuat kode lebih rapi dan mudah dimaintain.
=== ESP8266 Monitoring Suhu ===
Menghubungkan ke WiFi...✅
Dashboard: http://192.168.1.105
✅ Web server dimulai!
Suhu: 27.5°C | Kelembaban: 65.2%
Suhu: 27.6°C | Kelembaban: 65.0%
Suhu: 27.4°C | Kelembaban: 65.3%
9. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang ESP8266 dan IoT: