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“