Willkommen auf unserer neuen Forenplattform für das Bus-Profi Forum

Neue Felder für die persönlichen Daten
Man kann jetzt seine öffentlich einsehbare Daten genau bestimmen. Details findet ihr in in diesem Beitrag.

Durch die neue Forensoftware und die Portierung der Daten konnten die Passwörter aus dem alten Forum nicht übernommen werden, bitte lassen Sie sich ein neues Passwort über die Passwort vergessen Funktion zusenden. Sollte es zu Problemen kommen kontaktieren Sie das Bus-Profi Team per E-Mail.

Raspberry und Pyhton wer kann helfen

... hier finden sich alles was in die anderen Bereiche nicht hineinpasst - auch Infos über geplante User-Treffen

Themenersteller
obeis
Lord Forum
Lord Forum
Beiträge: 1803
Registriert: Do 11. Jun 2009, 00:21
Hat sich bedankt: 5 Mal
Danksagung erhalten: 4 Mal

#1 Raspberry und Pyhton wer kann helfen

Beitragvon obeis » Sa 18. Mär 2017, 21:22

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. ;-)

Benutzeravatar

Thomas
Alleswisser
Alleswisser
Beiträge: 5692
Registriert: Mo 21. Apr 2008, 20:03
Hat sich bedankt: 16 Mal
Danksagung erhalten: 10 Mal
Kontaktdaten:

#2 Re: Raspberry und Pyhton wer kann helfen

Beitragvon Thomas » So 19. Mär 2017, 08:44

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.
lg Thomas


Themenersteller
obeis
Lord Forum
Lord Forum
Beiträge: 1803
Registriert: Do 11. Jun 2009, 00:21
Hat sich bedankt: 5 Mal
Danksagung erhalten: 4 Mal

#3 Re: Raspberry und Pyhton wer kann helfen

Beitragvon obeis » Sa 25. Mär 2017, 23:28

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


gesorthy
Neues Mitglied
Neues Mitglied
Beiträge: 10
Registriert: So 21. Aug 2011, 00:15
Danksagung erhalten: 1 Mal

#4 Re: Raspberry und Pyhton wer kann helfen

Beitragvon gesorthy » Mo 27. Mär 2017, 21:40

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


Themenersteller
obeis
Lord Forum
Lord Forum
Beiträge: 1803
Registriert: Do 11. Jun 2009, 00:21
Hat sich bedankt: 5 Mal
Danksagung erhalten: 4 Mal

#5 Re: Raspberry und Pyhton wer kann helfen

Beitragvon obeis » Mo 27. Mär 2017, 22:41

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.


Themenersteller
obeis
Lord Forum
Lord Forum
Beiträge: 1803
Registriert: Do 11. Jun 2009, 00:21
Hat sich bedankt: 5 Mal
Danksagung erhalten: 4 Mal

#6 Re: Raspberry und Pyhton wer kann helfen

Beitragvon obeis » Mo 27. Mär 2017, 22:52

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.


gesorthy
Neues Mitglied
Neues Mitglied
Beiträge: 10
Registriert: So 21. Aug 2011, 00:15
Danksagung erhalten: 1 Mal

#7 Re: Raspberry und Pyhton wer kann helfen

Beitragvon gesorthy » Mo 27. Mär 2017, 22:59

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.


Themenersteller
obeis
Lord Forum
Lord Forum
Beiträge: 1803
Registriert: Do 11. Jun 2009, 00:21
Hat sich bedankt: 5 Mal
Danksagung erhalten: 4 Mal

#8 Re: Raspberry und Pyhton wer kann helfen

Beitragvon obeis » Mo 27. Mär 2017, 23:51

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


Zurück zu „Dies und das“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast