Pendahuluan
Di artikel MQTT (#7) kita sudah publish data sensor ke broker. Kali ini kita naik level: mengontrol lampu secara nirkabel lewat MQTT — fondasi smart home yang paling sering dipraktikkan.
ESP32 akan subscribe ke topic kontrol. Saat kamu kirim pesan ON atau OFF dari MQTT Explorer (atau HP), relay menyalakan atau mematikan lampu. Tanpa kabel tambahan ke komputer, tanpa buka web server manual.
Yang Kamu Butuhkan
- ESP32 DevKit
- Modul relay 1 channel (5V, dengan optocoupler)
- Lampu LED atau lampu kecil + soket (untuk latihan aman)
- Kabel jumper
- Arduino IDE + library PubSubClient
- MQTT Explorer di laptop (opsional di HP)
Prasyarat: Sudah paham dasar MQTT dan koneksi WiFi ESP32. Baca dulu Memahami MQTT dengan ESP32 (#7) dan Menghubungkan ESP32 ke WiFi (#4). Opsional: Web Server ESP32 + DHT22 (#6).
Keamanan listrik: Tutorial ini memakai lampu LED kecil atau lampu desk 5V–12V yang aman untuk pemula. Jangan menyentuh kabel listrik AC 220V tanpa pengalaman. Untuk kontrol lampu rumah AC, gunakan relay khusus AC + pelindung dan aturan kelistrikan yang benar.
Topologi MQTT — Subscribe Kontrol
Alur kebalikan dari publish sensor (#7): kamu yang publish perintah, ESP32 yang subscribe.
Wiring Modul Relay ke ESP32
Modul relay umum (misalnya HW-483 / SRD-05VDC). Pin konsisten dengan proyek gabungan DHT22 + relay (#9):
- VCC → 5V ESP32 (atau VIN jika board menyediakan 5V)
- GND → GND ESP32
- IN → GPIO 26 ESP32
- COM / NO → rangkaian lampu (lampu kecil saja untuk latihan)
Banyak modul relay active LOW — relay aktif saat pin IN menerima sinyal LOW. Kode di bawah sudah menyesuaikan logika ini.
Broker & Topic MQTT
Kita pakai test server Eclipse Mosquitto (sama seperti artikel MQTT (#7)):
- Broker:
test.mosquitto.orgport1883 - Topic kontrol:
kodingindonesia/esp32/lampu/kontrol - Pesan:
ONatauOFF(huruf besar, tanpa spasi)
Broker bukan website —
test.mosquitto.orgtidak dibuka di browser. Gunakan ESP32 atau MQTT Explorer.
Keamanan broker publik: Siapa saja bisa publish ke topic yang sama di broker test. Pakai topic unik (lihat pro tip di bawah) dan jangan kontrol perangkat produksi lewat broker publik tanpa autentikasi. Untuk produksi, lanjut ke Mosquitto pribadi (#16) + TLS (#17).
Kode Program: ESP32 + Relay + MQTT Subscribe
Ganti placeholder GANTI_SSID_WIFI / GANTI_PASSWORD_WIFI, lalu upload. Untuk produksi tanpa hardcode, lihat NVS + WiFiManager (#12).
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "GANTI_SSID_WIFI";
const char* password = "GANTI_PASSWORD_WIFI";
const char* mqttServer = "test.mosquitto.org";
const int mqttPort = 1883;
const char* topicKontrol = "kodingindonesia/esp32/lampu/kontrol";
#define RELAY_PIN 26
// Banyak modul relay active LOW: LOW = nyala, HIGH = mati
const bool RELAY_ON = LOW;
const bool RELAY_OFF = HIGH;
WiFiClient espClient;
PubSubClient mqttClient(espClient);
bool lampuMenyala = false;
void setLampu(bool nyala) {
lampuMenyala = nyala;
digitalWrite(RELAY_PIN, nyala ? RELAY_ON : RELAY_OFF);
Serial.println(nyala ? "Lampu: ON" : "Lampu: OFF");
}
void callbackMQTT(char* topic, byte* payload, unsigned int length) {
String pesan;
for (unsigned int i = 0; i < length; i++) {
pesan += (char)payload[i];
}
pesan.trim();
pesan.toUpperCase();
Serial.print("Pesan di ");
Serial.print(topic);
Serial.print(": ");
Serial.println(pesan);
if (pesan == "ON") {
setLampu(true);
} else if (pesan == "OFF") {
setLampu(false);
}
}
void koneksiWiFi() {
Serial.print("Menghubungkan ke WiFi");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi terhubung!");
}
void koneksiMQTT() {
mqttClient.setServer(mqttServer, mqttPort);
mqttClient.setCallback(callbackMQTT);
while (!mqttClient.connected()) {
Serial.print("MQTT connect...");
String clientId = "ESP32-Relay-" + String(random(0xffff), HEX);
if (mqttClient.connect(clientId.c_str())) {
Serial.println(" OK");
mqttClient.subscribe(topicKontrol);
Serial.print("Subscribe: ");
Serial.println(topicKontrol);
} else {
Serial.print(" gagal rc=");
Serial.println(mqttClient.state());
delay(5000);
}
}
}
void setup() {
Serial.begin(115200);
randomSeed(micros());
pinMode(RELAY_PIN, OUTPUT);
setLampu(false);
koneksiWiFi();
koneksiMQTT();
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
koneksiWiFi();
}
if (!mqttClient.connected()) {
koneksiMQTT();
}
mqttClient.loop();
}
Uji Coba dari MQTT Explorer
- Upload kode ke ESP32, buka Serial Monitor (115200 baud)
- Buka MQTT Explorer → connect ke
test.mosquitto.org:1883 - Di panel publish, isi topic:
kodingindonesia/esp32/lampu/kontrol - Kirim pesan
ON→ relay berbunyi klik, lampu menyala - Kirim pesan
OFF→ lampu mati
Alternatif: mosquitto_pub (Terminal)
mosquitto_pub -h test.mosquitto.org -t "kodingindonesia/esp32/lampu/kontrol" -m "ON"
mosquitto_pub -h test.mosquitto.org -t "kodingindonesia/esp32/lampu/kontrol" -m "OFF"
Perintah mosquitto_pub dari paket Mosquitto — tersedia di Linux, Mac, dan Windows setelah install Mosquitto.
Cara Kerjanya
- ESP32 connect ke WiFi lalu ke broker MQTT
- ESP32 subscribe topic kontrol — menunggu perintah
- Kamu publish
ON/OFFdari MQTT Explorer - Fungsi
callbackMQTT()dipanggil → relay di GPIO 26 berubah state
Ini kebalikan dari artikel sensor MQTT (#7) (publish data). Di smart home, sering keduanya digabung — lihat proyek gabungan DHT22 + relay (#9).
Tips & Troubleshooting
- Relay tidak klik: Cek VCC 5V dan GND. Beberapa board butuh power supply terpisah untuk relay.
- Logika terbalik: Modul kamu mungkin active HIGH — tukar nilai
RELAY_ON/RELAY_OFF. - Pesan tidak diterima: Topic harus sama persis. Cek Serial Monitor saat publish. Pastikan
mqttClient.loop()dipanggil diloop(). - Pesan
onkecil juga OK: Kode memanggiltoUpperCase()—ON/offtetap dikenali. - rc=-2 saat connect MQTT: WiFi atau broker tidak terjangkau — cek internet.
- rc=4 (bad credentials):
test.mosquitto.orgport 1883 tidak perlu auth. - ESP32 restart saat relay aktif: Relay boros arus — gunakan power supply eksternal 5V untuk modul relay, GND disatukan.
- GPIO 26 tidak cocok: Pin lain yang aman: 25, 27, 32, 33. Hindari GPIO 6–11 (flash) dan GPIO 2 (boot).
Langkah Selanjutnya
- Gabungkan publish DHT22 + subscribe relay (#9) dalam satu sketch ESP32
- Kontrol otomatis: matikan lampu jika suhu > 30°C — sudah ada contoh di artikel gabungan (#9)
- Integrasi Home Assistant (#21) — switch & sensor MQTT native di dashboard smart home
- Alternatif tanpa sketch Arduino: ESPHome (#22) — flash ESP32 dari YAML
- Dashboard & otomasi visual: Node-RED (#23) — kontrol relay lewat flow MQTT
- Automasi gerak: PIR + lampu MQTT (#24) — interrupt & debounce
- Broker Mosquitto pribadi (#16) di Raspberry Pi dengan autentikasi
- Deploy remote / internet: amankan MQTT dengan TLS port 8883 (#17) — QoS, LWT & retained
Pro tip: Ubah topic menjadi unik, misalnya
kodingindonesia/anton/esp32/lampu/kontrol, agar tidak ada orang lain yang tidak sengaja mengontrol lampu kamu di broker publik.
Langkah Selanjutnya — Gerakan Presisi (Seri 2)
Relay hanya on/off — untuk sudut presisi (flap, lengan robot), lanjut ke Kontrol Servo & PWM via MQTT (#33): SG90 0–180° lewat topic kodingindonesia/esp32/servo/sudut.