LPCD: Nur starten, wenn erkannte Karte in NVS hinterlegt ist

Moin zusammen,

nachdem ich bei meinem ESPuino nun endlich LPCD zum laufen bekommen habe (IRQ direkt an den ESP32, nicht über den PE), ist mir aufgefallen, dass mein PN5180 viele Interrupts wirft, die dann in den meisten Fällen auch korrekt verworfen werden (Keine Karte erkannt, zurück in den deep sleep). Allerdings kommt es alle paar Stunden doch vor, dass scheinbar eine Karte erkannt wird, der ESPuino aufgeweckt wird, einmal rot blinkt (weil ja keine Karte vorhanden ist) und dann erst nach der Leerlaufzeit wieder in den deep sleep wechselt.

Vielleicht ist mein Hardware-Setup nicht besonders optimal oder mein PN5180 einfach sehr empfindlich - um dieses Problem zu beheben habe ich jedenfalls den Code dergestalt umgeschrieben, dass bereits im LPCD-Abschnitt die UID mit dem NVS abgeglichen wird und nur bei einem Match der vollständige Start des ESPuino erfolgt. Funktioniert soweit einwandfrei, die Änderungen sind in diesem Commit ersichtlich. Spricht etwas dagegen, diese Funktionalität in den Hauptzweig einfließen zu lassen? Oder bin ich tatsächlich der einzige mit diesem Problem? :slight_smile:

Viele Grüße

1 „Gefällt mir“

finde ich eine gute Idee.

Warum gibt es jetzt die neue Funtkion void System_Init_LPCD(void)? Imho würdest du auch ohne auskommen…

Ich finde deinen Code sehr gut umgesetzt :+1: & die zusätzliche Prüfung macht bei dir Sinn.
Die Frage ist, warum hier ab und zu eine Karte erkannt wird, obwohl keine aufliegt? Hast Du eine UID z.B. 00 00 00 00 oder FF FF FF FF? Habe ich so noch nicht gesehen, aber auch nicht stundenlang auf die schlafende Box geschaut :wink:

Man könnte es so übernehmen, aber dann kann man ESPuino nicht mehr mit einer neuen unbekannten Karte aufwecken. Wollen wir das? Für mich wäre es OK zugunsten der Akkulaufzeit…

Man muss vorher den RFID-NVS initiieren, sonst kann man es nicht auslesen :wink: Und das vollständige System_Init macht noch etwas mehr und dauert länger…

@tueddy: Woher das kommt frage ich mich auch. Da der Fehler aber nur selten auftritt, war es ohnehin schon schwer genug, die Ursache herauszufinden (und zu loggen)… Bei Gelegenheit werde ich mir hier mal die „falsche“ UID rausziehen.

das man das vorher machen muss ist klar.

Aber in welchen Fällen wird deine neue Funktion aufgerufen?
Doch nur wenn 2 Zeilen später eh die System_Init() kommt, oder?

Noch dazu hast du in der Funktion die Prüfung des #define beim Aufruf aber auch… (wenn es nur die eine Stelle gibt)

Aber in welchen Fällen wird deine neue Funktion aufgerufen?

Vor der LPCD-Prüfung, wenn LPCD aktiv ist. Und dann wird das NVS entsprechend nicht nochmal in der normalen System_Init() konfiguriert.

Noch dazu hast du in der Funktion die Prüfung des #define beim Aufruf aber auch… (wenn es nur die eine Stelle gibt)

Doppelt hält besser - und da es beim kompilieren sowieso rausoptimiert wird, ist das doch kein Problem. Was ist so schlimm daran?

jetzt ist mir das langsam klar…

Du mußt also einen kleinen Teil der System_Init nach vorne ziehen um dann bei dem Rfid_Init() darauf zugreifen zu können, richtig?

Damit du dann im Fall das die Karte nicht bekannt ist gleich wieder schlafen gehen kannst (bzw der ESP) ohne die ganze System_Init zu machen, richtig?

So welche doppelten und dreifachen Prüfungen triggern einfach den Monk in mir :wink:
Und wenn das alles mal in eine dynamische Konfig überführt wird, ist das halt nichts mehr was rausoptimiert wird…

Genau!

Schon richtig. Da habe ich mich aber einfach an den Code-Stil des Projekts gehalten, wo das an vielen Stellen ähnlich gehandhabt wird. Bin kein nativer C-/C++ -Programmierer und war schon froh, dass ich diese ganzen Typ-Umwandlungen der UID in eine einzige Typ-Umwandlung überführen konnte:sweat_smile:

1 „Gefällt mir“

Danke für die Erkärungen :+1:

(bin auch eher nicht in C/C++ unterwegs sondern in C# :wink: )

Auf die Gefahr hin, dass ich es mir mit dem Projekt „Reduzierung der #defines“ verscherze - da meine Problematik ja schon ein Sonderfall zu sein scheint, könnte man das zumindest theoretisch hinter ein optionales #define legen. Macht die ganze Konfiguration natürlich wieder ein Stück komplexer.

Ich würde es nicht noch zus. konfigurierbar machen. Entweder wir prüfen beim Aufwachen immer auf hinterlegte Karte oder eben nicht - Ich finde die zus.Prüfung sinnvoll.
Auf jeden Fall werde ich es erst mal testen.

3 „Gefällt mir“

Hatte jetzt endlich mal Zeit den PR zu testen (Standard Mini4L Board mit RFID_IRQ=32, POWER=115):

Die Erkennung auf unbekannte Karten funktioniert zwar (Log-Meldung), der ESPuino wacht trotzdem auf und legt sich nicht wieder schlafen.
@fox das ist wohl so nicht ganz richtig, oder habe ich noch etwas übersehen?

Das ist komisch - bei mir funktioniert das (miniD32pro, IRQ und POWER wie bei dir):

# Hier händisch abgeschaltet
N [3811] Gehe jetzt in Deep Sleep!
N [3811] shutdown audioplayer..
N [3812] shutdown amplifier..
N [3812] Lautsprecher ausgeschaltet
N [3813] shutdown LED..
N [3824] shutdown SD card (SD_MMC)..
D [4271] PN5180 firmware version=4.1
N [4271] prepare low power card detection...
D [4399] PN5180 IRQ PIN (32) state: 0
N [4408] switch to low power card detection: success
N [4411] deep-sleep, good night.......

# Hier eine unbekannte Karte aufgelegt
I [1900] Kartenerkennung via 'low power' erfolgreich durchgeführt
E [1900] ESP32 wurde vom Kartenleser aus dem Deepsleep aufgeweckt. Allerdings wurde keine bekannte Karte gefunden. Gehe zurück in den Deepsleep...
I [1900] Kartenerkennung via 'low power' erfolgreich durchgeführt
E [1900] ESP32 wurde vom Kartenleser aus dem Deepsleep aufgeweckt. Allerdings wurde keine bekannte Karte gefunden. Gehe zurück in den Deepsleep...

# Hier eine bekannte Karte aufgelegt
I [721] Maximale Inaktivitätszeit wurde aus NVS geladen: 1 Minuten
D [740] PN5180 firmware version=4.1
D [744] RFID-Tags koennen jetzt gescannt werden...
D [772] RFID-Tags koennen jetzt gescannt werden...
# [...] Rest des normalen Startvorgangs

Was sagt denn deine Logdatei? Die Logik für den Deep Sleep habe ich ja nicht angepasst, d.h. wenn du diese Lognachricht („ESP32 wurde vom Kartenleser aus dem Deepsleep aufgeweckt. Allerdings wurde keine bekannte Karte gefunden. Gehe zurück in den Deepsleep…“) hast, dann dürfte das Problem unabhängig vom PR sein?

Was mir eben noch aufgefallen ist: Wenn ich es richtig sehe, müsste eigentlich auch die Zeile

Log_Println(lowPowerCardSuccess, LOGLEVEL_INFO);

etwas weiter oben (erfolgsunabhänig) platziert werden.

Mein Fehler, die vermeintlich unbekannte Testkarte hatte ich bereits zugewiesen als Modifikationskarte WLAN ein/aus, das war auf den ersten Blick nicht ersichtlich ;-(
Es funktioniert also alles wie gewünscht.

Jetzt hakt es noch bei Github, aber ich denke das lässt sich noch lösen.

@fox Danke für deinen Beitrag zum ESPuino Projekt!

1 „Gefällt mir“

Das ist schon wieder der gleiche Mist wie beim letzten Mal. Da muss der Cache gelöscht werden. Ich schaue mal.

Edit: Erledigt.

Hat geklappt, jetzt im DEV-Zweig verfügbar