#include <WiFi.h>
#include <PubSubClient.h>
#define PIR_PIN 14
#define LED_PIN 12
#define BUZZER_PIN 13
// WiFi (Wokwi)
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// MQTT Broker
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
// ---------------- CALLBACK --------------------
void callback(char* topic, byte* message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.println(topic);
String msg = "";
for (int i = 0; i < length; i++) {
msg += (char)message[i];
}
Serial.print("Message: ");
Serial.println(msg);
// If phone sends "BUZZER_ON"
if (String(topic) == "home/security/control") {
if (msg == "BUZZER_ON") {
digitalWrite(BUZZER_PIN, HIGH);
}
if (msg == "BUZZER_OFF") {
digitalWrite(BUZZER_PIN, LOW);
}
}
}
// ----------------------------------------------
void setup_wifi() {
Serial.print("Connecting to WiFi...");
WiFi.begin(ssid, password, 6);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" connected!");
}
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect("ESP32Security")) {
Serial.println("connected!");
client.subscribe("home/security/control"); // <-- Subscribe for commands
} else {
Serial.print("failed, rc=");
Serial.println(client.state());
delay(1500);
}
}
}
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback); // <-- Enable callback
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
int motion = digitalRead(PIR_PIN);
if (motion == HIGH) {
Serial.println("Motion Detected — sending alert!");
digitalWrite(LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
client.publish("home/security/motion", "Motion Detected!",true);
// client.publish("home/security/motion", "1", true);
delay(1200);
} else {
digitalWrite(LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
delay(100);
}