Dieser Artikel „Steuerung der Anzeige“ beschreibt wie ich ich die Steuerung der Anzeige umgesetzt habe. Dabei war es wesentlich nur einen Taster zu verwenden, um den Bilderrahmen „wohnzimmertauglich“ und leicht bedienbar zu halten.
Die Anzeige der verschiedenen Bildschirme wird durch den zuvor in den Rahmen eingebauten Taster gesteuert. Bei jedem Tastendruck wird erst ein Script aufgerufen, das die Daten ermittelt (z.B. holen der aktuellen Wetterdaten) und diese Daten in einem fertigen Bild speichert. Danach wird dieses Bild in den Framebuffer geschrieben. Da das Holen der Daten auch mal ein paar Sekunden dauern kann, wird direkt nach dem Tastendruck ein Overlay mit „Bitte warten…“ eingeblendet.
Ein zweiter Taster löst einen Neustart aus. Das war beim Testen sehr bequem, ist aber nicht zwingend für den normalen Betrieb nötig.
Die Steuerung ist in der Datei kiosk_mainloop.py realisiert:
#!/usr/bin/env python
# -*- coding: latin-1 -*-
import time,sys
import RPi.GPIO as GPIO
import os,signal
from time import sleep
# set screenwidth
if (len(sys.argv) > 1):
screenwidth=sys.argv[1]
else:
screenwidth=640
GPIO.setwarnings(False)
# RPi.GPIO Layout verwenden (wie Pin-Nummern)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7 , GPIO.IN)
GPIO.setup(11 , GPIO.IN)
# script for killing running scripts
kill_script="/home/pi/kiosk/kill_script.sh"
# array of scripts
scripts = {
1:"/home/pi/kiosk/show_slideshow.sh",
2:"/home/pi/kiosk/show_calendar.sh",
3:"/home/pi/kiosk/show_weather.sh",
4:"/home/pi/kiosk/show_serverstatus.sh"
}
prescripts = {
1:"",
2:"/home/pi/kiosk/get_cal1.py",
3:"/home/pi/kiosk/get_weather1.py",
4:"/home/pi/kiosk/get_serverstatus.py"
}
curr_script=1
# start first script initially
print "Starting: " + scripts[1]
os.system(kill_script + " fbi")
os.system(scripts[1])
# Dauersschleife
taster1_curr = 0
taster2_curr = 0
taster1_prev = 0
taster2_prev = 0
while 1:
# set current state of taster1
#
if GPIO.input(7) == GPIO.HIGH:
taster1_curr = 1
print "Taster 1 gedrückt"
else:
taster1_curr = 0
# set current state of taster 2
#
if GPIO.input(11) == GPIO.HIGH:
taster2_curr = 1
print "Taster 2 gedrückt"
else:
taster2_curr = 0
# it state changed switch to the next service
#
if taster1_curr == 1 and taster1_curr != taster1_prev:
curr_script = curr_script + 1
if curr_script > len(scripts):
curr_script = 1
print "Stopping fbi "
os.system(kill_script + " fbi")
# zeige bitte warten hinweis an
os.system("/home/pi/kiosk/pleasewait");
if prescripts[curr_script] != "":
print "Starting Prescript: " + prescripts[curr_script]
os.system(prescripts[curr_script] + " " + str(screenwidth) )
print "Starting: " + scripts[curr_script]
os.system(scripts[curr_script])
if taster2_curr == 1 and taster2_curr != taster2_prev:
print "rebooting system"
os.system("sudo shutdown -r now")
# remember previous taster state
taster1_prev = taster1_curr
taster2_prev = taster2_curr
# sleep a bit to avoid high load
time.sleep(0.5)
Code-Sprache: PHP (php)
Die Steuerung ist leicht anzupassen oder zu erweitern, indem die Arrays scripts und prescripts entsprechend verändert werden. Dabei muss das unter prescripts eingetragene Script ein Bild bereitstellen, das durch das unter scripts angegebene Script in den Framebuffer geladen wird.
Umschalten zwischen den Bildschirmen
Die im Code verwendeten Scripte werden in den jeweiligen Artikeln detaillierte beschrieben. Das Script kill_script.sh beendet den aktuell angezeigten Bildschirm. In der Steuerung wird zuerst das Script ausgeführt, das den anzuzeigenden Bildschirm aufbaut, dann das kill_script.sh, um den laufenden Bildschirm zu beenden und dann wird der neue Bildschirm angezeigt.
kill_script.sh:
#!/bin/bash
scriptname=$1
# zuerst alle PIDs suchen und in einer Shell-Variablen speichern:
PIDS=$(ps -C $scriptname -o pid=)
# falls gefunden killen:
if [ -n "$PIDS" ]; then
# Signal senden: bitte beenden
sudo kill -HUP $PIDS > /dev/null 2>&1
fi
exit 0
Code-Sprache: PHP (php)
Bitte warten …, so einfach war das nicht
Das Programm pleasewait, lädt ein Overlay in der Bildschirmmitte, das „Bitte warten…“ einblendet, damit der Anwender erkennt, dass sein Tastendruck angenommen wurde. Das Einblenden dieses Textes hat mir einiges an Kopfzerbrechen bereitet, da das Laden eines Overlays über Python einfach zu langsam war. Daher habe ich die Umsetzung dann doch in C vorgenommen auf Basis eines einfachen Programms, das direkt in den Framebuffer schreibt. Zum herunterladen der Sourcen hier klicken.
Die Artikelserie besteht aus acht Teilen. Dem Überblick „Digitaler IKEA-Bilderrahmen mit dem Raspberry Pi“ und den sieben Artikeln zum Bau des digitalen Bilderrahmens mit dem Raspberry Pi.
- Einbau der Teile in den IKEA-Rahmen
- Grundlegende Einstellungen für den Raspberry Pi
- Steuerung der Anzeige
- Automatische Dia-Show
- Erstellen der Kalenderanzeige
- Generieren der Wetteranzeige
- Ermitteln und Anzeigen des Server-Status
Pingback: Digitaler IKEA-Bilderrahmen mit dem Raspberry Pi - Erstellen der Kalenderanzeige
Pingback: Digitaler IKEA-Bilderrahmen mit dem Raspberry Pi und LS-7 Display
Pingback: Einbau der Teile in den IKEA-Rahmen - Digitaler IKEA-Bilderrahmen mit dem Raspberry Pi