Das 7“ Touch-Display für den Raspberry Pi ist eine praktische Sache für eigene Projekte. Oft gibt es aber Probleme mit dem Bildschirmschoner. Mal wird das Display einfach ausgeschaltet, wenn man es eigentlich anhaben will. Manchmal ist es ein, wenn es aus sein soll. Möglichkeiten, das zu verbessern und selber zu steuern, erhalten Sie in diesem Artikel.
Im Internet gibt es viele Blogartikel, die erklären, wie man den Bildschirmschoner von Raspbian abschalten kann. Für viele Fälle ist das schon eine ausreichende Lösung. Damit bleibt der Bildschirm immer eingeschaltet. Es gibt aber auch Einsätze bei denen das Display gezielt aus- und wieder eingeschaltet werden soll. Deswegen bietet sich zusätzlich eine eigene Steuerungsmöglichkeit für das Display an.
Das Ein- und Ausschalten ist mit ein paar Befehlen recht einfach möglich. Die fertigen Dateien finden Sie am Ende des Artikels unter Download.
Hintergrundbeleuchtung an- und ausschalten
Beim originalen Raspberry Pi 7“ Display erstellen Sie am besten zwei Dateien on und off. Die beiden enthalten nur jeweils eine 1 (aus) oder eine 0 (ein). Je nach Status wird dann eine der Dateien nach /sys/class/backlight/rpi_backlight/bl_power kopiert.
Für das Display bedeutet das, die Hintergrundbeleuchtung des Displays ein- oder auszuschalten.
Display AUS als Datei display_off:
sudo cp off /sys/class/backlight/rpi_backlight/bl_power
Display EIN als Datei display_on:
sudo cp on /sys/class/backlight/rpi_backlight/bl_power
Ist der Bildschirm so ausgeschaltet, gibt es aber keine Möglichkeit ihn per Touch wieder zu aktivieren. Das macht es für die Anwendung unbrauchbar. Ich möchte Ihnen hier 3 Möglichkeiten zeigen, wie Sie das Problem lösen können.
Reaktivierung mit Taster
Eine Möglichkeit ist, eine Hardware-Taste zu installieren und beim Betätigen den Bildschirm wieder einzuschalten. Die Realisierung ist mit ein paar Bauteilen einfach möglich.
Das Python-Programm fragt den Taster ab. Am besten läuft es unabhängig von jeder anderen Anwendung und startet mit dem Systemstart als Hintergrundprozess.
Auszug aus dem Python-Test-Programm: test.py
#Prellzeit in Sekunden KEY_BOUNCE_TIME=2 #GPIO-Pin des Tasters PinButton=14 GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(PinButton,GPIO.IN) DisplayOn=True while True: time.sleep(0.1) print(GPIO.input(PinButton)) if GPIO.input(PinButton)==0: #Taste wird gedrückt, wg. Pull-Up Widerstand beim Wert 0 DisplayOn=not DisplayOn if DisplayOn==True: print("Bildschirm EIN") else: print("Bildschirm AUS") #Prelldauer für Taster warten time.sleep(KEY_BOUNCE_TIME) GPIO.cleanup() sys.exit()
Reaktivierung mit Sensor-Taste
Oft gibt es bauraumbedingt keine Möglichkeit einen Taster zu installieren. In diesen Fällen wäre es günstig, einen extrem flachen Taster zu haben. Eine Lösung ist ein Sensor-Taster. Er besteht nicht aus mechanischen Bauteilen, sondern nur aus Drähten zur Aktivierung und einem Elektronik-Teil.
Die Elektronik des Tasters besteht aus einer Darlington-Stufe. Die beiden Transistoren verstärken einen geringen Stromfluss durch den Finger der berührenden Person und fungieren damit als Tast-Signal für den Raspberry.
Für die Funktion reicht es zwei blanke Drähte an einem Gehäuse anzubringen. Dafür ist extrem wenig Platzbedarf im inneren des Gehäuses notwendig. Für die Befestigung reichen 4 Bohrungen, durch welche die Drähte gesteckt werden. Zur Sicherung empfiehlt es sich, diese auf der Innenseite mit Heißkleber zu fixieren.
Als Steuerung dient das gleiche Python-Programm, wie oben beim normalen Taster beschrieben wurde.
Reaktivierung mit PIR
Komfortabler ist der Einsatz ohne Drücken oder Berühren von Tastern. Das kann mit einem PIR-Elements – einem Bewegungsmelder – erreicht werden. Die Bauteile gibt es meistens in 2 Bauformen.
Die größere Version lässt sich über Potis im Verhalten von Erkennung und Aktivierungszeit einstellen. Die kleine Version hat fest eingestellte Werte. Auch hier ist der Anschluss an den Pi einfach.
Es gibt nur 3 Kontakte: VCC, Data und GND.
In Python wird der Ausgang des Bewegungsmelders, ebenfalls sehr ähnlich zum obigen Beispiel, abgefragt. Mit der Bewegungserkennung lassen sich aber mehr sinnvolle Erweiterungen einbauen. Beispielsweise eine Nachlaufzeit mit automatischem Ausschalten, wenn keine Bewegung mehr stattfindet.
Auszug aus Python-Programm: automatic.py
#PIR-Kontakt PinButton=21 #Wartezeit in Sekunden DISPLAY_ON_TIME=12 # + 8 Sekunden für die kleine PIR-Version = Gesamtzeit GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(PinButton,GPIO.IN) KeypressButton=time.time() DisplayOn=True i=0 while True: time.sleep(0.1) i=i+1 if i==10: i=0 if DisplayOn==True: print("Time-Out: "+str(DISPLAY_ON_TIME-round(time.time()-KeypressButton))) if GPIO.input(PinButton)==1: #Zeitpunkt des Tastendrucks merken KeypressButton=time.time() if DisplayOn==False: DisplayOn=True SetDisplay("RD7",True) if DisplayOn==True: if time.time()-KeypressButton>DISPLAY_ON_TIME: #Zeit abgelaufen, Bildschirm ausschalten DisplayOn=False SetDisplay("RD7",False) GPIO.cleanup() sys.exit()
Andere Displays
Mit dieser Basis können natürlich auch andere Displays gesteuert werden. Möchten Sie einen HDMI-Bildschirm verwenden, sind diese Befehle möglich.
Display AUS:
xset dpms force on
Display EIN:
xset dpms force off
Das ist bereits in der Funktion SetDisplay vorbereitet. Rufen Sie einfach die Funktion mit den passenden Parametern auf.
- Ein: SetDisplay(„HDMI“,True)
- Aus: SetDisplay(„HDMI“,False)
def SetDisplay(DisplayKind,DisplayOn): cmd="" if DisplayKind=="HDMI": #Jede HDMI-Quelle if DisplayOn==True: cmd="xset dpms force on" else: cmd="xset dpms force off" if DisplayKind=="RD7": #Raspberry Pi Touch-Display 7" if DisplayOn==True: cmd="bash -c \"/home/pi/display/display_on\"" else: cmd="bash -c \"/home/pi/display/display_off\"" if cmd<>"": print("Display-Status: "+str(DisplayOn)) print(cmd) os.system(cmd) #10 Sekunden warten, solange bleibt Bildschirm aus, wg. #Bounce-Time des PIR-Elements time.sleep(10)
Beispiel Mediaplayer
In meinem Fall ist der PIR-Sensor in einem Mediaplayer installiert. Bei jeder erkannten Bewegung soll das Display eingeschaltet werden und dann für 20 Sekunden an bleiben. Erfolgt in der Zwischenzeit eine Bewegung, werden die 20 Sekunden wieder zurückgesetzt und laufen von vorne. Nach Ablauf der 20 Sekunden wird das Display wieder automatisch ausgeschaltet.
Allerdings ist bei mir das Display in einem Standard-Gehäuse eingebaut. Dieses bietet aber nicht genügend Platz, um einen Bewegungsmelder anzubauen.
Ich habe mich deshalb für eine Variante aus dem 3D-Drucker entschieden. Das PIR-Gehäuse kann direkt am Display an der Kamera-Halterung befestigt werden.
Das Gehäuse gibt es für beide Bauformen, die große und die kleine PIR Version. Die Modelle dazu können Sie ebenfalls unter Links als Step-Datei herunterladen.
Bei mir wurde die kleine Version verbaut. Hier muss nur beachtet werden, dass eine feste Zeitdauer für die Bewegungserkennung eingestellt ist. In meinem Fall sind das 8 Sekunden. Das Programm für die Erkennung muss diese Zeit berücksichtigen.
Mit diesen Lösungen können Sie jetzt hoffentlich Ihr Display gezielter ein- oder ausschalten und so einen Komfortgewinn für Ihr Projekt erreichen.
Downloads
Hier finden Sie alle Dateien des Projekts zum Download:
Python-Programme für Taster und PIR-Sensor
3D-Gehäuse PIR-Sensor
Schaltpläne für Fritzing
Links
Wikipedia Eintrag zur Darlington-Stufe:
https://de.wikipedia.org/wiki/Darlington-Schaltung
Interessante Informationen rund um PIR-Sensoren mit dem Raspberry Pi:
https://www.einplatinencomputer.com/raspberry-pi-pir-bewegungsmelder-ansteuern/
Artikel zum Mediaplayer:
Pingback: Sensor-Taster mit Darlington Schaltung – Mein Techblog
Pingback: Sensor-Taster mit Darlington Schaltung – Tech+Code