Rechteckige Flächen erzeugen Sie ähnlich. Das Zeichenobjekt stellt dazu die Methode rectangle() bereit. Sie nimmt als erstes Argument die Koordinaten entgegen, als zweites Argument wieder die Farbe über den fill-Parameter (ab Zeile 12). Außer Linien und gefüllten Flächen nutzt das Kalenderprogramm nur noch Texte. Dafür laden Sie zuerst einen Font, dann schreiben Sie den Text mit der Methode text(). Sie erwartet als Parameter die Zielkoordinaten (obere linke Ecke der umschließenden Box), den Text, die Schriftart und eine Farbe (Zeile 23).
Zwar kommen wir mit drei Methoden aus, doch PIL bietet keinerlei Layout-Management, sodass die exakte Platzierung (gerade von Texten) zur Rechenaufgabe wird. Während der Programmierer die Größe von Linien und Rechtecken selbst vorgibt, hängt die Textbox vom Inhalt, dem Font und der Schriftgröße ab. Die textsize()-Methode hilft bei den notwendigen Berechnungen (Zeile 24). Abbildung 3 zeigt das Ergebnis. PIL können Sie übrigens mit jedem beliebigen Bildschirm nutzen, etwa auch den nützlichen Mini-OLEDs, die es mit I2C- oder SPI-Anschluss gibt.
Den Teil des Codes, der sich mit der Abfrage des CalDAV-Servers beschäftigt, spart dieser Artikel bewusst aus. Hier lauern Probleme, da das CalDAV-Protokoll alles andere als trivial ist. So gibt es Termine mit Anfang und Ende, andere mit Anfang und Dauer und wieder andere mit einer definierten Zeitzone, die es bei der Anzeige zu berücksichtigen gilt. Hinzu kommen Besonderheiten der Server: So lieferte der Baikal-Server des Autors erst nach einem Update auf die aktuelle Version korrekte Daten an das anfragende Python-Programm.
Die Stromversorgung
Jeder Raspberry Pi benötigt eine stabile Spannungsversorgung mit 5 Volt, auch wenn die Komponenten einen geringen Strombedarf haben. Der direkte Betrieb eines RasPi an einer Batterie oder einem Akku funktioniert daher nicht. Die naheliegendste Lösung – eine Powerbank – ist aus zwei Gründen keine gute Idee. Zum einen sind Powerbanks groß und klobig; damit passen sie nicht so recht zu dem schlanken Display. Zum anderen besitzen moderne Powerbanks eine Abschaltautomatik, falls der Entladestrom unter eine gewisse Schwelle fällt. Mit den großen RasPi-Modellen stellt das kein Problem dar, sie ziehen auch im Idle-Modus genug Saft. Der Pi Zero aber ist schon zu sparsam.
Hängt der RasPi also nicht an einer Steckdose, gelten Akkus oder Batterien zusammen mit einem sogenannten DC-DC-Konverter als Standardlösung. Achten Sie beim Kauf auf einen sinnvollen Bereich für die Eingangsspannung; die Ausgangsspannung sollte entweder fest bei 5 Volt liegen oder sich regulieren lassen. Im letzteren Fall stellen Sie eine etwas höhere Ausgangsspannung (5,2 V) ein, an der Zuleitung zum RasPi kommt es sowieso wieder zu einem Spannungsabfall. Zusätzliche Pufferkondensatoren helfen gegebenenfalls bei Stabilitätsproblemen.
Wichtig für dieses und andere batteriebetriebene Projekte ist die Möglichkeit, den Strom abzuregeln. Deshalb sollten Sie darauf achten, dass der Konverter einen Enable-Pin hat. Liegt der auf Masse, trennt der Konverter die Spannung vom Ausgang. Die meisten verfügbaren Konverter stammen jedoch aus dem Billigsegment und bieten deshalb außer Masse sowie Spannungsein- und -ausgang keine weiteren Anschlüsse. In diesem Fall müssen Sie ein Mosfet für das Schalten der Spannung in die Schaltung integrieren.
Beim Autor fanden sich in der Bastelkiste drei passende Komponenten zur Auswahl. Abbildung 4 zeigt von links nach rechts den LipoShim von Pimoroni [5], den TPS61023 von TI/Adafruit [6] sowie den Powerboost 500C, ebenfalls von Adafruit [7]. Der LipoShim besitzt keine Ladeschaltung, und der JST-Anschluss für den Akku hält nicht viele Steckzyklen aus. Allerdings sind die Spannungsanschlüsse zusätzlich herausgeführt, deshalb ließe sich das Projekt mit dem Mini-HAT in Kombination mit einem externen Akku durchaus realisieren.
Der TPS61023 eignet sich dagegen nur für komplett selbst entworfene Schaltungen, denn der Baustein ist nicht mehr als ein Konverter im Mini-Format. Bei diesem Projekt fiel die Wahl letztlich auf den Powerboost, da er zusätzlich zum eigentlichen Konverter alles bietet, was das Bastlerherz begehrt. Die Platine führt den Enable-Pin des Konverters heraus, überwacht die Spannung und schaltet bei schwachem Akku zusätzlich zu einer Warn-LED einen Pin auf High; eine Ladeschaltung samt Micro-USB-Anschluss gibt es auch. Das relativiert den vergleichsweise hohen Preis der Platine (15 Euro).
An und aus
Ist die Stromversorgung gesichert, stellt sich die nächste Frage: Wie schaltet man den RasPi an und aus? Die einfachste Lösung ist ein manueller Schalter, den manche Batteriegehäuse gleich mitbringen. Im Alltag führt das aber schnell zu Problemen, denn der Anwender muss vor dem Ausschalten warten, bis der RasPi heruntergefahren ist. Vergisst er es, dann saugt der Mini-Rechner den Akku langsam leer, denn selbst nach einem Shutdown zieht er unnötigerweise Strom.
Der RasPi sollte sich also nach dem Herunterfahren selbst abschalten. Dafür benötigen Sie eine kleine Hilfsplatine mit einem Flipflop. Die Schaltung zeigt Abbildung 5, die Platine sehen Sie in Abbildung 6. Das Flipflop gibt es für 50 Cent zum Beispiel bei Reichelt. Über einen Taster, den Sie am Reset-Pin des Flipflops anschließen, schalten Sie dann indirekt den Enable-Pin ein, denn der hängt am Ausgang Q des Flipflops. Ein GPIO-Pin des RasPi ist ebenfalls mit dem Flipflop verbunden (CLK). Er reagiert auf steigende Flanken, invertiert in der Schaltung den Ausgang Q von High auf Low und schaltet so den Strom wieder ab.
Auf dem Raspberry Pi-Systems genügt eine kleine Änderung: In der /boot/config.txt tragen Sie die Zeile dtoverlay=gpio-poweroff ein. Damit wird GPIO26 nach einem Shutdown auf High gesetzt. Sie können auch einen anderen Pin verwenden (Parameter gpiopin=[...]), aber nicht jeder eignet sich für diese Aktion: Während des Bootens muss der RasPi den Pin auf Low halten, bis der GPIO-Poweroff-Treiber übernimmt. Beim Autor kommt GPIO4 zum Einsatz, denn dieser ist beim Inky wHAT herausgeführt.
Automatismus
Mit der obigen Schaltung läuft das Einschalten manuell, das Abschalten dagegen automatisch. Das genügt dem Autor, denn einen normalen Tageskalender muss man ja auch täglich abreißen. Will man allerdings auch das Einschalten automatisieren, gibt es zwei Möglichkeiten. Die eine ist der Ersatz beziehungsweise die Ergänzung des Tasters mit einer Echtzeituhr, denn auch eine solche RTC kann per programmiertem Alarm den Pegel des Flipflop-Resets auf Low ziehen. Das verkompliziert die Schaltung nur unwesentlich, denn die RTC bezieht ihre Spannung direkt vom Akku. Zusätzlich ist eine I2C-Verbindung zum RasPi nötig, damit dieser den nächsten Aufwachzeitpunkt programmieren kann. Die RTC sollte in diesem Szenario keine eigenen Pullups auf dem I2C-Bus haben.
Eine Alternative zur Flipflop-Platine bietet ein Timer-Chip, wie ihn der Enable-Timer-Button [8] von Adafruit bietet (Abbildung 7). Er steuert einerseits den Enable-Pin des Konverters und nimmt andererseits analog zum Flipflop das Abschaltsignal des RasPi entgegen. Der Nachteil des Chips: Das längste mögliche Intervall beträgt zwei Stunden. Tagsüber würde ein regelmäßiges Update des Kalenders noch Sinn machen, während der Nacht verschwendet das aber nur unnötig Strom. Dennoch ist der Timer-Button in Kombination mit einem Hauptschalter eine gute Wahl. Wer Mikrocontroller programmieren kann, ersetzt das Flipflop und den Timer-Button durch einen nicht wesentlich teureren Kleinstprozessor und gewinnt damit an Flexibilität.
Das An- und Abschalten ist übrigens eine durchgehende Schwäche der allermeisten Batterie-HATs, die es auf den üblichen Marktplätzen gibt. Die Hersteller können sich offensichtlich nicht vorstellen, dass ein batteriebetriebener Raspberry Pi selbstständig booten und auch wieder herunterfahren soll. Das höchste der Gefühle ist eine Abschaltautomatik bei niedriger Leistungsaufnahme.
Hoch und runter
Die ganze Automatik der Elektronik nützt nichts, wenn der Raspberry Pi nicht mitspielt. Für das Update des Kalenders installiert das Projekt deshalb einen Systemd-Service, der beim Hochfahren den Kalender aktualisiert (Listing 4, Zeile 10) und anschließend gleich wieder den Shutdown einleitet (Zeile 11). Der Boot-Prozess lässt sich nur minimal optimieren, denn die Zeit bis zum Aufbau einer funktionierenden WLAN-Verbindung ist der längste Schritt. Auf RasPi-Seite hat nur die Wahl einer statischen IP-Adresse etwas Einfluss darauf. Beim Autor startet deshalb das Update-Programm ungefähr 25 Sekunden nach dem Booten.
Listing 4
[Unit] Description=Update Daily-Agenda on E-Ink-Display Requires=network-online.target After=network-online.target Wants=network-online.target [Service] Type=oneshot RemainAfterExit=true ExecStart=/usr/local/bin/daily_agenda.py ExecStart=/bin/systemctl poweroff [Install] WantedBy=multi-user.target










