#include <WiFi.h>
#include <FirebaseESP32.h>
#include <addons/RTDBHelper.h>
#include <addons/TokenHelper.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define DATABASE_URL "https://smart-home-security-syst-c4d76-default-rtdb.europe-west1.firebasedatabase.app/"
#define API_KEY "AIzaSyCR2xvbQ2V9ObdHwwzDl3FCzWnPC8uwk9c"
#define PIR_PIN 14
#define LED_PIN 13
#define BUTTON_PIN 12
bool motionDetected = false;
bool systemArmed = false;
bool autoMode = true;
FirebaseData fbdo;
FirebaseConfig config;
FirebaseAuth auth;
void setup() {
Serial.begin(115200);
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
config.database_url = DATABASE_URL;
config.api_key = API_KEY;
Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true);
Firebase.setBool(fbdo, "/systemArmed", false);
Firebase.setBool(fbdo, "/autoMode", true);
Firebase.setBool(fbdo, "/motionDetected", false);
}
void loop() {
static bool lastButtonState = HIGH;
bool currentButtonState = digitalRead(BUTTON_PIN);
if (currentButtonState == LOW && lastButtonState == HIGH) {
systemArmed = !systemArmed;
Firebase.setBool(fbdo, "/systemArmed", systemArmed);
Serial.println(systemArmed ? "System ARMED" : "System DISARMED");
delay(300);
}
lastButtonState = currentButtonState;
motionDetected = digitalRead(PIR_PIN);
Serial.print("PIR Value: ");
Serial.println(motionDetected);
Firebase.setBool(fbdo, "/motionDetected", motionDetected);
Firebase.getBool(fbdo, "/autoMode");
autoMode = fbdo.boolData();
Firebase.getBool(fbdo, "/systemArmed");
systemArmed = fbdo.boolData();
if (autoMode && systemArmed && motionDetected) {
digitalWrite(LED_PIN, HIGH);
Firebase.setString(fbdo, "/status", "Motion Detected!");
delay(2000);
} else {
digitalWrite(LED_PIN, LOW);
Firebase.setString(fbdo, "/status", "Idle");
}
delay(300);
}