#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>
// --- Wokwi Virtual WiFi ---
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// --- TELEGRAM CONFIG ---
const char* BOTtoken = "YOUR_BOT_TOKEN";
const char* CHAT_ID = "YOUR_CHAT_ID";
// --- ESP32-S3 PIN DEFINITIONS ---
const int PIN_SIREN = 12; // Red LED (Siren)
const int PIN_LIGHTS = 10; // White LED (Floodlights)
const int PIN_MOTION = 13; // Wired Motion (Green Button)
const int PIN_DOOR = 1; // Wired Door (Slide Switch)
const int PIN_WIRELESS = 2; // Wireless Receiver (Blue Button)
// --- VARIABLES ---
bool isAlarmActive = false;
bool isLightActive = false;
unsigned long timeAlarmStart = 0;
unsigned long timeLightStart = 0;
bool lastWirelessState = false;
WiFiClientSecure client;
UniversalTelegramBot bot(BOTtoken, client);
void setup() {
Serial.begin(115200);
// Set Outputs
pinMode(PIN_SIREN, OUTPUT);
pinMode(PIN_LIGHTS, OUTPUT);
// Set Inputs (INPUT_PULLUP is critical for simulation buttons)
pinMode(PIN_MOTION, INPUT_PULLUP);
pinMode(PIN_DOOR, INPUT_PULLUP);
pinMode(PIN_WIRELESS, INPUT_PULLUP);
Serial.println("--- ESP32-S3 SECURITY SYSTEM STARTING ---");
Serial.print("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(" Connected!");
client.setInsecure();
}
void loop() {
unsigned long now = millis();
// 1. SIMULATE WIRED MOTION (Green Button)
// Logic: LOW = Pressed (Active)
if (digitalRead(PIN_MOTION) == LOW) {
Serial.println(">> Wired Motion Triggered!");
triggerLights("Movement in Garden");
delay(500); // Debounce
}
// 2. SIMULATE WIRED DOOR (Slide Switch)
// Logic: HIGH = Switch Open (Door Open/Magnet Removed)
if (digitalRead(PIN_DOOR) == HIGH) {
if (!isAlarmActive) {
Serial.println(">> DOOR OPENED!");
triggerFullAlarm("Front Door Breach!");
}
}
// 3. SIMULATE WIRELESS RECEIVER (Blue Button)
bool currentWireless = digitalRead(PIN_WIRELESS);
if (currentWireless == LOW && lastWirelessState == HIGH) {
Serial.println(">> [Wireless Signal: ID 112233]");
triggerLights("Driveway Wireless Sensor");
}
lastWirelessState = currentWireless;
// --- TIMERS ---
if (isAlarmActive && (now - timeAlarmStart >= 10000)) { // 10s for test
digitalWrite(PIN_SIREN, LOW);
isAlarmActive = false;
Serial.println("-- Siren Timed Out --");
}
if (isLightActive && (now - timeLightStart >= 15000)) { // 15s for test
digitalWrite(PIN_LIGHTS, LOW);
isLightActive = false;
Serial.println("-- Lights Timed Out --");
}
}
// --- ACTIONS ---
void triggerFullAlarm(String msg) {
if (!isAlarmActive) {
Serial.println("ALARM ACTIVE: " + msg);
// bot.sendMessage(CHAT_ID, "🚨 " + msg, "");
digitalWrite(PIN_SIREN, HIGH);
digitalWrite(PIN_LIGHTS, HIGH);
isAlarmActive = true;
isLightActive = true;
timeAlarmStart = millis();
timeLightStart = millis();
}
}
void triggerLights(String msg) {
if (!isLightActive) {
Serial.println("LIGHTS ON: " + msg);
// bot.sendMessage(CHAT_ID, "👀 " + msg, "");
digitalWrite(PIN_LIGHTS, HIGH);
isLightActive = true;
timeLightStart = millis();
}
timeLightStart = millis(); // Reset timer if motion continues
}