#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define PIR_PIN 13 // PIR sensor connected to GPIO13
#define BUZZER_PIN 12 // Buzzer connected to GPIO12
Adafruit_SSD1306 display(128, 64, &Wire, -1);
// AI-Based Motion Detection Variables
int motionCount = 0;
int aiThreshold = 5; // AI alert threshold (motion detected 5 times in a short period)
void setup() {
Serial.begin(115200); // Start Serial Communication with Wokwi WebSocket
Serial.println("Wokwi WebSocket Active!"); // Print a message to WebSocket
Serial.println("🌍 Connecting to WebSocket at: ws://localhost:8765");
pinMode(PIR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 allocation failed");
while (1);
}
// Display system startup message
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 10);
display.println("AI Security System Ready");
display.display();
Serial.println("System Initialized!");
}
void loop() {
int motionDetected = digitalRead(PIR_PIN);
if (motionDetected) {
Serial.println("MOTION_DETECTED"); // Send alert to Streamlit
digitalWrite(BUZZER_PIN, HIGH); // Activate buzzer for motion
delay(500);
digitalWrite(BUZZER_PIN, LOW);
// Increase AI motion detection count
motionCount++;
// Display alert on OLED
display.clearDisplay();
display.setCursor(0, 10);
display.println("Alert! Motion Detected");
display.display();
// AI-Based Analysis - Detect unusual activity
Serial.println("AI: Analyzing Motion Pattern...");
delay(2000);
// If motion happens frequently, raise an alert
if (motionCount >= aiThreshold) {
Serial.println("AI: Unusual Activity Detected!");
// Display Unusual Activity Alert on OLED
display.clearDisplay();
display.setCursor(0, 10);
display.println("AI: Unusual Activity!");
display.display();
// Activate buzzer for longer duration to signal an intruder
digitalWrite(BUZZER_PIN, HIGH);
delay(2000);
digitalWrite(BUZZER_PIN, LOW);
// Reset motion count after alert
motionCount = 0;
} else {
Serial.println("AI: Normal Movement");
display.setCursor(0, 30);
display.println("AI: Normal Activity");
display.display();
}
delay(2000);
} else {
// Show monitoring status when no motion is detected
display.clearDisplay();
display.setCursor(0, 10);
display.println("Monitoring...");
display.display();
}
delay(1000);
}