Programmierung Python

Registriere dich jetzt, um exklusive Vorteile zu genießen! Als registriertes Mitglied kannst du Inhalte herunterladen und profitierst von einem werbefreien Forum.
Mach mit und werde Teil unserer Community!
  • Moin zusammen,


    Ich bin gerade dabei eine Auswertung meiner RFID Tags zu programmieren.


    Ich verwende einen RFID Reader von Joy IT und ein OLED Display (I2C) um meine Auswertung anzeigen zu lassen.

    Hardware funktioniert und wurde bereits getestet mit den gestellten Programmen.


    Ich kann bereits Tags lesen und beschreiben und habe somit die Seriennummern der Tags rausgefunden. Ich möchte 2 Tags einem Gegenstand zuordnen und die Namen der Gegenstände auf meinem Display anzeigen lassen. Leider habe ich Schwierigkeiten die Seriennummer in der Funktion zu definieren, da egal ob Seriennr. X oder y gelesen wird, wird der gleiche Text auf dem Display angezeigt. Hat jemand Erfahrung in dem Bereich und weiß wie man diese Seriennummer definiert bzw. Wie die Funktion diese beiden unterscheidet. Ich habe schon mit if else Funktionen gearbeitet aber ich vermute, dass das Problem mit der Seriennummer zusammenhängt.


    Lg

  • Nur nochmal zum Durchblick.

    2 Tags pro Gegenstand, Tags haben logischerweise verschiedene Seriennummer.

    Also z.B, TagId 0123456789 oder TagId 9876453210 ist Gegenstand "Sandsack", richtig so?

    Dann zeige doch mal dein bisheriges Programm in CodeTag </>.

  • hhraspi Bei einer Abbildung von Seriennummern zu Gegenständen wird sich wahrscheinlich ein Wörterbuch (`dict`) anbieten, welches beispielsweise als Schlüssel die Tag-IDs hat, und als jeweiligen Wert den Namen des Gegenstands als Zeichenkette. Dann kann man über die Tag-ID einfach schauen welcher Name dazu gehört. Oder ob die ID überhaupt einem Gegenstand zugeordnet ist.


    Python
        id_to_name = {42: "Kaffeetasse", 23: "Blumentopf"}
        ...
        rfid = wait_for_rfid()
        object_name = id_to_name.get(rfid, "unbekannt")
        display(object_name)

    😡 Host Europe hat alle meine Emojis gefressen! 😭

  • import RPi.GPIO as GPIO

    from mfrc522 import SimpleMFRC522

    import time

    import board

    import busio

    from PIL import Image, ImageDraw, ImageFont

    import adafruit_ssd1306


    # RFID-Reader initialisieren

    reader = SimpleMFRC522()


    # I2C-Display initialisieren

    i2c = busio.I2C(board.SCL, board.SDA)

    display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)


    # Bild erstellen

    width = display.width

    height = display.height

    image = Image.new("1", (width, height))


    # Zeichenbereich erstellen

    draw = ImageDraw.Draw(image)


    # Funktion zum Anzeigen des Textes auf dem Display

    def display_text(text):

    image = Image.new("1", (width, height))

    draw = ImageDraw.Draw(image)


    font = ImageFont.load_default()

    font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 24) # Größere Schriftart


    text_width, text_height = draw.textsize(text, font)

    x = (width - text_width) // 2

    y = (height - text_height) // 2


    draw.text((x, y), text, font=font, fill=255)

    display.image(image)

    display.show()


    def check_tool_status():

    while True:

    # RFID-Tag lesen

    print("Bitte Tag vor den Reader halten...")

    try:

    id, text = reader.read()

    except Exception:

    id, text = None, None


    if id == "53136733010":

    # Überprüfe, ob die ID "53136733010" ist

    print("Gegenstand1")

    display_text("Gegenstand 1")

    else:

    # Wenn kein RFID-Tag erkannt wird oder eine andere ID erkannt wird

    print("Gegenstand fehlt")

    display_text("Gegenstand fehlt")


    if __name__ == "__main__":

    try:

    check_tool_status()

    except KeyboardInterrupt:

    GPIO.cleanup()

  • Hier der Code, nur woher weiß mein Programm, dass ich die Seriennummer meine. Ich glaube diese Bezeichnung ist falsch und dadurch funktioniert der Code nicht richtig

  • Keine Ahnung, ob es funktioniert, da ich den Code nicht testen kann:

  • hhraspi

    Naja , so ist das absolut wertlos , ich hatte doch extra geschrieben im Code </> (dritte Symbol von rechts )!

    Du vergleichst doch schon die ID nach dem lesen , da hast du doch die Seriennummer.

    Du kannst die Tags doch auch direkt mit den jeweilige Artikel (Gegenstand) beschreiben.

    Also zB Tag A : ID= 53136733010 Schubkarre ;Tag B: ID = 7539518462 Gartenbank ; Tag C: ID=852741963 Schubkarre

  • Moinsen,


    Warum machst du das nicht über eine geschachtelte LIST

    Python
    WarenDB = [[('53435454053715514405' , '4547681738731717') , 'Schubkarre'],
               [('25153145461580540434' , '4145154145145440') , 'Besenstiel']]
    
    RFID_READ, text = reader.read()
    
    for artikel in WarenDB:
        if f'{RFID_READ:0<X>}' in artikel[0]:
            Artikelname = artikel[-1]
            break

    <x> steht für die Anzahl der Stellen, falls du auch beabsichtigst IDs mit voranstehenden Nullen zu verwenden. Damit wird die ID in einen String ggf mit voranstehenden Nullen umgewandelt, so das diese mit den Nummern aus der WarenDB angeglichen werden können.

    Das geht auch noch etwas schöner als eigenständige Funktion, aber um das Funktionsprinzip zu erläutern sollte der Beispielcode reichen.

    Franky

  • Das ist einfacher und schneller im Lookup und benötigt ein wenig mehr Speicher:

    Code
    WarenDB = {
        '53435454053715514405': 'Schubkarre',
        '4547681738731717': 'Schubkarre',
        '25153145461580540434': 'Besenstiel',
        '4145154145145440': 'Besenstiel',
    }

    Wenn man anfängt, einfache Datenstrukturen in komplexere Strukturen zu überführen, um Platz zu sparen, sollte man eine Datenbank für die Deduplikation der Daten nutzen. Wenn die Schubkarre eine Million mal vorkommt, reicht ein Verweis auf eine ID und die ID hat in einer anderen Tabelle die Zuordnung zu "Schubkarre" oder "Besenstiel".


    Hingegen wäre dein Beispiel ziemlich unpraktisch, wenn die Schubkarre eine Million mal vorkommt. Nicht wegen der Eingabe der Daten, sondern das Finden der ID wird dann besonders langsam, da jedes Element in der Liste mit dem gesuchten verglichen werden muss. Ein dict hat hingegen den Vorteil, dass ein lookup O(1) ist. Egal, wie viele Elemente in dem dict sind.


    https://wiki.python.org/moin/TimeComplexity

  • Wenn "42" == 42 wahr sein soll, dann musst du mal Javascript ausprobieren.

    pasted-from-clipboard.png



    Der ist auch lustig:


    Python ist, was Typen betrifft, zum Glück ziemlich strikt und wirft einen TypeError wenn man z.B. "Hallo" - 1 evaluieren will.


    Man kann aber Äpfel mit Birnen vergleichen und es wird kein Fehler geworfen, sondern man bekommt die richtige Antwort:

    Äpfel und Birnen sind nicht gleich.


    Bitte nehmt meinen Vergleich nicht für OOP. Da kann man Äpfel mit Birnen vergleichen, wenn man das so programmiert.