#include <WiFi.h>
#include <MQTT.h>
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
WiFiClient net;
MQTTClient client;
const int LED1 = 26;
const int LED2 = 27;
bool led1State = false;
bool led2State = false;
unsigned long lastMillis = 0;
unsigned long lastReconnectAttempt = 0;
void connect() {
Serial.print("Checking WiFi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.print("\nWiFi connected!");
Serial.println("\nConnecting to MQTT broker...");
while (!client.connect("esp32-client", "public", "public")) {
Serial.print(".");
delay(1000);
}
Serial.println("Connected to MQTT broker!");
// Subscribe to topics for controlling LEDs
client.subscribe("led/1/toggle");
client.subscribe("led/2/toggle");
}
void messageReceived(String &topic, String &payload) {
Serial.println("\nIncoming message:");
Serial.println("Topic: " + topic + ", Payload: " + payload);
bool newState;
if (payload == "ON") {
newState = true;
} else if (payload == "OFF") {
newState = false;
} else {
Serial.println("⚠️ Invalid payload! Use 'ON' or 'OFF'");
return; // keluar biar gak eksekusi lanjut
}
if (topic == "led/1/toggle") {
led1State = newState;
digitalWrite(LED1, led1State);
Serial.println("LED 1 set to " + String(led1State ? "ON" : "OFF"));
} else if (topic == "led/2/toggle") {
led2State = newState;
digitalWrite(LED2, led2State);
Serial.println("LED 2 set to " + String(led2State ? "ON" : "OFF"));
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, pass, 6);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
client.begin("kailaerb.cloud.shiftr.io", net);
client.onMessage(messageReceived);
connect();
}
void loop() {
client.loop();
delay(10); // Helps prevent WiFi instability
if (!client.connected()) {
unsigned long now = millis();
if (now - lastReconnectAttempt > 5000) {
lastReconnectAttempt = now;
Serial.println("Reconnecting to MQTT...");
connect();
}
return;
}
// Publish status every 5 seconds
if (millis() - lastMillis > 5000) {
lastMillis = millis();
String statusMsg = "ESP32 alive";
client.publish("status", statusMsg);
Serial.println("Published to topic 'status': " + statusMsg);
}
}