Digitaler IKEA-Bilderrahmen mit dem Raspberry Pi – Steuerung der Anzeige

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.

  1. Einbau der Teile in den IKEA-Rahmen
  2. Grundlegende Einstellungen für den Raspberry Pi
  3. Steuerung der Anzeige
  4. Automatische Dia-Show
  5. Erstellen der Kalenderanzeige
  6. Generieren der Wetteranzeige
  7. Ermitteln und Anzeigen des Server-Status

Keine Antworten

    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

    :bye: 
    :good: 
    :negative: 
    :scratch: 
    :wacko: 
    :yahoo: 
    B-) 
    mehr...
     


       Mit der Nutzung dieses Formulars erklärst Du Dich mit der Speicherung und Verarbeitung Deiner Daten durch diese Website einverstanden. Mehr Informationen dazu findest Du in der Datenschutzerklärung.

    Jooble.de ALL-INKL.COM - Webhosting Server Hosting Domain Provider TinyURL.com - Free URL Shortener

    Powered by WordPress und SoftPress-Theme by MyThemeShop.

    Diese Seite verwendet Cookies. Mit der Nutzung von tuxlog erklärst Du Dich mit der Verwendung von Cookies einverstanden. Detaillierte Informationen über die Verwendung von Cookies auf dieser Website findest Du in der Datenschutzerklärung.