/*
* ESP32-CAM Security Camera with Motion Detection
*
* Features:
* - PIR Motion Sensor Detection
* - LED Status Indicators (Red=Motion Detected, Green=Standby)
* - Buzzer Alert System
* - Serial Monitoring
* - Reset Button
*
* Note: This is a simplified version for Wokwi simulation
* For real ESP32-CAM, you'll need to add camera initialization
*/
// Pin Definitions
#define PIR_PIN 13 // PIR Motion Sensor
#define RED_LED 12 // Motion Detected Indicator
#define GREEN_LED 14 // Standby/Ready Indicator
#define BUZZER_PIN 27 // Alert Buzzer
#define RESET_BTN 15 // Manual Reset Button
// System Variables
bool motionDetected = false;
bool systemArmed = true;
unsigned long lastMotionTime = 0;
unsigned long alertDuration = 5000; // Alert duration in milliseconds
int motionCount = 0;
// Timing variables
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
void setup() {
// Initialize Serial Monitor
Serial.begin(115200);
Serial.println("\n\n=================================");
Serial.println("ESP32-CAM Security System");
Serial.println("Motion Detection Active");
Serial.println("=================================\n");
// Configure pins
pinMode(PIR_PIN, INPUT);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RESET_BTN, INPUT_PULLUP);
// Initial state - System Ready
digitalWrite(GREEN_LED, HIGH);
digitalWrite(RED_LED, LOW);
digitalWrite(BUZZER_PIN, LOW);
Serial.println("✓ System Initialized");
Serial.println("✓ Sensors Ready");
Serial.println("✓ Monitoring Started\n");
// Warm-up delay for PIR sensor
Serial.println("Warming up PIR sensor...");
for(int i = 5; i > 0; i--) {
Serial.print(i);
Serial.print("... ");
delay(1000);
}
Serial.println("\n✓ System Armed!\n");
}
void loop() {
// Read PIR sensor
int pirState = digitalRead(PIR_PIN);
// Check for motion
if (pirState == HIGH && systemArmed) {
if (!motionDetected) {
// Motion just detected
motionDetected = true;
lastMotionTime = millis();
motionCount++;
// Trigger alarm
activateAlert();
// Log event
logMotionEvent();
}
}
// Check if alert duration has passed
if (motionDetected && (millis() - lastMotionTime > alertDuration)) {
deactivateAlert();
motionDetected = false;
}
// Continuous alert while motion detected
if (motionDetected && pirState == HIGH) {
lastMotionTime = millis(); // Reset timer
}
// Check reset button
if (digitalRead(RESET_BTN) == LOW) {
delay(50); // Debounce
if (digitalRead(RESET_BTN) == LOW) {
resetSystem();
while(digitalRead(RESET_BTN) == LOW); // Wait for release
}
}
delay(100); // Small delay for stability
}
void activateAlert() {
// Turn on red LED
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
// Activate buzzer with pattern
for(int i = 0; i < 3; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delay(200);
digitalWrite(BUZZER_PIN, LOW);
delay(100);
}
Serial.println("\n╔════════════════════════════════╗");
Serial.println("║ ⚠️ MOTION DETECTED! ⚠️ ║");
Serial.println("╚════════════════════════════════╝");
}
void deactivateAlert() {
// Turn off red LED, turn on green LED
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
digitalWrite(BUZZER_PIN, LOW);
Serial.println("\n✓ Alert cleared - System back to standby\n");
}
void logMotionEvent() {
Serial.println("\n--- Motion Event Log ---");
Serial.print("Event #: ");
Serial.println(motionCount);
Serial.print("Timestamp: ");
Serial.print(millis() / 1000);
Serial.println(" seconds");
Serial.print("Status: ");
Serial.println("MOTION ACTIVE");
Serial.println("Action: Alert triggered");
Serial.println("------------------------\n");
}
void resetSystem() {
Serial.println("\n>>> SYSTEM RESET <<<");
// Reset all outputs
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BUZZER_PIN, LOW);
// Blink all LEDs
for(int i = 0; i < 3; i++) {
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, HIGH);
delay(200);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
delay(200);
}
// Reset variables
motionDetected = false;
motionCount = 0;
// Return to ready state
digitalWrite(GREEN_LED, HIGH);
Serial.println("✓ System reset complete");
Serial.println("✓ Motion counter cleared");
Serial.println("✓ System re-armed\n");
}
// Additional helper function for status display
void printSystemStatus() {
Serial.println("\n=== SYSTEM STATUS ===");
Serial.print("Armed: ");
Serial.println(systemArmed ? "YES" : "NO");
Serial.print("Motion Detected: ");
Serial.println(motionDetected ? "YES" : "NO");
Serial.print("Total Detections: ");
Serial.println(motionCount);
Serial.print("Uptime: ");
Serial.print(millis() / 1000);
Serial.println(" seconds");
Serial.println("====================\n");
}