Infostandsystem - Auslesen von NFC-Tags (PN532)

  • Hallo liebes Forum!


    Da dieser Thread such wohl noch länger ziehen wird, weil ich plane alle Probleme rund um das im folgenden beschriebene Projekt in diesem Thread zu diskutieren möchte ich mich zuerst einmal vorstellen. Ich bin Steffen, 17 Jahre alt und besuche derzeit ein Gymnasium in Neumünster (Schleswig-Holstein) seit einiger zeit beschäftige ich mich mit solchen "kleinen" technischen Projekten und werde wegen meinem Interesse in diesem Bereich ab dem nächsten Jahr auch Wirtschaftsinformatik dual studieren.


    Trotzalledem ist ein Projekt mit NFC und vor allem in diesem Umfang für mich noch neu und ich hoffe, dass Ihr Verständnis habt wenn ich manchmal etwas mehr nachfragen muss. Konkret handelt es sich um die Entwicklung eines Phython Programms, welches mithilfe eines NFC Moduls und NFC Stickern (MIFARE 13,56Mhz), einzelne Teile erkennen soll und daraufhin Informationen auf einem Display anzeigt.


    Als erstes frage ich mich ob das RC522 oder das PN532 Modul für mein Vorhaben besser geeignet ist. Das PN532 V3 Modul hätte wohl den Vorteil, dass es über I2C angesteuert werden kann und somit einige Kabelstrecken im Teamstand gespart werden können. Welches dieser Module ist nach euren Erfahrungen (mit einem RasPi) einfacher zu benutzen?

    Ist euch ein Framework bekannt, welches nach Anlernen erkennen kann dass diese Karte für zB. "1" steht und mit dem man dann eine kontinuierliche Abrage durchführen kann, die dann wie folgt im script genutzt werden kann:


    Ich bedanke mich schon jetzt für eure Hilfe:danke_ATDE:!


    LG aus dem hohen Norden

  • Hallo und Herzlich Willkommen im Forum.


    Persönlich habe ich das RC522 im Einsatz.

    Hast du weitere Projekte im Sinne, weswegen die GPIOs knapp werden können?

    Wenn nein, würde ich eher bei der Auswahl darauf achten, mit welchen Modulen du besser zurecht kommst.


    Als Python Modul verwende ich folgendes: https://github.com/ondryaso/pi-rc522



    Ist euch ein Framework bekannt, welches nach Anlernen erkennen kann dass diese Karte für zB. "1" steht und mit dem man dann eine kontinuierliche Abrage durchführen kann, die dann wie folgt im script genutzt werden kann:

    Jein, das Modul ließt halt die UID der Karte aus, für den Rest bist du zuständig.


    Der Code ist aber kein Python :P

  • Hey!


    Vielen Dank erstmal für die schnelle Antwort. Nein ich denke die GPIOS werden nicht zu knapp, denn es wird lediglich eine kleine Lichtsteuerung neben der Hauptfunktion benötigt. Also dürfte der RC522 der Wohl bessere Weg für mich sein.


    Wie hast du denn einzelne Karten in deinen Projekten unterschieden? Was hast du damit überhaupt umgesetzt? Hatten die einzelnen Karten bei dir Quasi über ein Verzeichnis o.ä. einen "Namen"? Wenn ja könntest du mir eventuell eines deiner Auswertungsscripte bereit stellen, durch das ich etwas lerne über einen möglichen Weg die karten effektiv im Script zu unterscheiden?


    Vielen Dank bisher schonmal!


    Beste Grüße

    Steffen

  • DIe Karten haben unterschiedliche IDs.


    Wird darauf auch eingegangen? Im falschen Unterforum gepostet oder noch viel zu lernen?

    Nein ich habe das richtige Forum gewählt. Phython soll es schon in der Umsetzung sein und natürlich ist das jetzt kein Phython. So if-statemenst und co kriege ich in phython schon auf die Kette. In meinem Beitrag wollte ich damit aber eher das gnerelle System ausdrücken wie ich mir die Auswertung wünschen würde.

  • Nein ich habe das richtige Forum gewählt. Phython soll es schon in der Umsetzung sein und natürlich ist das jetzt kein Phython. So if-statemenst und co kriege ich in phython schon auf die Kette.

    Python. Ein H. Bitte.


    In meinem Beitrag wollte ich damit aber eher das gnerelle System ausdrücken wie ich mir die Auswertung wünschen würde.

    Alles klar. Aber das Internet ist doch voll mit solchen Projekten, wo hakt's denn nun konkret? Nur an der Wahl des Boards? Das können wir ja nicht entscheiden... Und ich gehe mal schwer davon aus, dass es für beide eine Bibliothek gibt, die die Verwendung trivial macht. Und selbst wenn nicht, sowas selbst zu machen kann unglaublich lehrreich sein - weiß ich aus Erfahrung... :shy:

  • Python. Ein H. Bitte.


    Alles klar. Aber das Internet ist doch voll mit solchen Projekten, wo hakt's denn nun konkret? Nur an der Wahl des Boards? Das können wir ja nicht entscheiden... Und ich gehe mal schwer davon aus, dass es für beide eine Bibliothek gibt, die die Verwendung trivial macht. Und selbst wenn nicht, sowas selbst zu machen kann unglaublich lehrreich sein - weiß ich aus Erfahrung... :shy:

    Vielen Dank auch dafür. Ich werde nun erstmal versuchen mich mit @Hofai's Code zu beschäftigen.

    Die Menge der Projekte, die ein EINFACHES bestimmen von einigen wenigen zuvor definierten Karten anbieten, ist aber tatsächlich geringer als man denkt.


    LG

  • Linus  Hofei


    Hallo!


    Ich habe mich nun näher mit dem Thema beschäftigt und mich dafür entschieden den PN532 zu verwenden. Ich bin auch auf ein sehr gutes und verständliches Beispielscript gefunden:



    Ich erhalte entweder die Ausgabe "Keine Karte!" oder "User Id: xxx".


    Code
    User Id: 112

    Nun würde ich gerne die Zahl, die in dem String , der wiefolgt ausgegeben wird, durch ein if Statement vergleichen:

    Code
    print('User Id: {0}'.format(int(data[2:8].decode("utf-8"), 16)))


    Wie kann ich nur die Zahl bekommen und diese dann wie folgt vergleichen?:


    Code
    if zahl == 100:
        # Aktion 1
    else if zahl == 200:
        # Aktion 2
    else:
        #keine Aktion
  • steffenr2001

    Changed the title of the thread from “Infostandsystem - Auslesen von NFC-Tags (PN532 oder MFRC-522)” to “Infostandsystem - Auslesen von NFC-Tags (PN532)”.
  • Linus

    Eine Frage hätte ich aber dennoch...


    aktuell hatte ich ja geplant den wert der Abfrage so auszuwerten:

    Code
    if Wert == "Auto":
        # öffne Auto
    elif Wert == "Spoiler":
        # öffne Spoiler
    Elif Wert == "Heckspoiler":
        # öffne Heckspoiler

    Welchen weg gibt es um das durch weniger if Statements zu realisieren? Habt ihr da ein Stichwort für mich?

  • Welchen weg gibt es um das durch weniger if Statements zu realisieren? Habt ihr da ein Stichwort für mich?

    dictionary.


    Quick & Dirty Beispiel:

  • Moin Moin!


    Dank eurer großartigen Unterstützung bin ich schon sehr weit gekommen, harke nun jedoch aber erneut und meine versuche mit asyncio sind auch sehr daneben gewesen...


    Mittlerweile sieht das Script wie folgt aus:


    Gegen Ende des Programms rufe ich die Funktion "loadui" auf. Mithilfe von dieser selbstgeschriebenen Funktion lade ich das userinterface...

    Leider bleibt dann mein code in der Gtk.main() Funktion hängen... das funktioniert aber nicht weil der Hauptcode weiter laufen muss um bei Änderung der eingäbe das bestehende UI zu schließen und ein anderes zu öffnen bzw zwischen zwei unterschiedlichen UIs muss ein Wechsel möglich sein.


    Hat da jemand eine Idee ?


    LG

    Steffen

  • Hallo,


    Quote


    Leider bleibt dann mein code in der Gtk.main() Funktion hängen...

    "Bleibt hängen" ist der falsche Ausdruck. Du übergibst die Kontrolle an dem Main-Loop deiner GUI. Das muss auch so sein, weil sonst die GUI nicht funktioniert. Das ist grundsätzlich so, nicht nur bei GTK.


    Grundsätzlich ist dein Ansatz deshalb völlig falsch. Wenn du eine GUI hast, musst der Main-Loop die Kontrolle haben. Sprich der Main-Loop muss auch dafür verantwortlich sein, dass der Reader periodisch abgefragt wird. Dazu kennen alle GUI-Frameworks Methoden. Bei Tkinter heißt die Methode `after`, keine Ahnung, wie das GTK-Äquivalent heißt. Eine Endlosschleife mit `while True` in einer GUI ist ein falscher weil nicht funktionierender Programmentwurf.

    Also: am besten den Code weg werfen und das ganze klassenbasiert neu schreiben. Anders wird das nichts.


    Und vorher vielleicht noch mal mit den Grundlagen von Python beschäftigen. So was wie `karte_gefunden = "true"` ist Quatsch. Python kennt den Datentyp `bool`, also willst du hier eigentlich `karte_gefunden = True` schreiben.


    `if data is not None:` kannst du einfacher als `if data` schreiben. `is not None` ist eine doppelte Verneinung und damit das gleiche.


    Warum schreibst du in Zeile 75 und danach `if objekt != None:` statt wie vorher `if objekt is not none`?


    Gruß, noisefloor

  • Vielen Dank!


    Kennt da jemand vielleicht noch ein Beispiel script? Im Internet finde ich ohne konkretes Suchwort leider auch nichts.


    Mit freundlichen Grüßen