Fonts
Die Textausgabe verwendet stets Bitmap-Fonts, mit allen damit verbundenen Vor- und Nachteilen. Bitmap-Fonts enthalten Mini-Bilder aller Zeichen, sodass ein aufwendiges Rendering der Buchstaben entfällt. Da dadurch die Zeichengröße festliegt, benötigt man für jede Größe einen eigenen Font. Leistungsfähigere Systeme, bei denen der Rendering-Overhead keine Rolle spielt, verwenden deshalb platzsparendere Zeichensatzformate. Als Folge davon gibt es im Internet kaum Bitmap-Fonts zum Herunterladen.
Zum Glück steht in Form von Fontforge ein Umwandlungsprogramm bereit, das Sie über die Paketverwaltung des Systems einspielen oder von der Fontforge-Homepage herunterladen. Anschließend folgen Sie der Anleitung [7] zum Erstellen des Bitmap-Fonts Ihrer Wahl, wofür wenige Mausklicks genügen. Um die ASCII-Grafik der Wetterausgabe korrekt darzustellen, fiel die Wahl im vorliegenden Projekt auf einen Monospace-Font.
Daten aus dem Netz
Als dritter Baustein nach Hintergrundbild und Text fehlt nur noch die Verbindung ins Netz, denn von dort sollen ja die Daten kommen. Die entscheidenden Befehle dazu zeigt das Listing 3. Zeile 11 importiert die SSID und das WLAN-Passwort aus der Datei secrets.py, der Code in den Zeilen 14 bis 21 baut dann über den ESP32-Chip die Verbindung auf.
Listing 3
import board
import busio
from digitalio import DigitalInOut
import time
import neopixel
import displayio
from adafruit_esp32spi import adafruit_esp32spi, adafruit_esp32spi_wifimanager
# ---------------------------------------------
from secrets import secrets # file secrets.py
def get_wifi(secrets):
esp32_ready = DigitalInOut(board.ESP_BUSY)
esp32_gpio0 = DigitalInOut(board.ESP_GPIO0)
esp32_reset = DigitalInOut(board.ESP_RESET)
esp32_cs = DigitalInOut(board.ESP_CS)
spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset, esp32_gpio0)
status_rgb = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.2)
return adafruit_esp32spi_wifimanager.ESPSPI_WiFiManager(esp, secrets, status_rgb)
# --- main-loop ------------------------------
connection = get_wifi(secrets)
try:
response = connection.get("https://wttr.in/München?AT0&lang=de")
text = response.text
except:
text = "keine Daten erhalten"
group.append(get_label(text, FONT, COLOR))
display.show(group)
while True:
time.sleep(60)
Steht die Verbindung, lassen sich die üblichen HTTP-Requests wie GET und POST absetzen sowie die Rückgabe des Servers auswerten – üblicherweise über HTML, bei Abfrage eines Daten-Servers via JSON. Bei Wttr.in handelt es sich dagegen um einfachen Text (Listing 3, Zeilen 28 und 30), den das Programm nach dem Umwandeln in ein Label direkt ausgibt (Abbildung 5).

Abbildung 5: Das PyPortal zeigt von Wttr.in übernommene Wetterdaten an. Als Hintergrund dient ein auf die Erfordernisse angepasstes Wolkenbild.
Mit noch nicht einmal 50 Zeilen Code zeigt das Display die aktuellen Wetterdaten an. Dem Programm fehlt aber noch das regelmäßige Abfragen des Wetterberichts. Der get()-Befehl gehört also in die Endlosschleife am Ende des Programms. Außerdem wäre sowohl die Anzeige der aktuellen Zeit als auch der Innentemperatur über den eingebauten Sensor des PyPortal wünschenswert. Dazu finden Sie auf Github eine entsprechend aufgebohrte Version unseres Beispielprogramms [8].
Der Temperatursensor des PyPortal entpuppt sich allerdings als Flop: Die Hintergrundbeleuchtung des Displays heizt ihn auf, sodass er unbrauchbare Werte liefert. Konsequenterweise sparte Adafruit diesen Sensor bei den PyPortal-Varianten Pynt und Titano ein. Als bessere Alternative hängen Sie einen alternativen Baustein (etwa einen BME280 oder LM75) über ein kurzes Kabel an die I2C-Schnittstelle des PyPortal.
Besser als der RasPi?
Das Beispielprojekt hat zumindest einen Teil der Möglichkeiten des PyPortal aufgezeigt. Hier stellt sich die Frage, wie sich das intelligente Adafruit-Display im Vergleich mit einem Pi Zero plus Mini-Bildschirm schlägt.
Das größte Plus des PyPortal ist seine kompakte Bauform. Die Prozessoren, Komponenten und Anschlüsse auf der Rückseite tragen kaum auf. Bei den gängigen Mini-Bildschirmen hängt der RasPi dagegen eher wackelig an der Buchsenleiste oder einem HDMI-Winkel. Im ersteren Fall blockiert der Bildschirm in aller Regel auch Pins, die er gar nicht benötigt, und ein Anschluss zusätzlicher Sensoren erfordert dann eine Multiplexerplatine.
Anders als der RasPi bringt das PyPortal einen Mini-Lautsprecher zur Soundausgabe mit. Der eignet sich zwar eher für Warn- und Signalmelodien als zum Musikhören, dem Pi Zero aber fehlt er ganz.
Unabhängig von der Ausstattung gestaltet sich auch das Inbetriebnehmen des intelligenten Displays viel einfacher als beim Pi Zero. Jegliche Fummelei an einer /boot/config.txt mit speziellen Overlays oder HDMI-Parametern entfällt. Zum Abschalten genügt es, den Stecker zu ziehen, denn es gibt kein Betriebssystem, das Sie erst sauber herunterfahren müssten.
Der Stromverbrauch des PyPortal liegt bei angeschaltetem Display bei ungefähr 200 mA, ansonsten bei 70 mA. Damit eignet sich der Bildschirm zwar nicht für den Akkubetrieb, belastet aber selbst im Dauerbetrieb die Stromrechnung nicht über Gebühr. Ein exakt gleich großes Display für den RasPi stand für Vergleichsmessungen nicht zur Verfügung, aber ein RasPi mit einem 4-Zoll-Bildschirm von Waveshare kam auf 260 mA. Der Unterschied von 60 mA zwischen PyPortal und Pi Zero samt Display lässt sich zwar messen, spielt aber in der Praxis kaum eine Rolle.
Freilich bietet das PyPortal nicht in jedem Fall die bessere Lösung, denn viele seiner Vorteile verkehren sich in bestimmten Anwendungsfällen in Nachteile. Wer deutlich mehr Bildschirmfläche oder eine bessere Auflösung braucht, muss zum RasPi greifen. Der bietet darüber hinaus eine schnellere CPU, mehr RAM und Multitasking. Diese umfangreicheren Ressourcen erlauben auch anspruchsvollere und komplexere Programme. Insbesondere bei der Gestaltung grafischer Oberflächen bieten entsprechende Toolkits mit Layout-Management dem Entwickler mehr Möglichkeiten als die Displayio-Bibliothek des PyPortal.





