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.

MQTT Explorer publish ON / OFF Mosquitto · :1883 test.mosquitto.org PUB ESP32 subscribe callbackMQTT() SUB Relay · GPIO 26 active LOW topic · .../lampu/kontrol perintah masuk · aktuator keluar · satu broker
Kamu publish dari Explorer → broker → ESP32 subscribe → relay. Pola kebalikan MQTT publish (#7).

Wiring Modul Relay ke ESP32

Modul relay umum (misalnya HW-483 / SRD-05VDC). Pin konsisten dengan proyek gabungan DHT22 + relay (#9):

ESP32 DevKit 5V GND GPIO 26 IN Relay 1ch modul 5V · active LOW VCC GND IN 5V→VCC · GND→GND · GPIO26→IN · COM/NO ke rangkaian lampu kecil Relay boros arus: supply 5V terpisah + GND common jika ESP32 restart
Wiring pin-ke-pin: VCC 5V, GND bersama, IN di GPIO 26.
  • 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.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.

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

  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"

Perintah mosquitto_pub dari paket Mosquitto — tersedia di Linux, Mac, dan Windows setelah install Mosquitto.

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 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 di loop().
  • Pesan on kecil juga OK: Kode memanggil toUpperCase()ON/off tetap dikenali.
  • rc=-2 saat connect MQTT: WiFi atau broker tidak terjangkau — cek internet.
  • rc=4 (bad credentials): test.mosquitto.org port 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

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.