#include #include #include #include #include #include #include #include // WiFi Configuration #define WIFI_SSID "ratio" #define WIFI_PASSWORD "123456789" // Firebase Configuration #define API_KEY "AIzaSyB8qf7aeI7F5l7d1NDhRQrNNLW8aPaOkl4" #define DATABASE_URL "https://alarmeesp32-2ca19-default-rtdb.europe-west1.firebasedatabase.app" #define USER_EMAIL "alarm@alarm.bip" #define USER_PASSWORD "123456" #define FIREBASE_USE_PSRAM // Déclaration Firebase FirebaseData fbdo, stream; FirebaseAuth auth; FirebaseConfig config; // Variables Alarme volatile bool motionDetected = false; bool armed = false, triggered = false; // NTP pour la gestion des logs WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org"); // Gestion de l'alarme void IRAM_ATTR onMotionDetected() { motionDetected = true; } // Ajout de logs Firebase void addLog(const char* messageLog) { FirebaseJson logData; timeClient.update(); char timestampISO[25]; time_t epochTime = timeClient.getEpochTime(); strftime(timestampISO, sizeof(timestampISO), "%Y-%m-%dT%H:%M:%SZ", gmtime(&epochTime)); logData.add("timestamp", timestampISO); logData.add("sender", "ALARM"); logData.add("message", messageLog); if (!Firebase.RTDB.pushJSON(&fbdo, "/Alarm/logs", &logData)) { Serial.println("❌ Erreur ajout log Firebase : " + fbdo.errorReason()); } } // Gestion des mises à jour Firebase void streamCallback(FirebaseStream data) { Serial.printf("Firebase Update - Path: %s, Data: %s\n", data.dataPath().c_str(), data.stringData().c_str()); if (data.dataPath() == "/armed") { armed = data.boolData(); Serial.printf("🔒 Alarme %s\n", armed ? "activée" : "désactivée"); addLog(armed ? "Alarme armée" : "Alarme désarmée"); } else if (data.dataPath() == "/triggered") { triggered = data.boolData(); if (!armed) addLog("Alarme désactivée à distance"); } } void setup() { Serial.begin(115200); // Connexion WiFi WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println("\n✅ WiFi connecté !"); // Initialisation Firebase config.api_key = API_KEY; config.database_url = DATABASE_URL; auth.user.email = USER_EMAIL; auth.user.password = USER_PASSWORD; Firebase.begin(&config, &auth); Firebase.reconnectWiFi(true); // Stream Firebase if (!Firebase.RTDB.beginStream(&stream, "/Alarm")) { Serial.printf("🔥 Erreur stream: %s\n", stream.errorReason().c_str()); } Firebase.RTDB.setStreamCallback(&stream, streamCallback, nullptr); Firebase.RTDB.setBool(&fbdo, "/Alarm/triggered", false); Firebase.RTDB.setBool(&fbdo, "/Alarm/armed", false); addLog("Alarme connectée"); // Configuration NTP timeClient.begin(); // Configuration des capteurs pinMode(A2, INPUT); pinMode(D2, OUTPUT); attachInterrupt(digitalPinToInterrupt(A2), onMotionDetected, RISING); blinkSlowGreen(); } void loop() { Firebase.ready(); if (armed) { blinkSlowRed(); if (motionDetected && !triggered) { motionDetected = false; Serial.println("🎯 Mouvement détecté !"); blinkFastRed(); startSirene(); Firebase.RTDB.setBool(&fbdo, "/Alarm/triggered", true); triggered = true; addLog("Mouvement détecté, alarme déclenchée"); } } if (!triggered) { stopSirene(); if (!armed) blinkSlowGreen(); } else { startSirene(); blinkFastRed(); } updateLed(); updateSirene(); }