#include <WiFi.h> // Library untuk koneksi WiFi
#include <PubSubClient.h> // Library untuk komunikasi MQTT
// --------------------------------------------
// Konfigurasi WiFi dan MQTT Broker
// --------------------------------------------
const char* ssid = "Wokwi-GUEST"; // Nama WiFi yang digunakan
const char* password = ""; // Password WiFi
const char* mqtt_server = "broker.emqx.io"; // Alamat broker MQTT publik
WiFiClient espClient; // Membuat objek WiFi client
PubSubClient client(espClient); // Objek MQTT client memakai WiFi client
int led = 22; // Pin GPIO 22 sebagai output untuk LED
char perintah; // Variabel untuk menyimpan perintah ON/OFF dari MQTT
// --------------------------------------------
// Fungsi reconnect(): Menghubungkan kembali ke broker MQTT
// --------------------------------------------
void reconnect() {
// Loop sampai terkoneksi
while (!client.connected()) {
Serial.print("Menghubungkan ke MQTT...");
// Membuat ID client unik untuk koneksi ke broker
if (client.connect("ESP32Client-komang12345!%%")) {
Serial.println("terhubung!");
// Subscribe ke topik tertentu untuk menerima perintah
client.subscribe("/kamar/lampu/");
} else {
// Jika gagal konek, tampilkan kode error
Serial.print("Gagal, rc=");
Serial.print(client.state());
Serial.println(" coba lagi dalam 5 detik");
delay(5000); // Retry setiap 5 detik
}
}
}
// --------------------------------------------
// Fungsi setup(): Dieksekusi sekali saat awal
// --------------------------------------------
void setup() {
Serial.begin(115200); // Memulai serial monitor
WiFi.begin(ssid, password, 6); // Mulai koneksi WiFi pada channel 6
Serial.print("Menghubungkan ke WiFi...");
while (WiFi.status() != WL_CONNECTED) { // Cek status koneksi
delay(500);
Serial.print(".");
}
Serial.println(" terhubung!");
client.setServer(mqtt_server, 1883); // Set alamat broker MQTT dan port
client.setCallback(callback); // Jika ada pesan masuk, jalankan fungsi callback()
pinMode(led, OUTPUT); // Set pin LED sebagai output
}
// --------------------------------------------
// Fungsi callback(): Dipanggil saat pesan MQTT diterima
// --------------------------------------------
void callback(char* topic, byte* payload, unsigned int length) {
// Tampilkan topik dan isi pesan ke serial monitor
Serial.print("Pesan diterima [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]); // Cetak karakter pesan
}
Serial.println();
// Menyimpan hanya karakter pertama dari payload
if (length > 0) {
perintah = (char)payload[0]; // '1' atau '0'
Serial.println(perintah); // Debug: tampilkan perintah
}
}
// --------------------------------------------
// Fungsi loop(): Berjalan terus menerus
// --------------------------------------------
void loop() {
// Jika belum terkoneksi ke MQTT broker → lakukan reconnect
if (!client.connected()) {
reconnect();
}
client.loop(); // Proses pesan MQTT secara rutin
// --------------------------------------------
// Logika kendali LED berdasarkan perintah MQTT
// --------------------------------------------
if (perintah == '1') // Jika menerima '1'
{
digitalWrite(led, HIGH); // LED menyala
}
else if (perintah == '0') // Jika menerima '0'
{
digitalWrite(led, LOW); // LED mati
}
}