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.org port 1883

  • Topic kontrol: kodingindonesia/esp32/lampu/kontrol

  • Pesan: ON atau OFF (huruf besar, tanpa spasi)

Broker bukan websitetest.mosquitto.org tidak 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

  1. Upload kode ke ESP32, buka Serial Monitor (115200 baud)

  2. Buka MQTT Explorer → connect ke test.mosquitto.org:1883

  3. Di panel publish, isi topic: kodingindonesia/esp32/lampu/kontrol

  4. Kirim pesan ON → relay berbunyi klik, lampu menyala

  5. 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"

Cara Kerjanya

  1. ESP32 connect ke WiFi lalu ke broker MQTT

  2. ESP32 subscribe topic kontrol — menunggu perintah

  3. Kamu publish ON/OFF dari MQTT Explorer

  4. Fungsi 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 callbackMQTT atau 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.