Mehrere Werte für hold_time in gpiozero

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    aufgrund des wiederholten anratens mehrerer User hier im Forum, beschäftige ich mich jetzt doch einmal mit dem gpiozero Modul (anstatt RPi.GPIO).

    Der heutige Tag dient dazu, einfach mal die in der Dokumentation vorgestellten Funktionen für Button selbst auf dem Schreibtisch mittels Breadboard Taster und print Ausgabe zu probieren.

    Jetzt bin ich dabei auf die Funktion gestoßen, in der man eine Zeit hinterlegen kann, wie lange ein Taster gedrückt sein muss, bis die gewünschte Funktion augerufen wird. (Funktioniert auch soweit alles)

    Python
    import gpiozero
    import signal
    button = gpiozero.Button(26, hold_time=3)
    def foo():
        print("Taster gedrückt")
    
    button.when_held = foo
    signal.pause()

    Jetzt kam mir die Idee, ob es eine Möglichkeit gibt, verschiedene Zeiten zu hinterlegen und je nachdem wie lange der Taster gedrückt wurde, die entsprechend gewünschte Funktion aufrufen.

    Die Möglichkeit selbst die Zeit zu messen wann gedrückt und wann wieder losgelassen wurde ist mir bewusst. Mir gehts eher darum, ob sowas von gpiozero auch zur Verfügung gestellt wird. Wenn ja, ich konnte es bisher noch nicht finden :helpnew:


    EDIT:

    Python
    def foo():
        print("Taster lange gedrückt")
    
    def foo2():
        print("Taster kurz gedrückt")
    button.when_held = foo
    button.when_pressed = foo2
    signal.pause()

    So würde ich zumindest schon 2 Funktionen schaffen, wobei ich damit auch noch nicht zufrieden bin, da auch bei einem langen Tastendruck zuerst foo2 augerufen wird:denker:

  • Python
    import gpiozero
    import signal
    button = gpiozero.Button(26, hold_time=3)
    def foo():
        print("Taster gedrückt")
    button.when_held = foo
    signal.pause()

    Hier muss der Taster für mindestens 3 Sekunden (hold_time=3) gedrückt werden damit foo() aufgerufen wird.

    Meine Frage ist es, ob es einen Weg, welcher schon von gpiozero zur Verfügung gestellt wird dass ich z.B foo4() aufrufen kann wenn der Taster 4 Sekunden gedrückt wurde und foo6() aufrufe nachdem der Taster 6 Sekunden gedrückt wurde.

    Hmm irgendwie übersah ich das held_time die ganze Zeit. Danke dafür, das ist das was ich suchte

  • Kleiner Zwischenstand:

    Linus, leider in dieser Form noch nicht, das Problem dabei ist, dass ich immer in der Funktion ein NoneTyp von button.held_time vorfinde.

    bootsmann verlinktes Skript hab ich jetzt mal bling copy&paste gemacht, BCM Nummer auf meines angepasst. Dort bekomme ich Zeitwerte


    with Button(21, hold_time=0) as button:

    Wieso schreibt man sowas in einem with Statemant?

    Warum funktioniert linusg herangehensweise nicht?:denker:

  • Wieso schreibt man sowas in einem with Statemant?

    Ich bin mal die Sources langehangelt, die haben echt eine krasse Vererbungshierarchie. Am Ende kommst du bei GPIOBase raus: https://github.com/RPi-Distro/pyt…devices.py#L107

    Dort wird __enter__ und __exit__ implementiert (https://github.com/RPi-Distro/pyt…devices.py#L182), um den GPIO nach dem Verlassen des Kontextes automagisch frei zu geben. Geschmackssache, ich find's gut.

    Warum funktioniert linusg herangehensweise nicht?

    Weil ich es nicht getestet habe? Oder zu doof bin zum Doku lesen. Was auch immer: http://gpiozero.readthedocs.io/en/stable/api_…utton.held_time

  • Vielen Dank euch beiden für die Hilfe und Erklärungen.

    Auch hab ich gerade entdeckt warum Linus Beispiel nicht funktionierte ^^

    Statt when_held wurde when_pressed verwendet. Korrigiert, und schon funktioniert alles :)

    Irgendwie funktioniert das doch nicht.

    Bekomm immer wieder ein None mit rein.

    Hab den Code jetzt schon folgender Maßen abgeändert, aber immer noch Probleme

    Code
    0.2691349983215332
    0.10257172584533691
    0.3099789619445801
    None
    0.126784086227417

    Deshalb hab ich jetzt die umständlichste Methode gewählt:

    und selbst hier schaffe ich es n Traceback zu bekommen:wallbash:

  • ich wollte das None eleminieren. Aber ohne erfolg.

    Hätte natürlich zeit = zeit_neuheißen sollen :bravo2:


    Fehler bleibt gleich:

  • Ok, ich würde selber gerne testen, habe aber gerade keinen Pi da, der dienen könnte. Debuggen wir das trotzdem irgend wie ;)

    Und mehr pythonic:

    Was *vielleicht* problematisch sein könnte ist das hold_time=0. Würde ich mal mit 0.1 testen. Falls er das vorher als bool interpretiert kommt False raus...

    So, zwar nicht groß anders als vorher, aber was kommt raus?

  • Sorry, grad nicht da gewesen

    gerade Code getestet, wieder nicht erfolgreich:

    Erster Tastendruck funktionierte, 2. nicht mehr

  • Jungs.

    Cooler Thread!

    Herzlichen Dank für die vorarbeiten. Das mit hold und held time - kann ich super gebrauchen.

    Werde nun ein Programm mal umschreibne und meinen anderen Thread schliessen und auf diesen hier verweisen.

    PS.: Danke das ihr dem Forum nicht den Rücken kehrt und trotz aller Wiedrigketen bleibt.

    Gruss Dani

  • Na, langsam, so ganz läuft das ganze ja noch nicht ;)

    Hofei könntest du noch mal den Code aus #13 testen, mit foo so abgeändert:

    Python
    def foo(button):
        zeit = 0
        while button.is_held:
            zeit_neu = button.held_time
            if zeit_neu is not None:
                zeit = zeit_neu
                print('Gedrückt...', zeit_neu)
        print(zeit)

    Das würde die Vermutung von Andreas bestätigen oder widerlegen...

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!