Pendahuluan
Di artikel sebelumnya kita sudah mengirim data sensor DHT22 ke broker MQTT. 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 dan Menghubungkan ESP32 ke WiFi.
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.
Wiring Modul Relay ke ESP32
Modul relay umum (misalnya HW-483 / SRD-05VDC) memiliki pin:
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 sebelumnya):
Broker:
test.mosquitto.orgport1883Topic kontrol:
kodingindonesia/esp32/lampu/kontrolPesan:
ONatauOFF(huruf besar, tanpa spasi)
Broker bukan website —
test.mosquitto.orgtidak dibuka di browser. Gunakan ESP32 atau MQTT Explorer.
Kode Program: ESP32 + Relay + MQTT Subscribe
Ganti ssid dan password WiFi, lalu upload:
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "NamaWiFiKamu";
const char* password = "PasswordWiFiKamu";
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 (!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:1883Di panel publish, isi topic:
kodingindonesia/esp32/lampu/kontrolKirim pesan
ON→ relay berbunyi klik, lampu menyalaKirim 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"Cara Kerjanya
ESP32 connect ke WiFi lalu ke broker MQTT
ESP32 subscribe topic kontrol — menunggu perintah
Kamu publish
ON/OFFdari MQTT ExplorerFungsi
callbackMQTT()dipanggil → relay di GPIO 26 berubah state
Ini kebalikan dari artikel sensor sebelumnya (publish data). Di smart home, sering keduanya digabung: publish suhu + subscribe kontrol lampu/AC.
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.
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 dengan publish data DHT22 + subscribe kontrol dalam satu sketch
Kontrol otomatis: matikan lampu jika suhu > 30°C (logika di
callbackMQTTatau loop)Integrasi Home Assistant — switch MQTT native
Broker Mosquitto pribadi di Raspberry Pi dengan autentikasi
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.