Seite 1 von 1

#1 Raspberry und Pyhton wer kann helfen

Verfasst: Sa 18. Mär 2017, 21:22
von obeis
Moin zusammen.
Ich möchte einen Raspberry mit einem "original 7Zoll Display" als Visu Bildschirm nutzen. Der Pi läuft mit Jesse, die Visu (LinHK) läuft, die Halterung funktioniert und alles ist toll.
Jetzt kommt das aber! Ich möchte natürlich nicht das der Monitor 24/7 an ist. Bei dem Display kann recht einfach die Hintergrundbeleuchtung abgeschaltet werden. Jetzt habe ich einen Abstandssensor, wie bei diesen automatischen Wasserhähnen, an einen GPIO Pin geklemmt und möchte damit den Monitor dunkel schalten.
Hier der Code der das schon recht gut macht:

Code: Alles auswählen

#!/usr/bin/python
#   RPF 7" Touchscreen Display
#          Toggles backlight on/off with button press
#          Uses GPIO27

import RPi.GPIO as gpio
from subprocess import call
import time

SENSOR_PIN = 27

gpio.setmode(gpio.BCM)
gpio.setup(SENSOR_PIN, gpio.IN,)
def set_backlight(channel):
    file = open('/sys/class/backlight/rpi_backlight/bl_power','r+')

    if gpio.input(27):
        bl_set = 1
    else:
        bl_set = 0

    bl_update = str(bl_set)
    file.seek(0)
    file.write(bl_update)
    file.close

gpio.add_event_detect(SENSOR_PIN, gpio.FALLING, callback=set_backlight)

while 1:
    time.sleep(360)

Das "FALLING" steht drin, weil bei PinEingang 0 Signal das Display hell sein soll und umgekehrt. Das ganze läuft über die Datei bl_power, in der der Eintrag

Code: Alles auswählen

bl_set = X
einweder mit 1 oder 0 überschrieben werden muss.
Jetzt möchte ich allerdings das das Display sofort hell, aber erst nach 30sec. wieder dunkel wird.
Mein Versuch war bisher:

Code: Alles auswählen

  ...
 else:
    time.sleep(30)
        bl_set = 0
 ....

Damit habe ich allerdings alles verzögert, das heisst teilweise auch das hell schalten. Die Zeit ist auch meist unterschiedlich lang gelaufen.
Mache ich etwas grundsätzliches falsch, oder gibt es vielleicht einen beseren Weg unter Jesse das ganze als laufen zu bekommen?
Ich bin über jeden Tip glücklich, der Mein Display näher vom Schreibtisch an die Wand bringen kann.

Vielen Dank im Voraus

Siebo

Hier im Forum laufen so viele PI´s da wird mir doch sicher jemand helfen können. ;-)

#2 Re: Raspberry und Pyhton wer kann helfen

Verfasst: So 19. Mär 2017, 08:44
von Thomas
Moin Siebo,

schau dir mal das an :https://jankarres.de/2015/02/raspberry-pi-mit-sensoren-und-gpio-arbeiten/
In der pir.py wird erstmal nur die Bewegung erkannt und ausgegeben. Da ist nur ein kurzer time.sleep(0.1) drin.
Da müsste jetzt eine Zeitmessung mit eingebaut werden, vom letzen ein eine Var hochzählen, wenn EndWert erreicht, Aktion ausführen.

#3 Re: Raspberry und Pyhton wer kann helfen

Verfasst: Sa 25. Mär 2017, 23:28
von obeis
Moin zusammen.
Ich habe vieles getestet bin auch schon etwas weiter, aber richtig gut ist es noch nicht.
Die Funktion ist prinzipiell gegeben, allerdings passen die Zeiten meistens nicht. Ab und an komme ich mit der eingestellten Zeit von ca. 3 sec hin, meistens sind es aber 6-20 sec. Das währe nicht so schlimm, nur leider ist in diesen Durchläufen auch das erste einschalten ca 1-3 sec. verzögert. Was mache ich falsch? Was kann ich besser machen?

Code: Alles auswählen

#!/usr/bin/python
#   RPF 7" Touchscreen Display
#         Toggles backlight on/off with button press
#          Uses GPIO27

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
Tic = 0

def set_backlight(channel):
    global Tic
    bl_set = 0
    file = open('/sys/class/backlight/rpi_backlight/bl_power','r+')
    READ = GPIO.input(SENSOR_PIN)
    if GPIO.input(SENSOR_PIN) == 0:
#       print("hand vorm sensor")
        bl_set = 0
        Tic = 0
    if GPIO.input(SENSOR_PIN) == 1:
#       print("Sensor frei")
        Tic = Tic + 1
        time.sleep(.100)
    if Tic >=30 and bl_set == 0 :
#       print("Anzahl erreicht")
        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)

try:
    while True:
        delta = 1

# reset GPIO settings if user pressed Ctrl+C
except KeyboardInterrupt:
    GPIO.cleanup()
    print("\nBye!")

delta = 1 habe ich eingefügt, weil ich den "try" Abschnitt nicht auskommentieren kann.
Es gibt ja offensichtlich noch andere, die mit Pyhton arbeiten.

Vielen Dank für eure Hilfe.

Siebo

#4 Re: Raspberry und Pyhton wer kann helfen

Verfasst: Mo 27. Mär 2017, 21:40
von gesorthy
Moin,

ich kenne mich mit der RPi Bibliothek nicht so gut aus, aber kannst du nicht einfach versuchen zwei verschiedene Callbacks mit GPIO.add_event_detect() zu definieren. Einen für GPIO.RISING und einen für GPIO.FALLING? Der eine schreibt direkt in die Datei (b1_set = 1), der andere wartet erstmal 30sec und schreibt dann (b1_set = 0).

Code: Alles auswählen

GPIO.add_event_detect(SENSOR_PIN, GPIO.FALLING, callback=set_backlight)
GPIO.add_event_detect(SENSOR_PIN, GPIO.RISING, callback=clear_backlight)


Wenn ich die Doku richtig verstehe, laufen die Callbacks allerdings jeweils in einem eigenen Thread. Bedeutet, dass dein Programm nicht blockiert und die Befehle umgehend ausgeführt werden. Du wirst dann wahrscheinlich ein Problem bekommen, wenn du in einem kurzen Abstand (<30sec) aus und dann wieder ein schaltest.
Der Ein-Callback schaltet dann das Display zwar ein, der Aus-Callback schaltet es aber nach seinen abgelaufenen 30sec wieder aus, obwohl deine Hand noch vor dem Sensor liegt (eine klassische Race-Condition). Das solltest du aber mit einer Hilfs-Variablen zur Zeitmessung recht einfach hinbekommen.

Versuch mal Folgendes (ungetestet, daher evtl. nicht sofort lauffähig):

Code: Alles auswählen

import RPi.GPIO as gpio
import time

SENSOR_PIN = 27
filename = '/sys/class/backlight/rpi_backlight/b1_power'
switched_on = 0

def set_backlight(channel):
   global switched_on
   with open(filename, 'w') as fid:
      fid.write('1')
   switched_on = time.time()
      
def clear_backlight(channel):
   global switched_on      # optional, as switched_on is read only
   while (time.time() - switched_on) < 30:   # sec
      time.sleep(1)
   with open(filename, 'w') as fid:
      fid.write('0')

gpio.add_event_detect(SENSOR_PIN, gpio.FALLING, callback=set_backlight)
gpio.add_event_detect(SENSOR_PIN, gpio.RISING, callback=clear_backlight)

while True:
   time.sleep(0.25)


Die Lösung ist etwas unsauber, da du durch ständiges Hand hinhalten, Hand wegnehmen innerhalb von 30sec immer wieder neue Threads aufmachen würdest, die erst nach 30sec absoluter Ruhe erst wieder zugehen. Für die praktische Anwendung sollte es aber erstmal tun.

Viele Grüße
Andre

#5 Re: Raspberry und Pyhton wer kann helfen

Verfasst: Mo 27. Mär 2017, 22:41
von obeis
Moin Moin

Danke für den Versuch. Ich habe an ein paar stellen die groß und klein Schreibung angepasst, bin aber leider nicht zum Ziel gekomen.
Folgender Fehler steht an:

Code: Alles auswählen

RuntimeError: Conflicting edge detection already enabled for this GPIO channel

Kann Ich vielleicht das Sensor Signal einfach auf zwei GPIO´s legen und dann jeweils entgegengesetzt abfragen? Das währe ein möglicher workaround, aber kann ja nicht richtig sein.

Siebo
Der für weitere Tips offen ist.

#6 Re: Raspberry und Pyhton wer kann helfen

Verfasst: Mo 27. Mär 2017, 22:52
von obeis

Code: Alles auswählen

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

SENSOR_PIN = 27
GPIO.setup(SENSOR_PIN, GPIO.IN)
filename = '/sys/class/backlight/rpi_backlight/b1_power'
switched_on = 0

def set_backlight(channel):
   global switched_on
   with open(filename, 'w') as fid:
      fid.write('1')
   switched_on = time.time()

def clear_backlight(channel):
   global switched_on      # optional, as switched_on is read only
   while (time.time() - switched_on) < 6:   # sec
      time.sleep(5)
   with open(filename, 'w') as fid:
      fid.write('0')

GPIO.add_event_detect(SENSOR_PIN, GPIO.FALLING, callback=set_backlight)
GPIO.add_event_detect(SENSOR_PIN, GPIO.RISING, callback=clear_backlight)

while True:
   time.sleep(0.25)

habe die Zeit auf 5 sec sleep hoch gesetzt um zu sehen ob der rest weiter läuft. würde das später auf 0.5 sec mit entsprechendem Multiplikator anpassen.
Aber Fehler siehe oben.

#7 Re: Raspberry und Pyhton wer kann helfen

Verfasst: Mo 27. Mär 2017, 22:59
von gesorthy
Liegt dann wohl daran, dass du nicht zwei verschiedene Callbacks auf einen Pin legen darfst. Dann würde ich mal versuchen mit GPIO.BOTH auf beide Flanken zu triggern und innerhalb des Callbacks je nach derzeitigem Pinzustand (mit GPIO.input(channel)) die set_backlight() oder clear_backlight() Funktion aufzurufen.

#8 Re: Raspberry und Pyhton wer kann helfen

Verfasst: Mo 27. Mär 2017, 23:51
von obeis
Moin
Aber dann habe ich ja wieder ein sleep im Thread und pausiere damit alle Befehle, denn ich muss ja wieder ein
If
Else
Einbauen, das