Aus Raspberry Pi Geek 04/2020

Adafruits PyPortal im Test (Seite 2)

Details zum Update insbesondere mit Links zur aktuellen Firmware sowie zum Arbeiten mit CircuitPython finden Sie in der Dokumentation von Adafruit [5]. Letztlich unterscheidet sich das Arbeiten mit dem PyPortal nicht vom Umgang mit anderen CircuitPython-Boards wie etwa dem Trinket M0 [6].

Abbildung 3 zeigt das Layout der Dateien im Betriebsmodus. Im Wurzelverzeichnis liegt die Datei code.py oder main.py, das Unterverzeichnis lib/ enthält Bibliotheken. Die Datei code.py enthält den Python-Code des Hauptprogramms, das als Endlosschleife arbeitet. Weitere Dateien und Verzeichnisse hängen von der jeweiligen Anwendung ab.

Abbildung 3: An einen Linux-Rechner angeschlossen erscheint der Speicher des PyPortal als normales Laufwerk.

Abbildung 3: An einen Linux-Rechner angeschlossen erscheint der Speicher des PyPortal als normales Laufwerk.

Geek-Wetter

Das mitgelieferte Beispielprogramm von Adafruit ruft in regelmäßigen Abständen einen schlauen Spruch von einem Webserver ab und zeigt ihn auf dem Display an. Um sich im WLAN anzumelden, benötigt das Programm die Zugangsdaten, die Sie in die Datei secrets.py eintragen. Das Programm erweist sich bei genauerem Hinsehen als nicht sehr lehrreich, da es alle Magie in der Klasse PyPortal versteckt. Daher entwickeln wir hier ein eigenes Projekt und zeigen, wie man Bilder und Text anzeigt.

Das PyPortal eignet sich bestens zum Entgegennehmen und Visualisieren von Daten. Unser Programm fragt deshalb via Internet das Wetter bei Wttr.in ab. Dieses Wetterportal der etwas anderen Art liefert einen werbefreien Wetterbericht für die Kommandozeile und basiert auf dem Go-Programm Wego, sodass Freunde von ASCII-Art auf ihre Kosten kommen. Abbildung 4 zeigt die Luxusversion. Im Terminal rufen Sie diese Wetterprognose für Ihren Standort mit curl wttr.in ab. Die Eingabe curl wttr.in/:help zeigt die Syntax.

Für das kleine PyPortal passen wir die URL den Gegebenheiten an. Die Ausgabe zeigt dann statt der detaillierten Mehrtagesvorhersage nur die aktuellen Wetterdaten (Listing 3, Zeile 27).

Abbildung 4: Das Projekt Wttr.in gibt angeforderte Wetterdaten im ASCII-Format auf der Konsole aus.

Abbildung 4: Das Projekt Wttr.in gibt angeforderte Wetterdaten im ASCII-Format auf der Konsole aus.

Hintergrundbild einrichten

Zunächst gilt es, einen schönen Bildschirmhintergrund auf dem Schirm zu platzieren. Das PyPortal unterstützt hier nur Bitmaps im 8-Bit-Format mit einer Größe von 320 x 240 Pixeln. Für das Projekt schnitten wir ein Wolkenbild in Gimp entsprechend zu und exportierten es ins BMP-Format. Der Code aus Listing 1 zeigt das Bild an.

Listing 1

import board
import displayio
from adafruit_bitmap_font import bitmap_font
# -------------------------------------------
def get_background(filename):
  bg_file = open(filename, "rb")
  background = displayio.OnDiskBitmap(bg_file)
  return displayio.TileGrid(background,
   pixel_shader=displayio.ColorConverter())
# --- main-loop   ---------------------------
display = board.DISPLAY
group   = displayio.Group()
# set background
group.append(get_background("wolken.bmp"))
display.show(group)
while True:
  time.sleep(60)

Die UI-Bibliothek displayio verwendet ihre eigene Nomenklatur. Während andere Toolkits einen Baum von Widgets aufbauen und darstellen, heißt das hier group. Das Programm erzeugt die Top-Level-Gruppe in Zeile 16 von Listing 1. Das Unterprogramm get_background() erzeugt aus der BMP-Datei ein TileGrid (Kachelraster), das selbst wieder eine Gruppe darstellt.

Der Befehl in Zeile 19 fügt diese Gruppe als erste Untergruppe hinzu und zeigt in Zeile 21 alles an. Die Reihenfolge der Untergruppen bestimmt die Darstellung: Je früher Sie eine Untergruppe hinzufügen, desto weiter hinten liegt sie, weshalb der Hintergrund auch zuerst an der Reihe ist.

Textausgabe

Zur Textausgabe dient die Klasse Label. Hier irritiert erneut die Begrifflichkeit – bei einem Label handelt es sich üblicherweise um eine kurze Beschriftung. In der displayio-Nomenklatur bezeichnet Label hingegen eine mehrzeilige Textbox. Immerhin erledigt die Bibliothek die ganze Arbeit transparent im Konstruktor, wie Zeile 10 in Listing 2 demonstriert. Der Konstruktor erzeugt ein Label aus dem übergebenen Text, wertet dabei eingebettete Zeilenumbrüche aus und sorgt auch für einen passenden Zeilenabstand.

Listing 2

import board
import time
import displayio
from adafruit_bitmap_font import bitmap_font
from adafruit_display_text import label
# -------------------------------------------
def get_label(text,font,color):
  text_area = label.Label(font, text=text, color=color)
  (x,y,w,h) = text_area.bounding_box
  text_area.x = 0
  text_area.y = -y
  return text_area
# --- main-loop   ---------------------------
display = board.DISPLAY
group   = displayio.Group()
FONT    = bitmap_font.load_font("/DroidSansMono-16.bdf")
COLOR   = 0xFFFFFF
text="""Zeile1
Zeile2
Zeile3"""
group.append(get_label(text,FONT,COLOR))
display.show(group)
while True:
  time.sleep(60)

Die absolute Ausrichtung der gesamten Textbox gestaltet sich jedoch wenig intuitiv. Wer das Label einfach ausgibt, sieht nur die Hälfte des Inhalts: Die X- und Y-Koordinaten der Textbox beziehen sich auf die Mitte ihres linken Rands, der dann in der oberen linken Ecke des Displays landen würde. Die Zeilen 11 bis 13 korrigieren den Offset des Labels, sodass die Textausgabe dort landet, wo man es erwartet.

Wer mehrere Texte in unterschiedlichen Farben oder Größen ausgeben will, kommt nicht mit einem Label aus. Beim korrekten Layout helfen dann die Dimensionen der Bounding-Box aus Zeile 11.

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