Files
AquaMasterMQTT/src/rfid.h
Carsten Graf 0223cceef8
Some checks failed
/ build (push) Has been cancelled
Button Simmulator, Frontend änderungen
2026-04-11 20:24:39 +02:00

192 lines
5.0 KiB
C

#pragma once
#include <Adafruit_PN532.h>
#include <Arduino.h>
#include <ArduinoJson.h>
#include <Wire.h>
// RFID Konfiguration - KORREKTE ESP32 Thing Plus Pins
#define SDA_PIN 23 // ESP32 Thing Plus SDA
#define SCL_PIN 22 // ESP32 Thing Plus SCL
#define IRQ_PIN 14
#define RST_PIN 15
// PN532 RFID Reader (mit IRQ und Reset-Pin)
Adafruit_PN532 nfc(IRQ_PIN, RST_PIN);
// RFID Variablen
bool rfidInitialized = false;
bool readingMode = false;
String lastReadUID = "";
unsigned long lastReadTime = 0;
// Hilfsfunktion um Reading-Mode zu prüfen
bool isRFIDReadingActive() { return readingMode; }
// Initialisiert den RFID-Reader
void setupRFID() {
// RFID-Hardware-Initialisierung deaktiviert (Leser aktuell nicht verwendet);
// spart Boot-Zeit durch den PN532-Probe-Timeout. Bei Bedarf Block unten
// wieder aktivieren.
Serial.println("RFID: Hardware-Init übersprungen (deaktiviert)");
rfidInitialized = false;
/*
// I2C starten mit korrekten Pins
Wire.begin(SDA_PIN, SCL_PIN, 100000);
delay(100);
// PN532 initialisieren
if (!nfc.begin()) {
Serial.println("RFID: PN532 nicht gefunden!");
return;
}
// Firmware prüfen
uint32_t versiondata = nfc.getFirmwareVersion();
if (!versiondata) {
Serial.println("RFID: Firmware nicht lesbar!");
return;
}
// SAM Config
nfc.SAMConfig();
rfidInitialized = true;
Serial.println("RFID: Setup erfolgreich!");
*/
}
// Prüft ob RFID funktioniert
bool checkRFID() {
if (!rfidInitialized) {
return false;
}
uint32_t versiondata = nfc.getFirmwareVersion();
return (versiondata != 0);
}
// Liest RFID-Karte - NICHT BLOCKIEREND
String readRFIDCard() {
if (!checkRFID()) {
return "";
}
uint8_t uid[] = {0, 0, 0, 0, 0, 0, 0};
uint8_t uidLength;
// Nicht-blockierender Aufruf mit sehr kurzer Timeout
uint8_t success =
nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength,
50); // 50ms Timeout statt Standard 100ms
if (!success) {
return ""; // Keine Karte oder Timeout
}
// UID zu String
String uidString = "";
for (uint8_t i = 0; i < uidLength; i++) {
if (i > 0)
uidString += ":";
if (uid[i] < 0x10)
uidString += "0";
uidString += String(uid[i], HEX);
}
uidString.toUpperCase();
Serial.println("RFID: " + uidString);
return uidString;
}
// RFID Loop - kontinuierliches Lesen wenn aktiviert (MQTT-optimiert)
void loopRFID() {
if (!readingMode) {
return; // Lesen nicht aktiviert
}
static unsigned long lastCheck = 0;
// Nur alle 300ms prüfen (weniger belastend für MQTT)
if (millis() - lastCheck < 300) {
return;
}
lastCheck = millis();
// Versuchen zu lesen (mit kurzer Timeout)
String uid = readRFIDCard();
if (uid.length() > 0) {
// Nur neue UIDs oder nach 2 Sekunden Pause
if (uid != lastReadUID || millis() - lastReadTime > 2000) {
lastReadUID = uid;
lastReadTime = millis();
Serial.println("RFID gelesen: " + uid);
}
}
}
// API Routes
void setupRFIDRoute(AsyncWebServer &server) {
// Toggle RFID Reading Mode
server.on("/api/rfid/toggle", HTTP_POST, [](AsyncWebServerRequest *request) {
readingMode = !readingMode;
DynamicJsonDocument response(200);
response["success"] = true;
response["reading_mode"] = readingMode;
response["message"] =
readingMode ? "RFID Lesen gestartet" : "RFID Lesen gestoppt";
String jsonString;
serializeJson(response, jsonString);
request->send(200, "application/json", jsonString);
});
// Einzelnes Lesen (wie vorher)
server.on("/api/rfid/read", HTTP_GET, [](AsyncWebServerRequest *request) {
String uid = readRFIDCard();
DynamicJsonDocument response(200);
if (uid.length() > 0) {
response["success"] = true;
response["uid"] = uid;
response["message"] = "Karte gelesen";
} else {
response["success"] = false;
response["error"] = "Keine Karte gefunden";
response["uid"] = "";
}
String jsonString;
serializeJson(response, jsonString);
request->send(200, "application/json", jsonString);
});
// Status und letzte gelesene UID
server.on("/api/rfid/status", HTTP_GET, [](AsyncWebServerRequest *request) {
DynamicJsonDocument response(300);
response["success"] = true;
response["rfid_initialized"] = rfidInitialized;
response["reading_mode"] = readingMode;
response["last_uid"] = lastReadUID;
response["message"] =
readingMode ? "RFID Lesen aktiv" : "RFID Lesen inaktiv";
String jsonString;
serializeJson(response, jsonString);
request->send(200, "application/json", jsonString);
});
// UID zurücksetzen (nach erfolgreichem Lesen)
server.on("/api/rfid/clear", HTTP_POST, [](AsyncWebServerRequest *request) {
lastReadUID = ""; // UID zurücksetzen
lastReadTime = 0; // Zeit auch zurücksetzen
DynamicJsonDocument response(200);
response["success"] = true;
response["message"] = "UID zurückgesetzt";
String jsonString;
serializeJson(response, jsonString);
request->send(200, "application/json", jsonString);
});
}