This commit is contained in:
PC-PAUL\paulf 2025-04-03 12:11:38 +02:00
parent afeaa3dd57
commit c50c1077dd
3 changed files with 176 additions and 128 deletions

View File

@ -1,158 +1,206 @@
#include <Arduino.h> #include <Arduino.h>
#include <WiFi.h> #include <WiFi.h>
#include <Firebase_ESP_Client.h> #include <Firebase_ESP_Client.h>
#include <ctrlLed.h> #include <ctrlLed.h>
#include <ctrlSpeaker.h> #include <ctrlSpeaker.h>
#include <branchements.h> #include <branchements.h>
#include <NTPClient.h> #include <NTPClient.h>
#include "PN532_HSU.h" #include "PN532_HSU.h"
#include "PN532.h" #include "PN532.h"
#include "NfcAdapter.h" #include "NfcAdapter.h"
#include "NfcTag.h"
#include <Wire.h>
#include "NfcTag.h" // WiFi Configuration
#include <Wire.h> #define WIFI_SSID "ratio"
#define WIFI_PASSWORD "123456789"
// WiFi Configuration // Firebase Configuration
#define WIFI_SSID "ratio" #define API_KEY "AIzaSyB8qf7aeI7F5l7d1NDhRQrNNLW8aPaOkl4"
#define WIFI_PASSWORD "123456789" #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
// Firebase Configuration // Cooldown en millisecondes pour la vérification NFC
#define API_KEY "AIzaSyB8qf7aeI7F5l7d1NDhRQrNNLW8aPaOkl4" #define NFC_COOLDOWN 1000
#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 // Déclaration Firebase
FirebaseData fbdo, stream; FirebaseData fbdo, stream;
FirebaseAuth auth; FirebaseAuth auth;
FirebaseConfig config; FirebaseConfig config;
//NFC // NFC
PN532_HSU pn532hsu(Serial1); PN532_HSU pn532hsu(Serial1);
NfcAdapter nfc = NfcAdapter(pn532hsu); NfcAdapter nfc(pn532hsu);
// Variables Alarme // Variables Alarme
volatile bool motionDetected = false; volatile bool motionDetected = false;
bool armed = false, triggered = false; bool armed = false, triggered = false;
// NTP pour la gestion des logs // NTP pour la gestion des logs
WiFiUDP ntpUDP; WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org"); NTPClient timeClient(ntpUDP, "pool.ntp.org");
// Gestion de l'alarme // Variable pour le cooldown NFC
void IRAM_ATTR onMotionDetected() { unsigned long lastNfcCheck = 0;
motionDetected = true;
}
// Ajout de logs Firebase (sans récupérer les données) void IRAM_ATTR onMotionDetected() {
void addLog(const char* messageLog) { motionDetected = true;
timeClient.update(); }
char timestampISO[25];
time_t epochTime = timeClient.getEpochTime();
strftime(timestampISO, sizeof(timestampISO), "%Y-%m-%dT%H:%M:%SZ", gmtime(&epochTime));
FirebaseJson logData; void addLog(const char* messageLog) {
logData.add("timestamp", timestampISO); timeClient.update();
logData.add("sender", "ALARM"); char timestampISO[25];
logData.add("message", messageLog); time_t epochTime = timeClient.getEpochTime();
strftime(timestampISO, sizeof(timestampISO), "%Y-%m-%dT%H:%M:%SZ", gmtime(&epochTime));
// Pousser les logs sans vérifier la réponse pour économiser la mémoire FirebaseJson logData;
Firebase.RTDB.pushJSON(&fbdo, "/Alarm/logs", &logData); logData.add("timestamp", timestampISO);
} logData.add("sender", "ALARM");
logData.add("message", messageLog);
void streamCallback(FirebaseStream data) { Firebase.RTDB.pushJSON(&fbdo, "/Alarm/logs", &logData);
Serial.printf("🔥 Firebase Update - Path: %s\n", data.dataPath().c_str()); }
if (data.dataType() == "boolean") { // Vérifie qu'on reçoit bien un booléen void streamCallback(FirebaseStream data) {
if (data.dataPath() == "/armed") { if (data.dataType() == "boolean") {
armed = data.boolData(); if (data.dataPath() == "/armed") {
Serial.printf("🔒 Alarme %s\n", armed ? "activée" : "désactivée"); armed = data.boolData();
addLog(armed ? "Alarme armée" : "Alarme désarmée"); addLog(armed ? "Alarme armee" : "Alarme desarmee");
} } else if (data.dataPath() == "/triggered") {
else if (data.dataPath() == "/triggered") { triggered = data.boolData();
triggered = data.boolData(); if (!armed)
if (!armed) addLog("Alarme désactivée à distance"); addLog("Alarme desactivee a distance");
}
} }
}
}
// Cette fonction interroge Firebase pour vérifier si le badge existe
void handleRFIDTag(String scannedID) {
// Récupérer la liste des badges depuis Firebase
if (!Firebase.RTDB.getJSON(&fbdo, "/Alarm/badges")) {
// En cas d'erreur, on n'intervient pas
return;
}
FirebaseJson badgesJson = fbdo.jsonObject();
size_t count = badgesJson.iteratorBegin();
bool badgeFound = false;
String foundMsg = "";
int type;
String key;
String value;
FirebaseJsonData jsonData;
for (size_t i = 0; i < count; i++) {
if (badgesJson.iteratorGet(i, type, key, value) == 0) {
FirebaseJson badgeObj;
badgeObj.setJsonData(value);
if (badgeObj.get(jsonData, "id")) {
String badgeID = jsonData.stringValue;
if (badgeID == scannedID) {
if (triggered) {
triggered = false;
Firebase.RTDB.setBool(&fbdo, "/Alarm/state/triggered", false);
}
badgeFound = true;
FirebaseJsonData nameData;
badgeObj.get(nameData, "name");
if (armed) {
foundMsg = "Alarme désactivée par " + nameData.stringValue;
} else {
foundMsg = "Alarme activée par " + nameData.stringValue;
}
armed = !armed;
Firebase.RTDB.setBool(&fbdo, "/Alarm/state/armed", armed);
}
}
}
}
badgesJson.iteratorEnd();
if (!badgeFound) {
foundMsg = String("Badge inconnu : ") + scannedID;
}
addLog(foundMsg.c_str());
} }
void processNFCTag() { void processNFCTag() {
// Cooldown pour éviter des vérifications trop fréquentes
if (millis() - lastNfcCheck < NFC_COOLDOWN) {
return;
}
lastNfcCheck = millis();
if (nfc.tagPresent()) { if (nfc.tagPresent()) {
NfcTag tag = nfc.read(); NfcTag tag = nfc.read();
Serial.println("Tag détecté !"); String uid = tag.getUidString();
tag.print(); handleRFIDTag(uid);
} }
} }
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
// Connexion WiFi WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) {
while (WiFi.status() != WL_CONNECTED) { delay(500);
Serial.print("."); }
delay(500); Serial.println("WiFi connecte");
}
Serial.println("\n✅ WiFi connecté !");
// Initialisation Firebase config.api_key = API_KEY;
config.api_key = API_KEY; config.database_url = DATABASE_URL;
config.database_url = DATABASE_URL; auth.user.email = USER_EMAIL;
auth.user.email = USER_EMAIL; auth.user.password = USER_PASSWORD;
auth.user.password = USER_PASSWORD; Firebase.begin(&config, &auth);
Firebase.begin(&config, &auth); Firebase.reconnectWiFi(true);
Firebase.reconnectWiFi(true);
// Stream Firebase if (!Firebase.RTDB.beginStream(&stream, "/Alarm/state")) {
if (!Firebase.RTDB.beginStream(&stream, "/Alarm/state")) { Serial.printf("Erreur stream: %s\n", stream.errorReason().c_str());
Serial.printf("🔥 Erreur stream: %s\n", stream.errorReason().c_str()); }
} Firebase.RTDB.setStreamCallback(&stream, streamCallback, nullptr);
Firebase.RTDB.setStreamCallback(&stream, streamCallback, nullptr); Firebase.RTDB.setBool(&fbdo, "/Alarm/state/triggered", false);
Firebase.RTDB.setBool(&fbdo, "/Alarm/state/triggered", false); Firebase.RTDB.setBool(&fbdo, "/Alarm/state/armed", false);
Firebase.RTDB.setBool(&fbdo, "/Alarm/state/armed", false); addLog("Alarme connectee");
addLog("Alarme connectée"); timeClient.begin();
Serial1.begin(9600, SERIAL_8N1, RX, TX);
nfc.begin();
Serial.println("NFC initialise");
// Configuration NTP pinMode(A2, INPUT);
timeClient.begin(); pinMode(D2, OUTPUT);
attachInterrupt(digitalPinToInterrupt(A2), onMotionDetected, RISING);
blinkSlowGreen();
}
Serial1.begin(9600, SERIAL_8N1, RX, TX); void loop() {
nfc.begin(); Firebase.ready();
Serial.println("\n✅ NFC Initialisé"); processNFCTag();
// Configuration des capteurs if (armed) {
pinMode(A2, INPUT); blinkSlowRed();
pinMode(D2, OUTPUT); if (motionDetected && !triggered) {
attachInterrupt(digitalPinToInterrupt(A2), onMotionDetected, RISING); motionDetected = false;
blinkFastRed();
startSirene();
Firebase.RTDB.setBool(&fbdo, "/Alarm/state/triggered", true);
triggered = true;
addLog("Mouvement detecte, alarme declenchee");
}
} else if (!triggered) {
stopSirene();
if (!armed)
blinkSlowGreen(); blinkSlowGreen();
} else {
startSirene();
blinkFastRed();
} }
void loop() { updateLed();
Firebase.ready(); updateSirene();
}
if (armed) {
blinkSlowRed();
if (motionDetected && !triggered) {
motionDetected = false;
Serial.println("🎯 Mouvement détecté !");
blinkFastRed();
startSirene();
Firebase.RTDB.setBool(&fbdo, "/Alarm/state/triggered", true);
triggered = true;
addLog("Mouvement détecté, alarme déclenchée");
}
}
if (!triggered) {
stopSirene();
if (!armed) blinkSlowGreen();
} else {
startSirene();
blinkFastRed();
}
updateLed();
updateSirene();
}

View File

@ -8,7 +8,7 @@
#define D3 32 #define D3 32
#define D4 15 #define D4 15
#define D5 33 #define D5 33
#define RX 16 #define RX 7
#define TX 17 #define TX 8
#define SCL 22 #define SCL 22
#define SDA 23 #define SDA 23

View File