Aus Raspberry Pi Geek 02/2021

Tagesplan auf einem E-Ink-Display

© moovstock, 123RF

Kalenderblatt

Bernhard Bablok

Ein stets aktueller Kalender, der sich via Internet synchronisiert und gut ein Jahr über eine Batterie läuft: Mit einem E-Ink-Display und einem Pi Zero lässt sich das realisieren.

Im Zentrum des Projekt steht das Inky-wHAT-Display von Pimoroni [1]. Der E-Ink-Bildschirm hat eine Diagonale von 4,2 Zoll und arbeitet mit einer Auflösung von 400 x 300 Pixeln (Abbildung 1). E-Ink-Displays haben konstruktionsbedingt drei große Nachteile: Zum einen sind sie teuer. Des Weiteren gibt es sie nur in Schwarz-Weiß oder in Schwarz-Weiß plus Akzentfarbe – bei Pimoroni ist das entweder Gelb oder Rot, beim Schwarz-Weiß-Display ersetzt ein helles Grau die Farbe. Darüber hinaus wirkt das Weiß bei vielen E-Inks auch eher elfenbeinfarben. Größter Nachteil sind aber die langen Update-Zyklen: So braucht das schwarz-weiße Display zwischen fünf und zehn Sekunden, während sich die Farbvarianten bis zu dreißig Sekunden Zeit lassen.

Abbildung 1: Der Inky-wHAT von Pimoroni.

Abbildung 1: Der Inky-wHAT von Pimoroni.

Bei Pimoroni belasten die Farb-Displays den Geldbeutel mit fast 60 Euro, die einfachere Schwarz-Weiß-Variante kostet immerhin noch 50 Euro. Für denselben Preis gehen inzwischen 5-Zoll-Displays mit vollem Farbumfang, 800 x 480 Pixel Auflösung und Touch-Bedienung über den Ladentisch. Trotz dieser Nachteile ist ein E-Ink-Schirm eine gute Wahl für bestimmte Projekte, denn ein Killer-Feature wiegt alle Minuspunkte auf: E-Inks behalten das Bild auch nach dem Abschalten der Stromversorgung bei, und das für Wochen und Monate.

E-Ink für Batterie-Projekte

Zwei einfache Regeln helfen bei der Auswahl des richtigen Displays. Ist eine Steckdose in der Nähe oder benötigen Sie schnelle und häufige Updates, dann greifen Sie zum Touchscreen und lassen den RasPi zur Not durchlaufen. Die höheren Stromkosten kommen immer noch weitaus billiger als ein teureres E-Ink-Display. Bei batteriegestützten Projekten sieht die Rechnung ganz anders aus, denn ein durchlaufender RasPi würde jede Batterie schnell leer saugen, selbst wenn er gerade vor sich hin schlummert.

Damit besteht das Kalender-Projekt aus zwei Teilen. Einmal geht es um ein Programm, das das Display ansteuert und die Daten darauf anzeigt. Dafür kommt Python zum Einsatz – nicht zuletzt, weil Pimoroni eine einfache Bibliothek bereitstellt und sich auch die Abfrage der Kalenderdaten per CalDAV mit vertretbarem Aufwand erledigen lässt. Im zweiten Teil kümmern wir uns um die Optimierung der Stromversorgung von RasPi und Display.

Wer etwas Geld sparen will, wählt statt des Pimoroni-Displays ein vergleichbares Exemplar von Waveshare, das es zum Beispiel über Amazon für 36 Euro gibt. Allerdings bietet das Inky wHAT einen Mehrwert in Form einer Buchsenleiste, von Montagelöchern und von herausgeführten Pins (Abbildung 2). Diese beschränken sich allerdings auf SPI, I2C und GPIO4. Dabei hätte Pimoroni wissen müssen, dass es nie genug GPIO-Anschlüsse geben kann. Zudem liegen beim Waveshare-Display die Anschlüsse ungünstig an der Seite, und der RasPi verschwindet nicht unsichtbar hinter dem Display.

Abbildung 2: Rückseite des Inky wHAT mit den Anschlüssen.

Abbildung 2: Rückseite des Inky wHAT mit den Anschlüssen.

Das gesamte Kalender-Projekt mit Quellcode und einem 3D-Modell für einen Display-Halter finden Sie im Github-Repository des Autors [2]. Dort findet sich auch ein Installationsskript, das alle Bibliotheken einrichtet und den RasPi konfiguriert. Details dazu gibt es im README des Projekts. Der folgende Abschnitt beschreibt die dort automatisierten Schritte.

Installation und Konfiguration

Da der RasPi das Display über SPI ansteuert, müssen Sie diese Schnittstelle mittels Raspi-config aktivieren. Für die Installation der Python-Schnittstelle stellt Pimoroni ein Skript bereit. Wer lieber selbst die Kontrolle behält, verwendet die Kommandos aus Listing 1. Wenn Sie die Beispiele aus dem Pimoroni-Repository [3] ausprobieren möchten, brauchen Sie noch ein paar Bibliotheken mehr. Das README erläutert die dafür notwendigen Anpassungen.

Listing 1

$ sudo apt install python3-numpy python3-rpi.gpio python3-spidev python3-pip
$ sudo pip3 install smbus2 inky

Die Details der Ansteuerung versteckt die per Pip3 installierte Python-Bibliothek inky hinter einer extrem einfachen API. Die Zeilen in Listing 2 zeigen das Prinzip: In Zeile 9 lädt der Code ein passendes Bild und gibt es auf dem Schirm aus. Wie das Bild erstellt wird, ist dabei im Prinzip irrelevant – für Python hat sich für die Wiedergabe dynamischer Bilder die PIL (Python-Image-Library) als Standard etabliert.

Listing 2

#!/usr/bin/python3
from inky import InkyWHAT
from PIL import Image
display = InkyWHAT("black")
display.set_border(display.WHITE)
img = Image.open("rpg-titel.png")
display.set_image(img)
display.show()

Möchten Sie wie in Listing 2 bestehende Bilder anzeigen, dann müssen diese im PNG-8-Format vorliegen und dürfen nur drei Indexfarben nutzen. Wie Sie solche Bilder mit Gimp erzeugen, beschreibt das Tutorial zum Inky pHAT, der kleineren Version des wHATs [4]. Abbildung 1 zeigt eine der letzten Ausgaben dieses Magazins; die sichtbaren Unschärfen liegen am Umwandlungsprozess, denn nicht jedes Bild eignet sich für das Eindampfen auf drei Farben.

Unabhängig von diesem Unterbau (Bilderzeugung and -anzeige) benötigen Sie je nach Anwendung noch diverse weitere Bibliotheken. In diesem Projekt wäre das die CalDAV-Bibliothek zum Einbinden eines Kalenders. Auch sie gibt es aus den Pi-OS-Repositories sowie über Pip, wobei hier die Wahl auf die Installation via Pip fällt, da diese Version deutlich aktueller ist.

PIL und Pillow

Die PIL wird bereits seit 2009 nicht mehr weiterentwickelt. Allerdings gibt es einen kompatiblen Fork, der sich Pillow nennt. Nicht gerade hilfreich ist, dass Debian das Paket python3-pil nennt, es aber aus den Pillow-Quellen baut. Bei OpenSuse heißt das Paket python3-Pillow; wenn Sie es dagegen über Pip installieren, dann heißt es schlicht pillow. Auf einem RasPi ist die erste Variante der Favorit, denn die Paketverwaltung installiert auch alle abhängigen Grafikbibliotheken automatisch mit. Die Pip-Version ist zwar aktueller, erfordert aber einiges an Nacharbeit.

Die wichtigsten Funktionen zeigt Listing 3, ein stark vereinfachter Ausschnitt aus dem Code des Projekts. Die Zeilen 5 und 6 erzeugen ein leeres Bild im richtigen Format sowie das dazugehörige Zeichenobjekt, zugewiesen an die Variable canvas (englisch: Leinwand). Auf diese Oberfläche malen wir später Linien, Texte und Flächen. Die obere linke Ecke der Leinwand hat dabei die Koordinaten 0,0. Linien sind besonders einfach: Hier genügt die Angabe der Start- und Zielkoordinaten, der Farbe (Parameter fill) und die Breite (Zeile 10). Der fill-Parameter bekommt als Wert 0, 1 oder 2 – die Werte stehen für die drei verfügbaren Farben in der Palette.

Listing 3

from PIL import Image, ImageDraw, ImageFont
class DailyAgenda(object):
  def __init__(self):
   self._image  = Image.new("P",400,300,1)
   self._canvas = ImageDraw.Draw(self._image)
  # Horizontale Linie
  self._canvas.line([(0,y),(400,y)],fill=2,width=1)
  # Rechteck mit Koordinaten oben-links und unten-rechts
  box = [x1,y1,x2,y2]
  self._canvas.rectangle(box,fill=1)
  # Text an Position (x,y) schreiben und messen
  fname = "/usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf"
  fsize = 18
  text_font  = ImageFont.truetype(fname,fsize)
  sef._canvas.text((x,y),'Meeting',font=text_font,fill=1)
  text_box = sef._canvas.textsize('Meeting',font=text_font,spacing=0)
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 7 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben