#include <WiFi.h>
#include <PubSubClient.h>
#include <Ticker.h>
#include <ArduinoJson.h>
// Informasi MQTT
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttBroker = "iot.egrotek.id";
const char* mqttPubTopic = "egrotek/pub/APPmI3YgR3vfymCfa04ET/DEVYH9qFm5yaGiXgj0BkR";
const char* mqttSubTopic = "egrotek/sub/APPmI3YgR3vfymCfa04ET/DEVYH9qFm5yaGiXgj0BkR";
const char* mqttID = "DEVYH9qFm5yaGiXgj0BkR";
const char* mqttUser = "ph0CMhmhF1NsPjSDKN";
const char* mqttPass = "RZtPsrEIfXDCFTJRm3";
uint16_t mqttPort = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
Ticker ticker;
const int ledPin = 2; // LED pin
volatile int setdelay = 1000; // Default delay 1 second
bool ledState = false;
void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
// Parse JSON payload
StaticJsonDocument<200> doc;
DeserializationError error = deserializeJson(doc, payload, length);
if (error) {
Serial.print("Failed to parse payload: ");
Serial.println(error.c_str());
return;
}
if (doc.containsKey("set_delay")) {
int new_delay = doc["set_delay"];
if (new_delay > 0 && new_delay <= 10000) { // Adjust upper limit as needed
setdelay = new_delay;
ticker.detach(); // Detach previous ticker
ticker.attach_ms(setdelay, toggle_led); // Reattach ticker with new delay
Serial.print("set_delay set to ");
Serial.println(setdelay);
} else {
Serial.println("Received Set_Delay value is not valid");
}
}
if (doc.containsKey("led")) {
bool newState = doc["led"];
ledState = newState;
digitalWrite(ledPin, ledState);
publishLedState(); // Publish the new state to MQTT
Serial.print("LED state set to ");
Serial.println(ledState);
}
}
void publishLedState() {
// Publish the LED state to the MQTT topic
StaticJsonDocument<200> doc;
doc["led"] = ledState;
char buffer[256];
size_t n = serializeJson(doc, buffer);
client.publish(mqttPubTopic, buffer, n);
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Attempt to connect
if (client.connect(mqttID, mqttUser, mqttPass)) {
Serial.println("connected");
// Once connected, subscribe to the topic
client.subscribe(mqttSubTopic);
// Publish initial LED state
publishLedState();
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void toggle_led() {
ledState = !ledState;
digitalWrite(ledPin, ledState);
publishLedState(); // Publish the new state to MQTT
}
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqttBroker, mqttPort);
client.setCallback(callback);
ticker.attach_ms(setdelay, toggle_led); // Initial ticker setup
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}