MFRC522 Lesegerät

  • Hallo zusammen :)


    Ich brauch nochmal eure hilfe kurze vorgeschichte:

    Ich habe vorher das lesegerät RDM6300 verwendet ging auch ohne Probleme (siehe original scatch)

    Das was auskommentiert ist, war das alte lesegerät.

    Ich wollte das jetzt duch ein MFRC522 ersetzten und da fängt das an.




    File "/home/pi/lcdtest/functions.py", line 18, in read_rfid

    reader = SimpleMFRC522.read(5)

    TypeError: unbound method read() must be called with SimpleMFRC522 instance as first argument (got int instance instead)


    Und da hänge ich irgenwie fest.


    Gruß stefan




    Geänderter code


  • Hallo,


    poste bitte mal den Link zu der von dir Verwendeten Python Bibliothek `mfrc522` - habe gerade auf die schnelle nichts gefunden...


    Zum Code:

    • Warum führst du `read` in Zeile 18 nicht gegen die Instanz von `SimpleMFRC522()` aus Zeile 15 aus? Und warum überschreibst du die Instanz von `SimpleMFRC522()` später mit dem ausgelesenen Wert? Das macht keinen Sinn...
    • Was hast du in Zeile 20 und 21 vor? Das sieht wenig sinnvoll aus, was du da machst...
    • Die Methode `db_close` suggerierst, dass die DB geschlossen wird - wird sie aber nicht, du schließt nur den Cursor.
    • Die beiden + in Zeile 36 und 38 machen keinen Sinn - erstens verknüpft man Strings nicht mit +, zweitens kannst du das so wie so als einen String schreiben.
    • Die Zeilen 39 bis 42 sind komplett überflüssig -> weg damit.
    • Die Umwandlung der Datentypen in den Zeilen 44 - 47 ist fragwürdig. Normalerweise sollte dir die DB 2.0 API von Python den richtigen Datentyp zurück liefern WENN deine DB richtig angelegt ist. Heißt z.B., dass bei der id so wie so in Integer geliefert werden soll. Und einen Timestamp zum String zu machen ist Quatsch - dann brauchst du auch keinen Zeitstempel.
    • `id` ist ein ganz schlechter Name für eine Variable, weil du damit die eingebaute Funktion `id` von Python überschreibst - was zu unerwünschten Nebeneffekten führen kann.
    • `a` als Variablenname ist schlecht, weil nichtssagen. Benutzte aussagekräftige Variablennamen. Ein paar Buchstuben mehr kosten nichts.

    Gruß, noisefloor

  • Hallo,

    https://github.com/pimylifeup/MFRC522-python

  • Die Tags sollen eingelesen werden und in der sql datenbank gespeichert werden.

    ID, Datum,Uhrzeit.

    Wenn der tag vorhanden ist sol ein Port auf high geschaltet werden um damit ein Relais oder Transistor anzusteuern.


    @noisefloor danke für deine mühe nur ich bin ein bisschen überfodert...

  • Hallo zusammen,

    gibt es da irgendwo ein beispiel schnipsel wo der MFRC522 mit eingebunden ist mit SQL Anbindung, irgendwie sitz ich auf dem trockenen.


    Danke im Vorraus

  • Hallo,


    wirst du wohl kaum finden. Brauchst du auch nicht, weil das zwei Dinge sind. 1. Daten vom MFRC522 lesen, 2. Daten in die DB scheiben. Das eine hat mit dem anderen so rein gar nichts zu tun.


    Wo hakt es denn genau bei dir?


    Gruß, noisefloor

  • Ja super danke, damit bin ich erstmal ein stück weiter und es funktioniert.


    Eine Sache noch:


    wie baue ich die GPIO ein das bestimmte geschaltet werden können wenn z.B der user bekannt ist?

    Ich habe mein glück da schonmal versucht aber ohne erfolg, muss das in einer schleife oder am ende ?


    danke im vorraus



  • Quote
    wie baue ich die GPIO ein das bestimmte geschaltet werden können wenn z.B der user bekannt ist?

    das habe ich also garnicht verstanden. Schreib mal bitte Deinen Wunsch in korrektem und verständlichem Deutsch auf.


    Quote

    Ich habe mein glück da schonmal versucht aber ohne erfolg, muss das in einer schleife oder am ende ?

    Das Programm ist eine Schleife: "while True:"

    - Karte lesen

    - wenn Kartenname in Datebank vorhanden:

    dann Zeit in Datenbank eintragen und zum Anfang

    sonst zum Anfang


    Du solltest allgemeine Algorithmik mit der Programmiersprache Python lernen.

  • Hallo,


    zum Code:

    • Eingerückt wird bei Python _immer_ mit 4 Leerzeichen, nicht nur 2.
    • SQL Statements mit Variablen werden nicht mit + zusammengestückelt wie in Zeile 26. So wie du es in Zeile 33 machst ist es richtig.
    • Zeile 31 macht in Kombination mit Zeile 27 keinen Sinn. `rowcount` kann nur 1 oder 0 sein, weil du in Zeile 27 nur max eine Zeile holtst. Du solltest gegen `None` prüfen.
    • Im `finally` Block solltest du auch die DB-Verbindung schließen.

    Die Frage zum Schalten verstehe ich auch nicht. Du schaltest doch in Zeile 35 einen GPIO bei bekanntem Nutzer?


    Gruß, noisefloor

  • Hallo,

    Er sollte eig. wenn ein Benutzer vorhanden ist in der datenbank ein GPIO auf high schalten für ein relais oder transistor, zum schalten von einer last.

  • Hallo,


    Quote

    Er sollte eig. wenn ein Benutzer vorhanden ist in der datenbank ein GPIO auf high schalten für ein relais oder transistor, zum schalten von einer last.

    Und...? Wie ist jetzt konkret dein Problem? Was macht aktuell Zeile 35 in deinem Code? Bzw. was denkst du, was da passiert?


    Gruß, noisefloor

  • Soweit funktioniert es jetzt GPIO 27 in diesen fall lässt sich schalten wie gewünscht.Ist der user vorhanden (rfid chip) schaltet GPIO und die LED in diesem fall leuchtet.


    Eine Sache noch wie baue ich ein KeyboardInterrupt das ich das Programm sauber beenden kann?

    noisefloor wie ist das gemeint in Zeile 27 gegen "none" prüfen? und wie wird Zeile 26 richtig zusammen gestückelt?


    danke im vorraus


  • Hallo,


    Quote

    und wie wird Zeile 26 richtig zusammen gestückelt?

    Hatte ich oben schon geschrieben...


    Quote

    wie ist das gemeint in Zeile 27 gegen "none" prüfen?

    Wenn die ID in er DB nicht vorhanden ist, dann liefert die Abfrage `None` (mit großem N) zurück. Ob `result` `None` ist oder Daten da sind prüfst du mit `if result:`


    Quote

    Eine Sache noch wie baue ich ein KeyboardInterrupt das ich das Programm sauber beenden kann?

    Zeig' doch mal, was du probiert hast und nicht wie erwartet funktioniert.


    Gruß, noisefloor

  • Hallo ,

    noisefloor irgendwie hab ich jetzt ein Brett vorm kopf :)


    Wie lautet der befehl für die abfrage gegen None?

    Ich muss das script mit STRG+c beenden gibs da eine elegante lösung für?


    gruß stefan

  • Hallo,


    Quote

    Wie lautet der befehl für die abfrage gegen None?

    in deinem Fall:

    if result:. Wenn die DB-Abfrage keinen Datensatz findet, dann hat `result` den Wert `None`, ìf result`evaluiert zu `False` und der if-Block wird nicht betreten.


    Gruß, noisefloor