Taster funktion unter gpiozero

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!
  • Hallo Experten,

    ich möchte ein Script erstellen mit dem ich unterschiedliche Funktionen auslösen

    kann, je nachdem ob ich einen Taster kurz oder eine vorgegebene Zeit drücke.

    In der entsprechenden Dokumentation gibt es zwar ein Script um einen RPi

    nach 2 sec. drücken abzuschalten:


    ich möchte aber etwas anders ausführen. Hat jemand eine Idee ?

    • Official Post

    Hallo luemar,

  • vielen Dank !

    Funktioniert noch nicht richtig, vermute es liegt an meiner Schaltung

    (nach dem Handbuch von Kofler et al.):


    Mit dieser Schaltung habe ich am GPIO Pin 17 0V. Beim Drücken des

    Tasters dann 3.3V aber es passiert nichts, erst nach dem 2. Drücken

    läuft def pressed() und nach weiteren "Betätigungen" läuft jeweils

    def held(btn).


    Wenn ich anstelle GPIO Pin 17 den GPIOPpin 3 nehme, wo ich 2.8V messe,
    passiert gar nichts, kann ja wohl auch nicht.


    Ich denke mit GPIO Pin 3 kann ich auf die Widerstände R1 und R2

    verzichten, da dort diese schon eingebaut sind ???


    Und welche Spannung sollte an GPIO Pin 3 anliegen ? Luemar.

    • Official Post

    Deine Schaltung hat einen Pulldown-Widerstand (10k), gpiozero schaltet aber als Standard den internen Pullup-Widerstand ein.


    Siehe hier:


    Du kannst den 10k also weglassen, der 1k wird imho nicht schaden.

  • habe die Schaltung gemäss obigem Zitat bezw. website geändert

    und der Unterschied kurz oder >2sec. drücken funktioniert !!!


    Was noch nicht funktioniert ist, dass wenn ich Dein Script aktiviere

    beim ersten Drücken - kurz oder >2sec. - nichts passiert.

    Erst nach dem 2. Drücken läuft es wie im Code programmiert.


    Habe die Schaltung mit dem simplen Script in oben erwähnter

    website getestet, hier mit 3.3V am einen Taster Kontakt und GND

    am anderen, (aber auch umgekehrt mit GPIO Pin 17 am einen

    Taster Kontakt und GND am anderen, dann mit pull_up=True):


    Python
    #!/usr/bin/python
    from gpiozero import Button
    import time, sys
    
    button = Button(17, pull_up=False)
    try:
         button.wait_for_press()
         print('Button pressed')
    except KeyboardInterrupt:
         sys.exit()

    und erhalte das print statement auch erst nach dem 2. Mal

    drücken. Übrigens auch wenn ich GPIO Pin 3 verwende.

    Wo liegt der Fehler ? Ein Prell Problem des Tasters ? Luemar.

    • Official Post

    Mach mal bitte so wie auf der Seite, also GPIO > Taster > GND und ohne pull_up=False bzw. das ganze weglassen. Verwende bitte Python3 und mein Skript oben wie es ist. (Edit: Pin natürlich anpassen) Was passiert dann?


    Ich kann leider nachher erst auch mal testen, wenn ich wieder zu Hause bin.

    • Official Post

    Ist getestet...

    Was noch nicht funktioniert ist, dass wenn ich Dein Script aktiviere

    beim ersten Drücken - kurz oder >2sec. - nichts passiert.

    Erst nach dem 2. Drücken läuft es wie im Code programmiert.


    Bei mir verhält sich das auch so, wenn ich sofort nach dem Start des Skripts den Taster drücke. Wenn ich aber das Skript starte und ca. 3-5 Sekunden warte und dann erst den Taster drücke, dann funktionierts schon beim ersten Drücken, egal ob kurz oder lang. ;)

  • habe alles durchprobiert, der letzte Test mit GPIO Pin 17 oder 3 >Taster>GND,

    Warten nach Script Aktivierung bis zu 10 sec., funktioniert nach wie vor erst

    beim 2. Drücken.

    Auch noch mal die korrekte Übertragung Deines Scriptes überprüft...

    • Official Post

    Sorry, aber dann weiß ich auch nicht wirklich weiter. :conf:


    Vielleicht doch der Taster ansich. Hast Du noch einen anderen Taster oder stattdessen zwei Jumperkabel zum brücken? Falls Du mit einem Steckbrett testest, dann kannst Du ja mit einem der Jumper den Taster überbrücken / simulieren.

    Vorsicht bei der Methode mit den Kabeln, nicht einfach lose liegen lassen oder versehentlich den RPi damit berühren und am besten nach dem Test gleich wieder abziehen!!

  • auch mit manueller Überbrückung des Tasters leider unverändert.


    Etwas verstehe ich nicht:

    Wenn ich das Script aktiviere messe ich am GPIO Pin 3 bzw. am Taster

    "Eingang" 3.2V die dann beim Drücken auf 0V absinken.

    Am GPIO Pin 17 hingegen - auch ein general purpose pin - bzw. am Taster

    Eingang mess ich nach dem Aktivieren 0.14 - 0.9 V, die dann ohne irgenwelches

    Zutun nach ca. 12 sec.auf 3.2V ansteigen und beim Drücken auch auf 0V absinken.

    ???? Luemar

  • melde mich nochmals in obiger Sache:

    Habe nun nochmals getestet und in der Tat: Der Taster funktioniert ab 11 sec. warten

    nach Aktivierung des Scripts. Mit 10 sec. geht's nicht mehr.....

    Eigenartig. Braucht der RPi so lange bis die Pin Abfrage bereit ist ?

  • also habe Tests ausgeführt:
    1. Ich arbeite parallel mit einem RPi 2B+ unf einem RPi Zero WT.

    2. Auf beiden läuft Raspbian GNU/Linux 9 (stretch)

    3. Beide RPi verhalten sich identisch:

    - Ab einer Wartezeit von 11 sec. nach Sript Aktivation funktionieren mein Script wie auch das von Hoschi (oben) wie programmiert.

    - Habe ein 2. print statement gemäss Allons-y eingefügt:

    Wenn ich den Taster vor 11 sec. drücke erscheint das nur das 2. print statement

    Wenn ich den Taster nach 11 sec. drücke erscheinen das "reguläre"

    und das 2. print statement

  • alles klar mit den Namen..

    Bin gespannt auf Deinen Test.

    Aber letztlich sollte es keine Probleme mit dem "delay" geben, da es weit mehr als Secunden dauern

    wird bis nach Aktivierung des Scripts ein Taster betätigt wird:

    Weil wenn ich den Taster kurz drücke sollte ein angeschlossenes Relais 18 Secunden schliessen und

    wenn ich => 2 Secunden drücke sollte das Relais schliessen bis ich den Taster wieder los lasse.

  • Hallo,


    der Import von gpiozero kann relativ lange dauern. 10s erscheint mir zwar subjektiv zu lang, aber egal.


    Gibt doch mal die Zeitstempel vor und nach dem Import-Statement vom gpiozero aus. Dann weißt du, wie lange das braucht.


    Gruß, noisefloor

  • Hallo,


    hyle: ja, ist es. Zumindest, wenn ich damit auf meinem Pi Zero was machen ist die Verzögerung deutlich. Gemessen habe ich es nie, aber gefühlt würde ich sagen, dass das import-Statement `import gpiozero` ca. 2-4 Sekunden braucht, bis es weiter geht.


    Gruß, noisefloor

  • Hier dazu mal eine kurze Messung:

    Python
    import datetime
    start = datetime.datetime.now()
    import gpiozero
    ende = datetime.datetime.now()
    print(ende - start)


    Pi3:

    pi@pihole:~ $ python3 test_load.py

    0:00:00.360834



    Pi Zero W:

    pi@uhr:~ $ python3 testload.py

    0:00:02.001792