#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
#define RELAY_PIN 5
#define BUTTON_PIN 4
bool relayState = false;
bool lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;
const long debounceDelay = 200;
void setup() {
Serial.begin(115200);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
digitalWrite(RELAY_PIN, LOW);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
reconnect(); // Ensure MQTT connection at startup
}
void reconnect() {
while (!client.connected()) {
Serial.println("Attempting MQTT connection...");
if (client.connect("ESP32_Home_Automation")) {
Serial.println("Connected to MQTT Broker");
client.subscribe("home/relay");
} else {
Serial.print("Failed, retrying in 2s...");
delay(2000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
String message = String((char*)payload).substring(0, length);
if (message == "ON") {
digitalWrite(RELAY_PIN, HIGH);
relayState = true;
Serial.println("Relay ON");
} else if (message == "OFF") {
digitalWrite(RELAY_PIN, LOW);
relayState = false;
Serial.println("Relay OFF");
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Button Press Logic with Debounce
bool currentButtonState = digitalRead(BUTTON_PIN);
if (currentButtonState == LOW && lastButtonState == HIGH) {
unsigned long currentTime = millis();
if (currentTime - lastDebounceTime > debounceDelay) {
relayState = !relayState;
digitalWrite(RELAY_PIN, relayState);
if (relayState) {
client.publish("home/relay", "ON");
} else {
client.publish("home/relay", "OFF");
}
Serial.println("Button Pressed - Relay Toggled");
lastDebounceTime = currentTime;
}
}
lastButtonState = currentButtonState;
}