Ein Raspberry Pi Pico 2W steuert über sein SPI-Interface ein 7,5-Zoll-EPD (Electronic Paper Display) mit einer Auflösung von 800 x 480 Pixeln an. Ich benutze dafür ein zweifarbiges E-Paper mit den Farben Schwarz und Rot.
Die anzuzeigenden Icons und Daten können flexibel über die Datei config.py eingestellt werden.
Die Messwerte erhält der Pico über WLAN von einem zentralen MQTT-Broker.
Dabei wird beim Start das Dictionary TOPICS = {…} in config.py ausgewertet und die entsprechenden Topics beim Broker abonniert. Die empfangenen Werte werden formatiert und als String in verschiedenen Variablen abgespeichert.
Die anzuzeigenede Icons und Texte sind in dem Dictionary CONTENT={…} definiert.
Die ersten 3 Variablen im config.py müssen auf das benutzte Wlan-Netz eingestellt werden:
– SERVER = „xxx.xxx.xxx.xxx“ # e.q. „192.168.145.45“
– WlPw = „your wlan password“
– WlSsid = „name from your wlan“
So kann man dann flexibel verschiedene Icons und Daten auf einem E-Paper anzeigen:

Aufbau des Dictionary TOPICS und abonnieren einer Nachricht:
Mit dem Mqtt Explorer kann man sich alle Topics und Messages von seinem MQTT Broker anschauen.

Zum Beispiel soll der Messwert des Smartmeters, der die aktuelle Leistungsaufnahme des Hauses enthält, vom Kanal 1-0:16-7.0 abonniert und in die Variable current_power abgespeichert werden. Des Weiteren soll die Temperatur des Kollektors der Heizung in die Variable hz_koll gespeichert werden.
TOPICS = {
„Smartmeter“: {
„1-0:16.7.0“: [„current_power“]},
„Heizung“: {
„Kollektor“: {
„Temperatur“: [„hz_koll“, „4.1f“, “ C“],
},
},
}
Die Temperatur des Kollektors wird als Gleitkommazahl mit einer Nachkommastelle angezeigt und erhält die Einheit C hinten angehängt. Der Messwert wird anschließend in die Variable „hz_koll” als string gespeichert.
Aufbau des Dictionary CONTENT für die Anzeige von Icons und Texten:
– „text“: {} gibt einen Text mit der Schriftart des definierten Fonts an einer bestimmten Stelle x, y aus.
– „tiles“: {} gibt eine Icon aus, zusätzlich kann ein Text rechts und unterhalb des Icons ausgeben werden.
– „lines“ {} gibt Linien aus, zur Unterteilung von Bereichen.
Nun soll der Messwert current_power und hz_koll aus den empfangenen Nachrichten aus den TOPIC mit einem Icon und seinem Wert angezeigt werden:
sxroom = 20
line2 = 180
CONTENT = {
„tiles“: {
„S“: { # Solar, if len(„S“) < 2 -> no name will be placed as head
„c“: [„measure_photovoltaic_inst“, tfont21], # c = content [Name des Icons, Font]
„p“: [sxroom + 115, line2], # p = placement (x, y)
„v“: [„hz_koll“], # v = Text vertical placement under the icon, h = horizontal
}
}
}
Die Icons müssen im Portable Bitmap Format im Verzeichnis „images“ des Pi Pico 2W abgespeichert werden. Dafür habe ich unter https://github.com/heli2src/svg2pbm einen Konverter geschrieben, der einfarbige SVG-Dateien in das Portable-Bitmap-Format umwandelt. Entsprechende SVG-Icons können beispielsweise aus dem Projekt smartVISU aus dem Github-Bereich bezogen werden. Mit dem Konverter können dann die svg-images in alle Größen konvertiert werden.
Aufgrund des großen Displays mit 800 x 480 Pixeln, der Icons und der verschiedenen Schriften ist der Speicherverbrauch sehr hoch, sodass es nur auf einem Raspberry Pi Pico 2W mit dem RP2350 läuft. Der RP2040 hat dafür zu wenig internes RAM.
Als ich die Software für das Display geschrieben habe, war MicroPython in der Version 1.25 aktuell. Mit dieser Version habe ich den Stromsparmodus machine.lightsleep(20000) jedoch nicht zum Laufen bekommen. Da das Display bei mir aber über einen Spannungswandler direkt an der KNX-Spannungsversorgung läuft, waren mir die durchschnittlichen 25 mA Stromaufnahme erst einmal egal.
Wenn das E-Paper jedoch an einer Batterie betrieben werden soll, muss man das noch verbessern.
Den Python-Code gibt es auf meinem Github-Bereich. Das Project sollte so nach Anpassung der config.py laufen. Alle benötigten libs sind in dem Verzeichnis vorhanden. Die extern verwendeten Lib-Versionen sind vom Dezember 2024. Es werden die Bibliothek von Peter Hinch Nano-gui für die GUI und die MQTT-Simple-Version von miccropython-lib benutzt.
Im Github-Bereich gibt es auch die CAD-Daten für den Alurahmen und die Elektronik-Box zum Fräsen oder Drucken.