Touchscreen Helligkeit/Beleuchtung automatisch steuern

  • Hallo


    Im Zuge mehrerer meiner Raspberry Projekte stand ich vor einem Problem mit der Helligkeit verschiedener Touchscreens. Im konkreten Fall ging es um den offiziellen 7" Touchscreen und um das Adafruit pitft+ 2,8" mit kapazitivem Touch.


    Ausgangslage: die Geräte laufen 24/7 und werden beide über die entsprechenden Touchscreens gesteuert, da beide aber in Sichtweite des Bettes stehen und die Anzeigen nicht dauerhaft gebraucht werden, im Gegenteil deren Beleuchtung nachts sogar stört, habe ich mir eine Lösung überlegt, wie die Beleuchtung automatisch aus- und bei Touchaktion wieder angeschaltet wird.

    Ein einfaches ScreenBlank reicht leider nicht, die Displaybeleuchtung bleibt dann trotzdem aktiv und ist im Fall des 7" doch sehr störend hell. Zudem muß man ja nicht unnötig Strom verbrennen, auch wenn es sicher nicht allzu viel ist.


    Beide Raspberrys laufen mit max2play. Wie bei den meisten Distributionen ist der allergrößte Teil der Software, Python, wiringpi, grafische Oberfläche (LXDE), bereits vorinstalliert. Lediglich das Paket xscreensaver muß in vielen Fällen mittels

    Code
    1. sudo apt-get install xscreensaver

    nachinstalliert werden.


    Im Fall von max2play läuft ja meistens jivelite als Oberfläche. jivelite bringt eigene Screensaver mit, die für die Darstellung eventueller Inhalte bei eingeschaltetem Display sorgen. Darauf will ich hier nicht weiter eingehen. Für den vorgestellten Zweck ist nur xscreensaver gemeinsam mit einem kleinen Python Programm zuständig.


    Als erstes richten wir xscreensaver auf dem desktop ein. Im Fall des 2,8" Displays ist das kaum möglich, da wichtige Steuerelemente nicht auf das Display passen. Da sollte die Einrichtung mittels Maus auf einem per HDMI angeschlossenen Bildschirm erfolgen, danach kann der Bildschirm und die Maus wieder entfernt werden.

    Ich habe es so gewählt, daß bei einem Pi der Blank Screen nach 30 Minuten, beim anderen der Blank Screen nach 10 Minuten aktiviert wird. DPMS habe ich zwar ebenfalls aktiviert, die Einstellung hat aber bei den beiden Displays mangels Power Management keine Wirkung.

    Der Timeout ist auch die einzige Einstellung, die der Anwender des Gerätes eventuell mal anpassen muß, auf eine möglichst einfache Bedienung habe ich Wert gelegt.

    Nach der Installation und Einrichtung muß noch geprüft werden, ob der xscreensaver Daemon auch automatisch gestartet wird. Die ist der Fall, wenn in $HOME/.config/autostart die Datei xscreensaver-daemon.desktop mit folgendem Inhalt zu finden ist:


    Code
    1. [Desktop Entry]
    2. Type=Application
    3. Encoding=UTF-8
    4. Name=Xscreensaver
    5. TryExec=xscreensaver
    6. Exec=/usr/share/xscreensaver/xscreensaver-wrapper.sh -nosplash
    7. NoDisplay=true
    8. X-KDE_StartupNotify=false
    9. # NotShowIn=KDE;GNOME;
    10. Comment=The XScreensaver daemon

    Ein paar Worte zur Hardware.


    Die Helligkeit des offiziellen 7" Displays kann bekanntermaßen gesteuert werden, in dem man einen Wert zwischen 0 (aus) und 255 (max) mit Superuserrechten in /sys/class/backlight/rpi_backlight/brightness schreibt.

    Das Adafruit Display kann über GPIO Port #18 per PWM gesteuert werden, siehe hier.

    Diese Funktionen nutze ich in meinem Python Programm.


    Das Programm initialisiert beim Start zuerst einmalig den Screensaver, das passiert, wenn er das erste mal aktiviert wird. Ohne diese Aktivierung fehlen die Rückmeldungen, ob er aktiv ist, oder nicht, diese Rückmeldung wertet das Programm aber aus. Die Aktivierung erfolgt mittels xscreensaver-command -display :0 -activate, nach 5 Sekunden Wartezeit wird der Screensaver mittels xscreensaver-command -display :0 -deactivate wieder deaktiviert.

    Dann wird die initiale Helligkeit eingestellt. Hier gibt es Unterschiede zwischen beiden Displays.

    Beim Raspberry Display nehme ich, wenn es an ist, immer den Wert 60, der ist immer noch hell genug, um selbst bei Sonnenlicht alles sehr gut ablesen zu können.

    Beim Adafruit Display wird zuerst mittels

    Code
    1. gpio -g mode 18 pwm
    2. gpio pwmc 1000

    GPIO #18 auf PWM mit einer Taktfrequenz von 1000Hz eingestellt. Die Helligkeit wird dann über die Pulsbreite eingestellt, von 0 (aus) bis 1023 (max) ist hier möglich. Bei mir hat sich bewährt, nachts 30 zu nehmen, am Tag 300. Der Befehl dafür lautet gpio -g pwm 18 Wert.

    Initial nutze ich bei dem Display 300.


    Ist die Intialisierung erledigt, startet die Dauerschleife. Sie fragt den Status des xscreensavers mittels xscreensaver-command -display :0 -time ab und extrahiert dort "blanked" (Helligkeit 0) oder "non-blanked" (entsprechende Helligkeit des jeweiligen Displays). Beim Adafruit wird zusätzlich noch die aktuelle Stunde geholt und die Helligkeit entsprechend nach Tag oder Nacht gewählt.

    Anschließend wird die Helligkeit entsprechend eingestellt, sofern sich der Zustand nach dem letzten Einstellen geändert hat, das ist so gewählt, um unnötiige Schreibvorgänge nach /sys zu vermeiden und die SD Karte zu schonen.


    Eigentlich sehr einfach gehalten, das Ganze. Vor dem Hintergrund, daß Python als Interpretersprache viel CPU Last erzeugt, ist das sicher kein Fehler.


    Das für das Display passende Programm wird einfach in $HOME abgelegt, in meinem Fall /home/pi, da unter max2play der User automatisch angemeldet wird. Für den Autostart sorgt ein Eintrag in der Datei $HOME/.config/lxsession/LXDE/autostart. Der Eintrag lautet in meinem Fall @/usr/python /home/pi/dim-run.py. Bei anderem User muß der Pfad natürlich angepaßt werden.


    Und das sind die beiden Python Programme.


    7" Display:


    Adafruit Display:



    Da hier im Forum die Darstellung der TAB Stops nicht funktioniert, ohne diese aber Syntax Errors kommen, habe ich noch ein Archiv mit beiden Programmen angehängt.


    Sollte der Beitrag den Anforderungen an ein HowTo genügen, kann ihn ein Moderator auch gern in den entsprechenden Bereich verschieben.

  • Du schreibst mit Python in eine Datei, indem Du echo samt Ausgabeumleitung in einem neuen Prozess ausführst, ernsthaft? :conf:


    Schau dir mal den Link, den hyle noch hinzugefügt hat, an. In eine Datei schreibt man in Python, indem man ein Dateiobjekt erzeugt und dessen write-Methode verwendet.

  • Meine Lösung benutze ich seit rund 3 Jahren ohne Probleme. Der Pi läuft 24/7, monatelang.

    Als ich mir das Programm ausgedacht haben, wußte ein Großteil der User noch nicht einmal, daß sich die Displaybeleuchtung des 7" Touch überhaupt über Software steuern läßt.

    Mit dem Dateiobjekt habe ich es mit meinen bescheidenen Kenntnissen, die für meine Bedürfnisse allerdings auch ausreichen, schlicht und einfach nicht hinbekommen, mit Superuserrechten nach /sys zu schreiben, also habe ich das so gelöst, daß es funktioniert. Ob das nun die feine Art des Programmierens ist, war für mich nicht unbedingt von Belang, es sollte einfach funktionieren.


    Es gab für mich also bislang keinen Grund, nach anderen Lösungen zu schauen. Zumal auch im System keine Zombieprozesse zu finden sind, erst recht keine, die auf das echo Kommando zurückzuführen sind. Erst dann hätte ich mir Gedanken gemacht.