Pernah kepikiran gak sih, pengen tau suhu ruangan rumah pas lagi di kantor? Atau pengen tau apakah tanaman di rumah cukup disiram atau lagi kering kerontang? Dulu saya juga mikir kayak gitu terlalu mahal harus beli perangkat smart home dari merek ternama. Tapi ternyata, pakai ESP32 yang harganya cuma 30 ribuan, beberapa sensor, dan sedikit kode, kamu bisa bikin sistem monitoring sendiri.
ESP32 itu microcontroller yang punya WiFi dan Bluetooth bawaan. Bayangkan Arduino yang langsung bisa connect internet tanpa modul tambahan. Itulah ESP32. Dan di artikel ini, saya bakal ajak kamu bikin smart home monitoring lengkap dari wiring sensor, upload kode, sampai lihat data real-time di HP atau laptop.
Apa Itu ESP32 dan Kenapa Cocok untuk IoT?
ESP32 adalah microcontroller buatan Espressif Systems. Chip ini punya dual-core processor 240MHz, 520KB SRAM, dan yang paling penting WiFi + Bluetooth bawaan. Bandingkan dengan Arduino Uno yang butuh modul WiFi tambahan (ESP8266 atau shield khusus) biar bisa online.
Beberapa alasan kenapa ESP32 jadi pilihan utama untuk project IoT:
- Harga murah: Board ESP32 DevKit harganya Rp 30.000 - Rp 50.000. Bandingkan dengan Raspberry Pi yang minimal Rp 500.000.
- WiFi bawaan: Gak perlu beli modul tambahan. Langsung connect ke router WiFi di rumah.
- Banyak GPIO: Punya 34 pin programmable. Cukup untuk sensor suhu, kelembaban, relay, LED, dan layar LCD sekaligus.
- Low power mode: Ada deep sleep mode yang konsumsi dayanya cuma 10 A. Cocok untuk project yang pakai baterai.
- Komunitas besar: Ada banyak library dan tutorial. Gampang cari solusi pas kena masalah.
Untuk project kali ini, kita pakai board ESP32 DevKit V1 (yang 30 pin). Kalo kamu punya versi 38 pin, juga gak masalah pinout-nya mirip.
Komponen yang Dibutuhkan
Sebelum mulai, siapkan komponen berikut. Semua bisa dibeli di toko elektronika online dengan total di bawah Rp 150.000:
- ESP32 DevKit V1 board microcontroller utama (Rp 35.000)
- DHT22 sensor untuk baca suhu dan kelembaban udara (Rp 25.000)
- Soil moisture sensor untuk cek kelembaban tanah tanaman (Rp 8.000)
- Photoresistor (LDR) + resistor 10K untuk deteksi cahaya ruangan (Rp 3.000)
- Breadboard + jumper wires untuk wiring tanpa solder (Rp 15.000)
- LED + resistor 220 ohm untuk indikator status (Rp 2.000)
Opsional tapi berguna: relay module kalau mau control perangkat 220V seperti lampu atau kipas. Tapi untuk sekarang, fokus ke monitoring dulu control menyusul di bagian akhir.
Setup Arduino IDE untuk ESP32
ESP32 bisa diprogram pakai Arduino IDE. Tapi sebelum bisa, kamu harus tambahkan board ESP32 ke package manager dulu.
Buka Arduino IDE, masuk ke File > Preferences. Di field "Additional Board Manager URLs", tambahkan URL ini:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Kalau sudah ada URL lain (misal untuk ESP8266), pisahkan dengan koma. Klik OK.
Lalu buka Tools > Board > Boards Manager, cari "esp32", install package "esp32 by Espressif Systems". Tunggu sampai selesai download ukurannya lumayan besar, sekitar 200MB.
Setelah terinstall, pilih board:
Tools > Board > ESP32 Arduino > ESP32 Dev Module
Pilih port yang sesuai (biasanya /dev/ttyUSB0 di Linux atau COM3 di Windows). Kalau port gak muncul, kamu mungkin perlu install driver CH340 atau CP2102 (tergantung chip USB-to-Serial di board kamu).
Wiring Diagram Sambungkan Semua Sensor
Sekarang bagian serunya sambungkan semua komponen ke breadboard. Ikuti pin mapping berikut:
ESP32 Pin Komponen
3V3 DHT22 VCC, LDR (salah satu kaki)
GND DHT22 GND, LDR resistor 10K ke GND
GPIO4 DHT22 Data pin
GPIO34 LDR divider point (antara LDR & resistor 10K)
GPIO2 LED anode (via resistor 220 ohm)
GPIO35 Soil moisture sensor Analog Out
3V3 Soil moisture VCC
GND Soil moisture GND
Catatan penting: GPIO34, 35, 36, dan 39 adalah input-only pins. Gak bisa output. Jadi jangan sambungkan LED atau relay ke pin-pin ini. Sensor analog seperti LDR dan soil moisture cocok di sini.
Untuk LDR, bikin voltage divider sederhana: hubungkan 3V3 ke salah satu kaki LDR, kaki lainnya ke GPIO34, lalu dari GPIO32 ke GND lewat resistor 10K. Nilai ADC akan berubah tergantung intensitas cahaya.
Kode Program Baca Sensor dan Kirim ke WiFi
Sekarang waktunya ngoding. Kode ini baca semua sensor, tampilkan ke Serial Monitor, dan kirim data ke server lewat HTTP POST. Kita pakai library DHT dari Adafruit install lewat Sketch > Include Library > Manage Libraries, cari "DHT sensor library".
#include <WiFi.h>
#include <HTTPClient.h>
#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT22
#define LDR_PIN 34
#define SOIL_PIN 35
#define LED_PIN 2
const char* ssid = "NAMA_WIFI_KAMU";
const char* password = "PASSWORD_WIFI_KAMU";
const char* serverUrl = "http://192.168.1.100:3000/api/sensor";
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
pinMode(LED_PIN, OUTPUT);
pinMode(LDR_PIN, INPUT);
pinMode(SOIL_PIN, INPUT);
// Connect WiFi
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
digitalWrite(LED_PIN, !digitalRead(LED_PIN));
}
Serial.println();
Serial.println("WiFi connected!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
digitalWrite(LED_PIN, HIGH);
}
void loop() {
// Baca sensor DHT22
float suhu = dht.readTemperature();
float kelembaban = dht.readHumidity();
// Baca LDR (cahaya)
int ldrRaw = analogRead(LDR_PIN);
int cahaya = map(ldrRaw, 0, 4095, 0, 100);
// Baca soil moisture
int soilRaw = analogRead(SOIL_PIN);
int kelembabanTanah = map(soilRaw, 0, 4095, 0, 100);
// Cek apakah pembacaan valid
if (isnan(suhu) || isnan(kelembaban)) {
Serial.println("Gagal baca DHT22!");
return;
}
// Print ke Serial
Serial.println("--- Sensor Reading ---");
Serial.printf("Suhu: %.1f C\n", suhu);
Serial.printf("Kelembaban: %.1f %%\n", kelembaban);
Serial.printf("Cahaya: %d %%\n", cahaya);
Serial.printf("Kelembaban Tanah: %d %%\n", kelembabanTanah);
// Kirim ke server
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(serverUrl);
http.addHeader("Content-Type", "application/json");
String payload = String("{") +
"\"suhu\":" + String(suhu, 1) + "," +
"\"kelembaban\":" + String(kelembaban, 1) + "," +
"\"cahaya\":" + String(cahaya) + "," +
"\"soil\":" + String(kelembabanTanah) +
"}";
int code = http.POST(payload);
if (code > 0) {
Serial.printf("Data terkirim! HTTP %d\n", code);
} else {
Serial.printf("Gagal kirim: %s\n", http.errorToString(code).c_str());
}
http.end();
}
delay(5000); // Kirim tiap 5 detik
}
Ganti ssid, password, dan serverUrl sesuai setup kamu. Untuk testing awal, kamu bisa skip bagian HTTP POST dan lihat data di Serial Monitor dulu.
Membuat Dashboard Sederhana dengan Node.js
Data sensor gak ada gunanya kalau cuma tampil di Serial Monitor. Kita butuh dashboard yang bisa diakses dari HP atau laptop. Saya pakai Node.js dengan Express dan Socket.IO untuk real-time updates.
const express = require('express');
const socketio = require('socket.io');
const http = require('http');
const app = express();
const server = http.createServer(app);
const io = socketio(server);
app.use(express.json());
app.use(express.static('public'));
let lastData = {};
// Endpoint untuk menerima data dari ESP32
app.post('/api/sensor', (req, res) => {
lastData = req.body;
lastData.timestamp = new Date().toISOString();
io.emit('sensorData', lastData);
res.json({ status: 'ok' });
});
// Serve dashboard
app.get('/', (req, res) => {
res.sendFile(__dirname + '/public/index.html');
});
server.listen(3000, '0.0.0.0', () => {
console.log('Dashboard berjalan di port 3000');
});
Buat file public/index.html untuk tampilan dashboard-nya:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Smart Home Monitor</title>
<style>
body { font-family: Arial; margin: 20px; background: #1a1a2e; color: #fff; }
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; }
.card { background: #16213e; border-radius: 10px; padding: 20px; text-align: center; }
.card h3 { color: #e94560; margin-top: 0; }
.card .value { font-size: 2.5em; font-weight: bold; }
.card .unit { font-size: 0.5em; color: #aaa; }
</style>
</head>
<body>
<h1>Smart Home Monitor</h1>
<div class="grid">
<div class="card">
<h3>Suhu</h3>
<div class="value"><span id="suhu">--</span><span class="unit">C</span></div>
</div>
<div class="card">
<h3>Kelembaban</h3>
<div class="value"><span id="kelembaban">--</span><span class="unit">%</span></div>
</div>
<div class="card">
<h3>Cahaya</h3>
<div class="value"><span id="cahaya">--</span><span class="unit">%</span></div>
</div>
<div class="card">
<h3>Tanah</h3>
<div class="value"><span id="soil">--</span><span class="unit">%</span></div>
</div>
</div>
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io();
socket.on('sensorData', (data) => {
document.getElementById('suhu').textContent = data.suhu || '--';
document.getElementById('kelembaban').textContent = data.kelembaban || '--';
document.getElementById('cahaya').textContent = data.cahaya || '--';
document.getElementById('soil').textContent = data.soil || '--';
});
</script>
</body>
</html>
Jalankan server dengan node server.js, buka browser ke http://IP_KOMPUTER:3000, dan kamu bakal lihat dashboard real-time yang update otomatis tiap kali ESP32 mengirim data.
Deep Sleep untuk Hemat Baterai
Kalau kamu mau pakai ESP32 dengan baterai (misal untuk monitoring tanaman di kebun yang jauh dari stop kontak), mode deep sleep itu wajib. Di deep sleep, ESP32 "tidur" dan cuma bangun tiap interval tertentu untuk baca sensor dan kirim data.
#define uS_TO_S_FACTOR 1000000ULL
#define TIME_TO_SLEEP 60 // Tidur 60 detik
RTC_DATA_ATTR int bootCount = 0;
void setup() {
Serial.begin(115200);
bootCount++;
Serial.printf("Boot ke-%d\n", bootCount);
// Baca sensor dan kirim data di sini
bacaDanKirim();
// Set timer deep sleep
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
Serial.println("Masuk deep sleep...");
esp_deep_sleep_start();
}
void loop() {
// Gak akan sampai sini karena deep sleep
}
void bacaDanKirim() {
// Taruh kode baca sensor + kirim WiFi di sini
// ...
}
Dengan deep sleep 60 detik, konsumsi arah turun dari ~80mA jadi ~10 A. Baterai 18650 (3000mAh) bisa bertahan berminggu-minggu. Bandingkan dengan tanpa deep sleep yang cuma bertahan sekitar 1-2 hari.
Catatan: Variable pakai RTC_DATA_ATTR supaya nilainya gak hilang saat deep sleep. Memory biasa di-reset tiap kali bangun dari tidur.
Control Perangkat dengan Relay
Monitoring itu bagus, tapi kalau mau bikin smart home beneran, kamu butuh control. Contoh: kalau kelembaban tanah di bawah 30%, otomatis nyalakan pompa penyiram. Tambahkan relay module ke ESP32:
#define RELAY_PIN 15
#define SOIL_THRESHOLD 30
void setup() {
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // Pompa mati default
}
void loop() {
int soil = bacaSoil();
if (soil < SOIL_THRESHOLD) {
Serial.println("Tanah kering! Nyalakan pompa...");
digitalWrite(RELAY_PIN, HIGH);
delay(5000); // Siram 5 detik
digitalWrite(RELAY_PIN, LOW);
}
delay(30000); // Cek tiap 30 detik
}
PERINGATAN: Kalau kamu control perangkat 220V (pompa air AC, lampu rumah), pastikan relay module kamu rated untuk 10A atau lebih. Selalu matikan listrik MCB saat wiring. Kalau ragu, pakai relay 5V DC yang aman dulu untuk testing dengan LED sebagai pengganti pompa asli.
Tips Troubleshooting
Berikut masalah yang sering saya alami dan cara fix-nya:
- DHT22 baca NaN: Cek wiring pin Data. Pastikan pull-up resistor 10K antara Data dan VCC. Kadang sensor palsu baca NaN terus coba ganti sensor.
- WiFi gak connect: ESP32 harus dekat router. Kalau jarak lebih dari 10 meter lewat tembok, sinyal lemah. Pindah lebih dekat atau pakai WiFi range extender.
- Upload gagal "Connecting...": Tekan dan tahan BOOT button di ESP32 saat upload dimulai, lepas setelah "Connecting..." muncul. Beberapa board perlu ini.
- AnalogRead tidak akurat: ADC ESP32 nonlinier di range atas. Kalau butuh presisi tinggi, kalibrasi manual atau pakai ADC external seperti ADS1115 (sekitar Rp 20.000).
- Soil moisture cepat rusak: Sensor murah pakai elektroda tembaga yang korosi cepat di tanah basah. Lapisi dengan solder tipis atau pakai sensor capasitif (sedikit lebih mahal tapi tahan lama).
Simpan Data Historis ke Database
Dashboard real-time bagus untuk monitoring langsung, tapi kalau mau lihat trend (misal suhu selama seminggu), kamu butuh simpan data. Tambahkan SQLite atau MySQL ke server Node.js:
const Database = require('better-sqlite3');
const db = new Database('sensor.db');
db.exec(`CREATE TABLE IF NOT EXISTS readings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
suhu REAL,
kelembaban REAL,
cahaya INTEGER,
soil INTEGER,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)`);
app.post('/api/sensor', (req, res) => {
const { suhu, kelembaban, cahaya, soil } = req.body;
db.prepare('INSERT INTO readings (suhu, kelembaban, cahaya, soil) VALUES (?, ?, ?, ?)')
.run(suhu, kelembaban, cahaya, soil);
io.emit('sensorData', { ...req.body, timestamp: new Date().toISOString() });
res.json({ status: 'ok' });
});
app.get('/api/history', (req, res) => {
const rows = db.prepare('SELECT * FROM readings ORDER BY id DESC LIMIT 100').all();
res.json(rows);
});
Dengan data tersimpan, kamu bisa tambah chart pakai Chart.js atau Plotly untuk visualisasi trend. Sangat berguna kalau mau tau pola suhu ruangan siang vs malam, atau kelembaban tanah sebelum dan sesudah disiram.
Integrasi dengan Home Assistant
Kalau kamu sudah punya Home Assistant (open-source home automation platform), ESP32 bisa integrate langsung pakai MQTT. Install library PubSubClient di Arduino IDE, lalu ganti kode HTTP POST dengan MQTT publish:
#include <PubSubClient.h>
WiFiClient espClient;
PubSubClient mqtt(espClient);
const char* mqttServer = "192.168.1.50";
const int mqttPort = 1883;
void setup() {
// ... WiFi connect ...
mqtt.setServer(mqttServer, mqttPort);
}
void loop() {
if (!mqtt.connected()) {
mqtt.connect("esp32-monitor");
}
String payload = bacaSensorJSON();
mqtt.publish("home/sensor/ruang1", payload.c_str());
mqtt.loop();
delay(5000);
}
Di Home Assistant, tambahkan MQTT sensor di configuration.yaml, dan data ESP32 langsung muncul di dashboard HA. Dari sana kamu bisa bikin automation: "kalau suhu > 35C, nyalakan kipas" atau "kalau soil < 30%, siram tanaman".
Kesimpulan
ESP32 itu game changer buat DIY IoT. Dengan budget di bawah Rp 150.000, kamu bisa bikin sistem smart home monitoring yang fungsional suhu, kelembaban, cahaya, dan kelembaban tanah dalam satu perangkat. Plus dashboard real-time yang bisa diakses dari mana saja di jaringan rumah.
Yang saya suka dari ESP32 adalah fleksibilitasnya. Mulai dari simple serial monitor sampai integrasi Home Assistant, semuanya bisa dicapai tanpa beli perangkat mahal. Dan kalau kamu stuck, komunitas online sangat aktif hampir setiap masalah sudah pernah dibahas di forum.
Langkah berikutnya yang menarik untuk dicoba: tambahkan sensor kualitas udara (MQ-135), pasang di beberapa ruangan dengan multiple ESP32, atau buat notifikasi Telegram bot yang ngasih tau kalau tanah kering dan perlu disiram. Sky is the limit.
Kamu sudah pernah coba project IoT pakai ESP32 atau ESP8266? Atau ada masalah pas ngikutin tutorial ini? Share di kolom komentar, saya bantu troubleshoot!