Tasten betaetigungen in einem Zeitraum zaehlen. Z.b. 3 x in 2 Sekunden. gpiozero, Python3

  • Hallo Leute,


    ich wollte die Anzahl der Tastendruecke ueber einen kurzen Zeitraum zaehlen um dann entsprechend eine Aktion auszufuehren. Koennt ihr mir einen Tipp geben. Fuer Python3 natuerlich.


    Guten Rutsch,


    gutschy

  • Die Doku lesen und mit Flags und Countern arbeiten? Mal ernsthaft, was für eine Antwort erwartest du hier?

    Das ist kein "Wir schreiben deinen Code"-Forum. Probiere es selbst, dann kannst du mit auftauchenden Problemen hier fragen.

    Guten Rutsch,

    Also bei uns sind noch nicht mal die Weihnachtsfeiertage rum [Blocked Image: http://www.greensmilies.com/smile/smiley_emoticons_xmas1_confused.gif]

  • Hi linusg,


    ja, du hast recht aber ich hatte auch eher an einem Codeschnipsel als Insperation gedacht als an fertig geschriebenen Code. Na ja, hier mal mein Versuch. Die Idee ist, Taster 1 wird gedrueckt, dann sollte eine while Schleife 2 Sekunden warten und die Klick-Anzahl des Taster hochzuzaehlen um dann ueber eine zweite if-Schleife die entsprechende Anweisung auszufuehren. Leider geht der Motor schon beim ersten Tastendruck von taster_start an. Deine Vorschlaege mit counter und flags habe ich mal in Google geschmissen, konnte ich aber nicht umsaetzen, bzw. bei flags habe ich nicht mal begriffen worum es geht.

    Hoffe du hast da eine Idee wenn du noch magst.

    Frohe Weihnachten und einen guten Rutsch!


    gutschy

  • Okay, also nochmal zur Klarstellung: Du möchtest zählen, wie oft ein Button in einem Zeitraum von z.B. zwei oder drei Sekunden gedrückt und losgelassen wird. Richtig? Allgemein solltest du leicht anfangen, dein Code ist schon etwas unübersichtlich und komplex. Versuche es doch erst einmal mit dem einen Button und füge dann erst die anderen Funktionen hinzu.


    Ungetestet:

  • Hi linusg,


    hab dein Skript jetzt mal probelaufen lassen, brachte leider eine Fehlermeldung.

    Und es gab keine Hochzaehlen von n_pressed.

    Code
    1. Button was pressed for 0 times within the last 2 seconds
    2. Button was pressed for 0 times within the last 2 seconds
    3. Button was pressed for 0 times within the last 2 seconds
    4. Button was pressed for 0 times within the last 2 seconds
    5. Button was pressed for 0 times within the last 2 seconds
    6. Button was pressed for 0 times within the last 2 seconds
    7. Button was pressed for 0 times within the last 2 seconds
    8. Button was pressed for 0 times within the last 2 seconds
    9. Button was pressed for 0 times within the last 2 seconds

    Immerhin loeste der Button die Fehlermeldung aus. Ich kann sowieso nur die letzte Zeile einigermassen zuordnen.

    Code
    1. File "i_linus_button.py", line 11, in handle_button_start
    2. n_pressed += 1
    3. UnboundLocalError: local variable 'n_pressed' referenced before assignment

    Aber Variablen in Python muessen doch gar nicht erst referenziert werden, oder? Bzw. habe ich n_pressed auch mal auf Global gesetzt, da brachte aber die gleiche Fehlermeldung.

  • Sorry, mein Fehler. Ist zwar ne dreckige Lösung, aber setze mal vor n_pressed += 1 eine Zeile global n_pressed.

  • Nope, wie gesagt, die gleiche Fehlermeldung.

  • vor n_pressed += 1 eine Zeile global n_pressed.

    Hast du nicht getan, ich hatte dich schon verstanden. Da hat das global aber keinen Effekt. Ist doch eh schon global und nicht lokaler Namespace in ner Funktion.

  • Ahh, jetzt klappt es. Um die Theorie aus Buechern auch verwerten zu koennen muesste ich mich wirklich oefter damit beschaeftigen. Und bei Stackoverflow steht es ja auch richtig, habe es jetzt erst beim zweiten mal gerafft.


    Besten Dank soweit, Linus!

    Dir einen guten Rutsch.

  • Ok, und ich dachte, das sei jetzt ein rantasten ^^

    Löst das tatsächlich schon das gesamte Thema des Threads? Oder meinst du nur dieses Test-Programm, dass es geht?

  • Ich persönlich würde das so machen:


    ungetestet!

  • - Iteratoren sind in Python bereits in Klassen implementiert. Also sollte man sie auch nutzen (sofern nur hochgezählt werden soll).

    - was auch immer _ (Klasse) bedeutet, das gehört da nicht hin auch # EOF


  • ...das macht das ganze aber IMHO wieder unnötig kompliziert, da nicht nur hoch gezählt wird sondern der counter auch wieder zurückgesetzt werden muss. Zudem ist der Aufruf next(counter) wie ich finde irreführend, kann in der print Ausgabe von Linus 's Script so auch nicht verwendet werden da dann automatisch hoch gezählt wird und somit der tatsächliche Wert verfälscht wird...


    _ deshalb weil es über collections bereits Counter gibt, also kein Konflikt entstehen soll. Und # EOF ist ein Kommentar, was ich immer setze um Anfängern zu verdeutlichen dass danach nichts mehr kommt

  • Tja Leute, kann ich mich ja nur bedanken das hier so intensiv ueber die Loesung meiner Probleme nachgedacht wird. Leider ist dieses Klassen Ding der Hauptgrund warum ich mal mit C angefangen bin. Klassen sind fuer mich echt schlecht nachzuvollziehen, obwohl ich ihren Sinn auch schon mal umrissen hatte. (Das mit den Vererbungen finde sogar ich praktisch.) Leider sind meine Python Anwendungen zumindest im Moment noch sehr sporadisch. Da halte ich das Anwenden von Klassen fuer uebertrieben, ich halte mich da an den Vorschlag von linusg, den kriege ich auch irgendwie in mein Skript eingebaut, hoffe ich mal.


    Aber nochmal Danke, nur noetigen mich eure Beispiele wirklich dazu mich nochmal in das Konzept der Klassen einzuarbeiten, was ich frueher oder spaeter auf jeden Fall noch mal machen werde, nur nicht diese Woche.(; Gibt noch soviel was ich erledigen will.||


    linusg, meigrafd und bootsmann ich wuenschen euch einen guten Rutsch.


    gutschy


    P.S. bootsmann, meinst du damit den Bernhardiner?

  • Hallo,


    meigrafd : warum hast du `get` und `set` Methoden, die operieren doch nur auf den Attributen... Wir sind doch nicht bei Java, wo das nötig ist. Warum kein direkter Attributzugriff?


    bootsmann : die Implementierung finde ich auch fragwürdig aka verwirrend. Warum implementierst du einen einfacher Zähler, der genau einen Wert hat, als Iterator?


    Gruß, noisefloor

  • meigrafd - da hast du ja aus meinem Gewurschtel doch noch schönen Python Code gemacht :thumbup:

    Ich weiß, die _Counter Klasse ist eine allgemeine, aber für diesen simplen Fall würde ich sie doch noch stark vereinfachen, und zu einer Namenskollision sollte es hier wohl auch nicht kommen. Ansonsten: from foo import Bar as FooBar ;)


    Ob man das counter.value = 0 noch in eine Methode counter.reset() oder tatsächlich counter.set(0) packt ist wohl Geschmackssache. Aber es erfüllt wohl seinen Zweck.