GPIO Taster während time.sleep(60)

  • Hallo Forum


    Ich habe ein BeautifoulSoup script was alle 60 sec. ausgeführt (while True: time.sleep(60) und bei Veränderung an ein 1602 i2c LCD Display ausgegeben wird.

    Das i2c Display hat einen fünften Pin für das Backlight welches ich über einen weiteren Taster einschalten (PWM fadeIn) oder ausschalten will.


    Jetzt habe ich das Problem das der interrupt während der time.sleep nicht abgefangen wird bzw. die Funktion welche das Display einfaden soll ausgeführt wird.

    Beim Arduino macht man das ja mit milliseconds (Beispiel: LED ohne delay). Wie löst man das am besten beim Raspberry Pi.

    Threating habe ich schon probiert allerdings geht dann der Load schnell auf über 2.


    LG opaque

  • Go to Best Answer
  • opaque Einfach mal das Wort „threat“ nachschlagen. Und dann „thread“ richtig schreiben. 🤓

    “The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents.” — Nathaniel Borenstein

  • Threading ist schon der richtige Ansatz. Das es bei dir nicht geklappt hat, liegt also nicht am Konzept, sondern am uns unbekannten konkreten Code.

  • Ok danke.


    Ich bin einen Schritt weiter das LCD Script wird korrekt ausgeführt.

    Allerdings wird der "while True:" loop nicht ausgeführt.


    Vereinfacht dargestellt mein script:

    • Best Answer

    Wie ueblich der klassische Fehler bei der Angabe des target: du rufst du Funktion schon gleich auf. Statt einen callback anzugeben. So muss das aussehen:


    Code
    lcd = threading.Thread(target=LCD.fadeToggle)

    Und wenn du statt den Thread lcd zu nennen ihn besser benennst - zb fader_background_thread - dann kannst du dir auch die unguenstige Umbenennung des lcd-Moduls in LCD sparen. GROSSGESCHRIEBENE DINGE SIND IN PYTHON KONSTANTEN. klein_geschrieben Variablen. UndSowasIstEineKlasse.

  • Super danke das war es!

    Noch eine Frage: Ist es besser dann alles als threads laufen zu lassen?

    z.B.:

    Code
    carThread = threading.Thread(target=carLoop)
    lcdThread = threading.Thread(target=LCD.fadeToggle)
    carThread.start()
    lcdThread.start()
  • Nein. Alles was du damit erreichst ist, dass dein main-thread (den's eh immer gibt), einfach nix macht. Was unnoetig ist.