Tastendruck in Variable speichern

  • Guten Morgen Zusammen,

    jetzt muss ich nach ewigem probieren doch noch einen Thread aufmachen. Ich möchte gerne ein OLED-Display durch den Druck auf einen Taster aus- bzw. wieder einschalten. Der Taster funktioniert einwandfrei und ist hier nicht das Problem, sondern wie kann ich Python sagen, dass das Display grade ein- bzw. ausgeschaltet ist. Haber hierzu folgendes probiert (Funktion ist Teil eines größeren Scriptes):

    Wird der Taster betätigt, wird das Display stets ausgeschaltet und x=0 in der Konsole ausgegeben (wie gewünscht). Betätige ich den Taster aber nochmal, bleibt das Display aus und mir wird nochmal x=0 in der Konsole ausgegeben (Gewünscht wäre, dass sich das Display wieder einschaltet und x=1 ausgegeben wird). Ich glaube, dass das Problem daran liegt, das mit jedem Aufruf der Funktion x wieder auf 1 gesetzt wird und immer nur der erste Teil der if-Abfrage ausgeführt wird. Ich habe aber keine Idee wie ich den aktuellen Status dauerhaft in einer Variable speichern kann.

    Hat einer von euch eine Idee dazu? Ich stehe momentan total auf dem Schlauch. :helpnew:

    Vielen Dank und viele Grüße

    Bra!nPa!N

  • Wird der Taster betätigt, wird das Display stets ausgeschaltet und x=0 in der Konsole ausgegeben (wie gewünscht). Betätige ich den Taster aber nochmal, bleibt das Display aus und mir wird nochmal x=0 in der Konsole ausgegeben (Gewünscht wäre, dass sich das Display wieder einschaltet und x=1 ausgegeben wird). Ich glaube, dass das Problem daran liegt, das mit jedem Aufruf der Funktion x wieder auf 1 gesetzt wird und immer nur der erste Teil der if-Abfrage ausgeführt wird. Ich habe aber keine Idee wie ich den aktuellen Status dauerhaft in einer Variable speichern kann.

    hi

    Du hast ja wahrscheinlich Drum herum noch ein Skript, indem Du die Routine aufrufst. Dort gibt es X als eigene Instanz. Das einfachste (ist aber nicht sauber ) ist:

    anstatt

    def ScreenSaver():

    x = 1 # display on

    dies zu machen

    def ScreenSaver():

    global x

    x = 1 # display on

    müsste gehen

    hape

  • Vielen Dank für die schnelle Antwort. x verwende ich sonst nirgendwo in den Script. Habe auch schon versucht x in der Main-Funktion zu definieren:

    Das Ergebnis ist das selbe ;(

  • @Bra!nPa!N

    Lies dich mal durch die Doku von https://gpiozero.readthedocs.io/en/stable/

    Dies nimmt dir viel Arbeit ab und ist zudem noch sehr anfängerfreundlich.

    Wenn ich mal alten Code von hier ausgrabe, dann könnte es etwa so aussehen (muss halt leicht angepasst werden)

  • Hallo,

    probier mal diesen Ansatz:

    Bin mir jedoch nicht sicher ob der Methodenaufruf einer Klasse bei when_pressed zulässig ist.

    Wenn nicht, muss noch der Umweg gegangen werden mit einer lambda Funktion und übergabe des Objektes.

    Bei Fragen, nicht zögern!

    EDIT: bootsmann sorry, nicht mehr gesehen dass schon ein Post von dir gekommen ist

  • Vielen Dank für die Zahlreichen Vorschläge. Hätte ich ehr von gpiozero gehört hätte ich es von Anfang an verwendet. Sieht wirklich um einiges einfacher aus. Ich möchte jedoch ungern alles umbasteln, da ich schon viel geschrieben habe. Gibt es noch andere Möglichkeiten, damit ich nicht in den sauren Apfel beißen muss und alles umschreiben?

  • Bra!nPa!N

    Du musst dir irgendwie den aktuellen Status merken zB mittels einem Flag oder was auch immer.

    Auf die Schnelle mal ein hässliches Programm:

  • versuchs doch mal damit!
    while True

    sorgt dafür, dass permanent der Button gescant wird und wenn er gedrückt wird, entscheidest du anhand deiner boolschen Variable, ob der Bildschirm an oder aus ist und handelst dementsprechend.
    Das ist jetzt zwar ziemlich simpel, aber müsste eigentlich funktionieren!
    Wenn du es robust gestalten willst, solltest du das Python Skript jedoch mittels Monit (oder ähnlichem) überwachen https://wiki.ubuntuusers.de/Monit/ und dir deinen Variablen Wert x in einer Datei speichern, (nicht ideal) oder bei Programmstart überprüfen, ob der Bildschirm grade an ist (deutlich eleganter), ich bin mir ziemlich sicher, dass beispielsweise die lib sys irgend eine derartige Funktion zur verfügung stellt, ich habe zwar noch nie damit gearbeitet, aber ich gehe davon aus, dass es etwas in der Richtung gibt!

    Natürlich mache ich Fehler :stumm:

  • Vielen Dank für die vielen Ideen. Ich habe mich für folgende Entschieden:

    Jetzt habe ich nur folgendes Problem: Ich habe ein Menü mit diversen Untermenüs für ein OLED-Display programmiert welches ich mit anderen Tastern steuern kann. Die einzelnen Untermenüpunkte habe ich schön brav in Funktionen gepackt, damit der Code übersichtlich bleibt. Im folgenden Exemplarisch die Funktion für das Hauptmenü:

    Der Code enthält die Programmierung der Funktion screen_saver und so wie es ist funktioniert es super. Eigentlich wollte ich den screen_saver aber über die zuerst genannte Funktion aufrufen, damit ich den Code nicht an allen möglichen Stellen im Script kopieren muss. Mache ich das aber (siehe "#Screen_saver(saver)", so funktioniert der restliche Teil von mainmenu nicht mehr. Ich kann das Display ein und ausschalten aber nicht mehr über die anderen Taster im Menü navigieren. ;( (Hoffe das war einigermaßen Verständlich)

    Hat da jemand von euch eine Idee?

    Viele Dank und viele Grüße

    Bra!nPa!N

    Ahhhhhhhh: Warum sieht der code so schrecklich aus?:@=> Problem gelöst.

    3 Mal editiert, zuletzt von Bra!nPa!N (20. Juli 2018 um 07:50)

  • Ist doch logisch: du hast in der Funktion screen_saver eine Endlosschleife, die niemals beendet wird, womit du dein Programm quasi für immer dort festsetzt. Die Schleife, in der deine eigentliche Programmlogik läuft, wird nicht mehr fortgeführt. Gewöhne dir bitte while True an, das ist deutlich "pythonischer". True = bool, 1 = int, klar, implizit wird konvertiert. Explizit ist besser als Implizit, Zen of Python.

    Oder kannst du erklären, warum auch while "python is cool":, while Exception:, while 123:, while [123]:, while int:, while __import__("math"): oder while [([([([])])])]:funktionieren? Ich schon, und ich verwende trotzdem nicht while 1 oder eines der anderen Beispiele.:fies:

  • Zitat

    Ist doch logisch: du hast in der Funktion screen_saver eine Endlosschleife

    Werde das heute Abend mal ändern und gucken was passiert. Vielen Dank!

    Zitat

    Gewöhn dir bitte while True an

    Werde ich mir merken :)

  • Das Problem ist gelöst, vielen Dank für den Hinweis mit der while-Schleife. Die Funktion "screen_saver" schaut jetzt wie folgt aus:

    Code
    def Screen_saver(saver):
        if saver == 1:
            # turn display off
            disp.command(Adafruit_SSD1306.SSD1306_DISPLAYOFF)
        elif saver == 0:
            #turn display on
            disp.command(Adafruit_SSD1306.SSD1306_DISPLAYON)

    Der Aufruf der Funktion erfolgt dann unter dem jeweiligen Menüpunkt, im folgenden exemplarisch das Hauptmenü:

    Nochmals vielen Dank für die Hilfe.:bravo2:

Jetzt mitmachen!

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