#include <WiFi.h>
#include <MQTT.h>
// Konfigurasi WiFi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Konfigurasi MQTT
const char* mqttServer = "mountainrat662.cloud.shiftr.io";
const char* mqttUser = "mountainrat662";
const char* mqttPassword = "b0X48fxDejD3HhdU";
const int mqttPort = 1883;
// Pin LED
const int ledPins[] = {13, 12, 16, 17};
bool ledStates[] = {false, false, false, false}; // Menyimpan status LED
const int numLeds = sizeof(ledPins) / sizeof(ledPins[0]);
WiFiClient net;
MQTTClient client;
unsigned long lastPublishTime[numLeds] = {0}; // Menyimpan waktu terakhir pengiriman status
const unsigned long publishInterval = 500; // Interval minimum antar pengiriman (500 ms)
void setup() {
Serial.begin(115200);
for (int i = 0; i < numLeds; i++) {
pinMode(ledPins[i], OUTPUT);
digitalWrite(ledPins[i], LOW);
}
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi");
client.begin(mqttServer, mqttPort, net);
client.onMessage(messageReceived);
connectToMQTT();
client.subscribe("home/livingroom/lamp1");
client.subscribe("home/livingroom/lamp2");
client.subscribe("home/livingroom/lamp3");
client.subscribe("home/livingroom/lamp4");
}
void connectToMQTT() {
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect("ESP32Client", mqttUser, mqttPassword)) {
Serial.println("Connected to MQTT");
} else {
Serial.print("MQTT connection failed! State: ");
Serial.println(client.lastError());
delay(2000);
}
}
}
void messageReceived(String &topic, String &payload) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message: ");
Serial.println(payload);
int ledIndex = -1;
if (topic == "home/livingroom/lamp1") {
ledIndex = 0;
} else if (topic == "home/livingroom/lamp2") {
ledIndex = 1;
} else if (topic == "home/livingroom/lamp3") {
ledIndex = 2;
} else if (topic == "home/livingroom/lamp4") {
ledIndex = 3;
}
if (ledIndex != -1) {
controlLED(ledIndex, payload);
}
}
void controlLED(int ledIndex, String payload) {
bool newState = (payload == "ON");
// Ubah status hanya jika ada perubahan dan setelah interval minimum tercapai
if (ledStates[ledIndex] != newState && (millis() - lastPublishTime[ledIndex] >= publishInterval)) {
ledStates[ledIndex] = newState;
digitalWrite(ledPins[ledIndex], newState ? HIGH : LOW);
client.publish(("home/livingroom/lamp" + String(ledIndex + 1)).c_str(), newState ? "ON" : "OFF", true, 0);
lastPublishTime[ledIndex] = millis(); // Update waktu terakhir publish
}
}
void loop() {
client.loop();
delay(10);
if (!client.connected()) {
connectToMQTT();
}
}