PI 3b Mit Pi 7"Touch Display Abschaltung zeitverzögert

  • Moin zusammen.

    Ich bin hier als Laie unterwegs. Das ein oder andere bekomme ich schon hin aber ich scheitere an meinem Display.

    Ich habe mir vor längerer Zeit das Original Pi Touch Display gebraucht zugelegt (Schnäpchen wollte eigentlich nur den beiligenden Pi haben). Jetzt möchte ich meinen Smart Home Hausbus über dieses Display bedienen. Die bedienung über ein Webseite läuft.

    Jetzt versuche ich schon seit Monaten die Hintergrundbeleuchtung über einen Abstandssensor zu steuern. Es ist ein 2Y0A21 Sensor mit einem Messbereich von 10 bis 80 cm. Über eine kleine Transistorschaltung zieht der Sensor ab ca. 50cm den GPIO auf Masse.

    Ich habe über diverse Tutorials das ganze soweit hin bekommen das die Hand vorm Sensor das Display aktiviert und ohne Hand das Display sofort (ca 0-2 sec) wieder dunkel schaltet.

    #!/usr/bin/python

    # PI 7" Touchscreen Display Toggles backlight on/off with button press

    import RPi.GPIO as GPIO

    from subprocess import call

    import time

    GPIO.setmode(GPIO.BCM)

    SENSOR_PIN = 27

    GPIO.setup(SENSOR_PIN, GPIO.IN,)

    # Initialisierung

    Start = time.time()

    Weg = 0

    def set_backlight(channel):

         global Start

         bl_set = 0

         file = open('/sys/class/backlight/rpi_backlight/bl_power','r+')

         READ = GPIO.input(SENSOR_PIN)

         if GPIO.input(SENSOR_PIN) == 0:

              bl_set = 0

              Weg = 0

              print("hand vorm sensor")

         if GPIO.input(SENSOR_PIN) == 1 : # and Start + 10 >=time.time :

              print("Sensor frei")

              Weg = 1

              Start = time.time()

              bl_set = 1

         bl_update = str(bl_set)

         file.seek(0)

         file.write(bl_update)

         file.close

    GPIO.add_event_detect(SENSOR_PIN, GPIO.BOTH, callback=set_backlight)

    #if time.time() >= Start + 10 and Weg ==1 :

    # bl_set = 1

    # print("Zeit")

    try:

         while True:

              delta = 1

    # reset GPIO settings if user pressed Ctrl+C

    except KeyboardInterrupt:

         GPIO.cleanup()

         print("\nBye!")

    Das klappt auch schon recht zuverlässig.

    Der Auskommentierte Teil

    #if time.time() >= Start + 10 and Weg ==1 :

    # bl_set = 1

    # print("Zeit")

    soll quasi eine Ausschaltverzögerung erreichen.

    Wenn das Signal an GPIO Pin 27 von Low auf High wechselt, soll das Display noch eine Zeit (hier 10sec) länger hell bleiben und das ganze auch noch nachtriggerbar.

    Ich denke das die Funktion schon das erfüllen wird was ich erwarte, leider bekomme ich das nicht richtig in den Code eingebaut.

    Zuerst hatte ich gedacht das das hinter die beiden "If GPIO.input..." passen würde, aber die werden ja nur durch den Interrupt über die Funktion aufgerufen und nicht wenn die Zeit weiter läuft.

    Wenn Ich das ganze wie oben beschrieben da hin baue, wo ich es auskommentiert habe, komme ich auch nicht weiter.

    Gehe ich falsch an die Sache ran oder bin ich auf dem richtigen Weg?

    Gibt es noch anderen Optimierungsbedarf?

    Ich bedanke mich schon jetzt für eure Hilfe.

    Mit freundlichen Grüßen vom Weserdeich

    Siebo

  • PI 3b Mit Pi 7"Touch Display Abschaltung zeitverzögert? Schau mal ob du hier fündig wirst!

  • Moin ForumBot

    Das an und aus geht schon.

    Mein Problem ist die Ausschaltverzögerung.

    Ich befürchte ich bin hier im falschen Unterforum gelandet. Das ganze gehört wohl eher in

    Programierung / Python

    Kann das jemand hier verschieben? Oder soll ich das einfach im richtigen Unterforum noch einmal eintragen.

    Siebo

  • Moin,

    Du hast da ein Ablaufproblem. Du schreibst ja, dass Ein/Aus schon funktioniert. Das ist nachvollziehbar, da die Events (Flanken von low auf high und umgekehrt) ja Deine Callback-Funktion set_backlight auslösen. Das setzen des Timers bringt keinen Effekt, da ja die Funktion nur bei Signalwechsel aufgerufen wird, was ja dann nicht mehr der Fall ist. Du müsstest den Timerzustand in der Deiner Hauptschleife abfragen und da das Display ausschalten.

    Code
    try:
        while True:
            delta = 1
            if ((Start + 10) >=time.time() and bl_set==0):
                bl_set = 1
                bl_update = str(bl_set)
            time.sleep(1) 
  • Moin

    Es gibt ein Ergebniss nach diversen Änderungen:

    So klappt es jetzt.

    Die if Abfrage mit "bl_set" im letzten Abschnitt habe ich auf eine andere Variable geändert, weil ich bl_set nicht definiert hatte und mir nicht sicher war wo das richtig zu machen ist.

    Nachdem ich die Fehlermeldungen alle wegprobiert hatte, gab es noch das Problem das das Display nicht dunkel wurde.

    Das hing an den fehlenden "file.xxx " aufrufen.

    Es klappt jetzt wie gewünscht, allerdings ist natürlich jetzt einiges doppelt im Programm. Kann man das noch optimieren? Der Pi ist ja auch sonst noch ganz gut beschäftigt.

    Ich bin gespannt ob ihr mir noch weiter helfen könnt.

    Bis hier her schon mal vielen Dank

    Siebo

  • Hallo,

    Zitat

    allerdings ist natürlich jetzt einiges doppelt im Programm. Kann man das noch optimieren?

    Ja, in eine eigene Funktion auslagern.

    `file`ist in Python 2 übrigens ein schlechter Name für eine Variable, weil du damit die Build-In Funktion `file`von Python 2 überschreibst.

    Ansonsten ist Python 2 in weniger als 2 Monaten EOL, d.h. du solltest dein Programm zügig auf Python 3 umstellen.

    Du kanns die Datei auch mit dem `with` Statement öffnen, dann kümmert sich Python ums schließen.

    Gruß, noisefloor

  • Moin

    Jetzt bin ich froh das es funktioniert und soll schon wieder umbauen? Grrrr.

    Aber was soll es, die Zeit geht weiter.

    Ich dachte "file" währe schon als fuktion genutzt.

    Was muss ich an Änderungen vornehmen um Pyhton 3 kompatibel zu werden?

    Wie funktioniert das mit "with"?

    So viele Fragen

    Schon vorab Danke für die Hilfe.

    Siebo

  • Hallo,

    Zitat

    Ich dachte "file" währe schon als fuktion genutzt.

    ??? - wo denn? Du bindest das geöffnete file-like object an den Namen `file` und überschreibst damit die Build-In Funktionn `file.

    Zitat

    Was muss ich an Änderungen vornehmen um Pyhton 3 kompatibel zu werden?

    Python 3 gibt es seit Ende 2008 und es gibt da reichlich Doku zu. Python 3 bringt auch ein Programm namens `2to3`mit, was die Konvertierung weitesgehend automatisch macht.

    Zitat

    Wie funktioniert das mit "with"?

    Auch das with-Statement ist in der Python Doku ausführlichst beschrieben.

    Gruß, noisefloor

Jetzt mitmachen!

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