Amélioration performances et fix bug seul le premier tag récupérer

This commit is contained in:
PC-PAUL\paulf 2025-04-04 16:06:23 +02:00
parent c50c1077dd
commit b0796f698b

View File

@ -8,8 +8,8 @@
#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 <Wire.h>
#include <ArduinoJson.h>
// WiFi Configuration // WiFi Configuration
#define WIFI_SSID "ratio" #define WIFI_SSID "ratio"
@ -22,136 +22,133 @@
#define USER_PASSWORD "123456" #define USER_PASSWORD "123456"
#define FIREBASE_USE_PSRAM #define FIREBASE_USE_PSRAM
// Cooldown en millisecondes pour la vérification NFC // Chemins Firebase
#define NFC_COOLDOWN 1000 #define PATH_STATE "/Alarm/state"
#define PATH_TRIGGERED PATH_STATE "/triggered"
#define PATH_ARMED PATH_STATE "/armed"
#define PATH_LOGS "/Alarm/logs"
#define PATH_BADGES "/Alarm/badges"
// Déclaration Firebase // Cooldown pour le badge NFC
FirebaseData fbdo, stream; #define NFC_COOLDOWN 1000
FirebaseAuth auth;
FirebaseConfig config;
// NFC // NFC
PN532_HSU pn532hsu(Serial1); PN532_HSU pn532hsu(Serial1);
NfcAdapter nfc(pn532hsu); NfcAdapter nfc(pn532hsu);
// Variables Alarme // Firebase
volatile bool motionDetected = false; FirebaseData fbdo, stream;
bool armed = false, triggered = false; FirebaseAuth auth;
FirebaseConfig config;
// NTP pour la gestion des logs // NTP
WiFiUDP ntpUDP; WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org"); NTPClient timeClient(ntpUDP, "pool.ntp.org");
// Variable pour le cooldown NFC // Variables
volatile bool motionDetected = false;
bool armed = false, triggered = false;
unsigned long lastNfcCheck = 0; unsigned long lastNfcCheck = 0;
void IRAM_ATTR onMotionDetected() { void IRAM_ATTR onMotionDetected() {
motionDetected = true; motionDetected = true;
} }
void addLog(const char* messageLog) { void addLog(const char* message) {
timeClient.update(); timeClient.update();
char timestampISO[25]; char timestampISO[25];
time_t epochTime = timeClient.getEpochTime(); time_t epochTime = timeClient.getEpochTime();
strftime(timestampISO, sizeof(timestampISO), "%Y-%m-%dT%H:%M:%SZ", gmtime(&epochTime)); strftime(timestampISO, sizeof(timestampISO), "%Y-%m-%dT%H:%M:%SZ", gmtime(&epochTime));
FirebaseJson logData; FirebaseJson log;
logData.add("timestamp", timestampISO); log.set("timestamp", timestampISO);
logData.add("sender", "ALARM"); log.set("sender", "ALARM");
logData.add("message", messageLog); log.set("message", message);
Firebase.RTDB.pushJSON(&fbdo, PATH_LOGS, &log);
}
Firebase.RTDB.pushJSON(&fbdo, "/Alarm/logs", &logData); void updateAlarmState(bool newArmed, bool newTriggered) {
FirebaseJson stateUpdate;
stateUpdate.set("armed", newArmed);
stateUpdate.set("triggered", newTriggered);
Firebase.RTDB.updateNode(&fbdo, PATH_STATE, &stateUpdate);
} }
void streamCallback(FirebaseStream data) { void streamCallback(FirebaseStream data) {
if (data.dataType() == "boolean") { if (data.dataType() != "boolean") return;
if (data.dataPath() == "/armed") { if (data.dataPath() == "/armed") {
armed = data.boolData(); armed = data.boolData();
addLog(armed ? "Alarme armee" : "Alarme desarmee"); addLog(armed ? "Alarme armée" : "Alarme désarmée");
} else if (data.dataPath() == "/triggered") { } else if (data.dataPath() == "/triggered") {
triggered = data.boolData(); triggered = data.boolData();
if (!armed) if (!armed)
addLog("Alarme desactivee a distance"); addLog("Alarme désactivée à distance");
}
} }
} }
// Cette fonction interroge Firebase pour vérifier si le badge existe
void handleRFIDTag(String scannedID) { void handleRFIDTag(const String& scannedID) {
// Récupérer la liste des badges depuis Firebase // Récupérer la liste des badges depuis Firebase
if (!Firebase.RTDB.getJSON(&fbdo, "/Alarm/badges")) { if (!Firebase.RTDB.getJSON(&fbdo, PATH_BADGES)) return;
// En cas d'erreur, on n'intervient pas
String jsonStr = fbdo.jsonObject().raw();
// Estimez la capacité en fonction de la taille de votre JSON
const size_t capacity = JSON_OBJECT_SIZE(10) + 512;
DynamicJsonDocument doc(capacity);
DeserializationError error = deserializeJson(doc, jsonStr);
if (error) {
addLog("Erreur parsing JSON badges");
return; return;
} }
FirebaseJson badgesJson = fbdo.jsonObject();
size_t count = badgesJson.iteratorBegin();
bool badgeFound = false; bool badgeFound = false;
String foundMsg = ""; String logMessage;
// Itération sur l'objet JSON
int type; for (JsonPair kv : doc.as<JsonObject>()) {
String key; JsonObject badge = kv.value().as<JsonObject>();
String value; const char* id = badge["id"];
FirebaseJsonData jsonData; const char* name = badge["name"];
if (scannedID == String(id)) {
for (size_t i = 0; i < count; i++) { badgeFound = true;
if (badgesJson.iteratorGet(i, type, key, value) == 0) { // Si triggered est vrai, réinitialise-le
FirebaseJson badgeObj;
badgeObj.setJsonData(value);
if (badgeObj.get(jsonData, "id")) {
String badgeID = jsonData.stringValue;
if (badgeID == scannedID) {
if (triggered) { if (triggered) {
triggered = false; triggered = false;
Firebase.RTDB.setBool(&fbdo, "/Alarm/state/triggered", false); Firebase.RTDB.setBool(&fbdo, PATH_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;
} }
// Inverse l'état armed
armed = !armed; armed = !armed;
Firebase.RTDB.setBool(&fbdo, "/Alarm/state/armed", armed); Firebase.RTDB.setBool(&fbdo, PATH_ARMED, armed);
logMessage = String(armed ? "Alarme activée par " : "Alarme désactivée par ") + name;
break;
} }
} }
}
}
badgesJson.iteratorEnd();
if (!badgeFound) { if (!badgeFound) {
foundMsg = String("Badge inconnu : ") + scannedID; logMessage = String("Badge inconnu : ") + scannedID;
} }
addLog(foundMsg.c_str());
addLog(logMessage.c_str());
} }
void processNFCTag() { void processNFCTag() {
// Cooldown pour éviter des vérifications trop fréquentes if (millis() - lastNfcCheck < NFC_COOLDOWN) return;
if (millis() - lastNfcCheck < NFC_COOLDOWN) {
return;
}
lastNfcCheck = millis(); lastNfcCheck = millis();
if (nfc.tagPresent()) { if (nfc.tagPresent()) {
NfcTag tag = nfc.read(); handleRFIDTag(nfc.read().getUidString());
String uid = tag.getUidString();
handleRFIDTag(uid);
} }
} }
void setup() { void connectToWiFi() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD); WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) { while (WiFi.status() != WL_CONNECTED) delay(500);
delay(500); Serial.println("WiFi connecté");
} }
Serial.println("WiFi connecte");
void setupFirebase() {
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;
@ -159,22 +156,29 @@ void setup() {
Firebase.begin(&config, &auth); Firebase.begin(&config, &auth);
Firebase.reconnectWiFi(true); Firebase.reconnectWiFi(true);
if (!Firebase.RTDB.beginStream(&stream, "/Alarm/state")) { if (!Firebase.RTDB.beginStream(&stream, PATH_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/armed", false); updateAlarmState(false, false);
addLog("Alarme connectee"); addLog("Alarme connectée");
}
void setup() {
Serial.begin(115200);
connectToWiFi();
setupFirebase();
timeClient.begin(); timeClient.begin();
Serial1.begin(9600, SERIAL_8N1, RX, TX); Serial1.begin(9600, SERIAL_8N1, RX, TX);
nfc.begin(); nfc.begin();
Serial.println("NFC initialise"); Serial.println("NFC initialisé");
pinMode(A2, INPUT); pinMode(A2, INPUT);
pinMode(D2, OUTPUT); pinMode(D2, OUTPUT);
attachInterrupt(digitalPinToInterrupt(A2), onMotionDetected, RISING); attachInterrupt(digitalPinToInterrupt(A2), onMotionDetected, RISING);
blinkSlowGreen(); blinkSlowGreen();
} }
@ -188,18 +192,19 @@ void loop() {
motionDetected = false; motionDetected = false;
blinkFastRed(); blinkFastRed();
startSirene(); startSirene();
Firebase.RTDB.setBool(&fbdo, "/Alarm/state/triggered", true);
triggered = true; triggered = true;
addLog("Mouvement detecte, alarme declenchee"); Firebase.RTDB.setBool(&fbdo, PATH_TRIGGERED, true);
addLog("Mouvement détecté, alarme déclenchée");
} }
} else if (!triggered) {
stopSirene();
if (!armed)
blinkSlowGreen();
} else { } else {
stopSirene();
if (!triggered)
blinkSlowGreen();
else {
startSirene(); startSirene();
blinkFastRed(); blinkFastRed();
} }
}
updateLed(); updateLed();
updateSirene(); updateSirene();