192 lines
5.0 KiB
C
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);
|
|
});
|
|
} |