#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define PIR_PIN 5
#define BUZZER_PIN 18
#define LED_PIN 19
#define BUTTON_PIN 21
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
const char* ssid = "Wokwi WiFi";
const char* password = "";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
bool motionDetected = false;
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Initialize OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 allocation failed");
for (;;);
}
display.clearDisplay();
setup_wifi();
client.setServer(mqtt_server, 1883);
}
void setup_wifi() {
Serial.print("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("Connected to WiFi!");
}
void loop() {
if (!client.connected()) {
reconnect_mqtt();
}
client.loop();
int motion = digitalRead(PIR_PIN);
if (motion == HIGH && !motionDetected) {
motionDetected = true;
Serial.println("🚨 Motion Detected! Sending Alert...");
digitalWrite(BUZZER_PIN, HIGH);
digitalWrite(LED_PIN, HIGH);
client.publish("surveillance/alert", "Motion Detected!");
// Display message on OLED
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(10, 30);
display.println("INTRUDER!");
display.display();
delay(3000);
digitalWrite(BUZZER_PIN, LOW);
}
if (digitalRead(BUTTON_PIN) == LOW) {
Serial.println("🔄 Resetting Alert...");
motionDetected = false;
digitalWrite(LED_PIN, LOW);
display.clearDisplay();
display.display();
}
}
void reconnect_mqtt() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect("ESP32Client")) {
Serial.println("Connected to MQTT!");
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5 seconds...");
delay(5000);
}
}
}