Projekt: Matrixuhr-ESP32

Matrixuhr-ESP32-Bild Diese Uhr verwendet ein aus 2048 RGB-LEDs bestehendes Matrix-Panel als Anzeige. Hier werden neben der Uhrzeit in großen Ziffern auch verschiedene andere Daten angezeigt: Datum, Wochentag, Informationen vom Temperatur-Messsystem, Sensordaten von Haussteuerungen, Geburtstage, Wetterinformationen, Kraftstoffpreise sowie eine Textnachricht als Laufschrift. Weiterhin können Alarme signalisiert werden. Diese Uhr hat ungefähr die gleiche Funktionalität wie die ältere Matrixuhr, verwendet aber anstatt der Kombination von ATmega1284P und Raspberry Pi Zero W jetzt ein einzelnes Mikrocontroller-Board auf der Basis eines ESP32. Das hat den Vorteil, dass nur noch eine Software für die gesamte Uhr erforderlich ist. Weiterhin lassen sich alle Funktionen der Uhr über einen integrierten Web-Server konfigurieren. Über ein optionales Sound-Modul können bei bestimmten Ereignissen bis zu 6 verschiedene Klänge erzeugt werden.

Symbol Status
Statusaktiv
Letzte Bearbeitung07.03.2024
Aktueller Softwarestandv1.200 vom 05.03.2024
SymbolDownloads
Schaltplan
Stückliste mit Empfehlungen zur Bauteilbestellung
Software v1.200 für ESP32 (AZ-Delivery ESP32-WROOM-32 Devkit v4) als kompletter Quelltext in C vom 05.03.2024 matrixesp-software-v1200.zip
Fertig kompilierte Firmware v1.200 für ESP32 (AZ-Delivery ESP32-WROOM-32 Devkit v4) vom 05.03.2024 matrixesp-firmware-v1200.zip
Sound-Paket mit 6 Klängen für das Sound-Modul der Matrixuhr-ESP32matrixesp-sounds.zip
Flash Download Tool für ESP32 (wird für die erste Inbetriebnahme benötigt) https://www.espressif.com/en/support/download/other-tools
Homepage von Termite (serielles Terminalprogramm) https://www.compuphase.com/software_termite.htm
Homepage von MQTT Explorer (hilfreich bei Problemen mit der MQTT-Kommunikation)https://mqtt-explorer.com/
Symbol Inhaltsverzeichnis
BeschreibungAllgemeine Informationen über die Matrixuhr
SchaltungBeschreibung der Schaltung
HardwareBilder und Hinweise zum Aufbau der Uhr
SoftwareBeschreibung der Software der Uhr
InbetriebnahmeInbetriebnahme der Uhr
BedienungBedienungsanleitung und komplette Beschreibung aller Funktionen
Weitere InformationenInformationen über die Anzeige von Daten und Alarmen
SonstigesEinige Hintergrundinformationen zur Entwicklung der Uhr
Symbol Beschreibung

Die Matrixuhr-ESP32 ist eine sehr genaue Uhr, die zyklisch über NTP von einem Zeitserver im Internet (oder vom Router im Heimnetz) synchronisiert wird. Neben Uhrzeit, Datum und Wochentag können viele Zusatzinformationen angezeigt werden. Diese Informationen werden über MQTT von einem Server im Heimnetz (z.B. dem Web-Modul) bezogen. Das können Werte von Sensoren im Haus sein, aber auch Wetterdaten oder Kraftstoffpreise von bestimmten Tankstellen. Weiterhin gibt es die Möglichkeit, eine Liste mit Namen und Geburtstagen zu verwalten und es können die Alarme vom Temperatur-Messsystem ausgewertet werden. Alle Funktionen werden von einem ESP32-Mikrocontroller-Board gesteuert, wobei ich hier ein ESP32 Dev Kit C V4 von AZ-Delivery verwendet habe.

Das auffälligste und namensgebende Merkmal der Uhr ist das Matrix-Display. Dieses besteht aus 2048 RGB-LEDs, die in einer Matrix von 64 Spalten und 32 Reihen angeordnet sind. Auf dem Panel sind bereits LED-Treiber und mehrere Schieberegisterketten integriert, so dass eine relativ einfache Ansteuerung über einen Mikrocontroller möglich ist. Die LEDs können unter optimalen Bedingungen einen großen Farbraum abdecken, in der Matrixuhr-ESP32 werden jedoch nur 16 vordefinierte Farben verwendet. Diese sind allerdings in einem weiten Bereich in der Helligkeit steuerbar und das wird mithilfe eines Fototransistors zur Helligkeitsregelung genutzt. Im normalen Betrieb verwendet die Uhr nur 3 Farben: eine für die Uhrzeit, eine für Zusatzinformationen wie Datum, Wochentag, Sensorwerte, Geburtstage sowie eine weitere für Alarmmeldungen. Jede dieser 3 Farben kann manuell festgelegt oder per Zufall bestimmt werden. Im Zufallsmodus erfolgt die Farbänderung zu jeder vollen Stunde. Bei den Farben gibt es allerdings eine Ausnahme: Die Uhr kann verschiedene Symbole darstellen und diese haben zum Teil feste Farben, die nicht geändert werden können.

Die Anzeige der Uhrzeit und der Zusatzinformationen erfolgt im normalen Betrieb der Uhr so wie es im Titelbild dargestellt ist. Die Uhrzeit wird mit 18 Pixel hohen Ziffern angezeigt und die Zusatzinformationen darunter mit einer 11 Pixel hohen Schrift, die natürlich auch Umlaute und Unterlängen sauber darstellen kann. Treten Alarmmeldungen auf, dann schaltet die Uhr in einen 3-zeiligen Modus um. Die Ziffernhöhe der Uhrzeit wird dabei auf 8 Pixel verringert und die beiden Zeilen darunter zeigen dann Zusatzinformationen und Alarme jeweils mit einer 11 Pixel hohen Schrift an. So gehen keine Informationen verloren - bis auf eine Ausnahme: Wird eine Textnachricht zur Uhr gesendet, dann überdeckt diese Laufschrift eventuell anstehende Alarmmeldungen.

Zur Signalisierung von Alarmen kann die Matrixuhr insgesamt 6 verschiedene Klänge erzeugen. Diese werden über ein zusätzliches Sound-Modul abgespielt. Dieses Modul enthält einen 8MB großen Flash-Speicher für Soundfiles, einen MP3-Player und einen Class-D-Verstärker mit einer Leistung von 5W. Hier kann direkt ein Lautsprecher angeschlossen werden. 4 Klänge sind für Alarme vorgesehen, einer für den Stundengong und ein weiterer für die bereits erwähnte Laufschrift-Nachricht. Zur Quittierung einer laufenden Textnachricht oder anstehender Alarme gibt es als einziges Bedienelement einen Touchsensor. Über diesen lässt sich außerdem durch längere Berührung eine Stummschaltung aktivieren und durch eine zweimalige Berührung die IP-Adresse der Uhr anzeigen.

Die Matrix-Displays gibt es übrigens in mehreren Baugrößen mit LED-Abständen von 2.5, 3, 4, 5 und 6mm, viele Händler verwenden dabei die Größenangaben P2.5, P3, P4, P5 und P6. Damit lässt sich die Matrixuhr in Größen von 160mm x 80mm bis 384mm x 192mm aufbauen. In dem hier beschriebenen Projekt habe ich die 5mm-Version (P5) verwendet. Leider ist das Matrix-Display in Deutschland nicht immer erhältlich und auch relativ teuer. Man kann bei Alternativen wie z.B. AliExpress oder ebay bestellen, sollte dabei aber einige Dinge beachten: Das Display muss einen HUB75-Anschluss haben und mit dem Multiplexverfahren 1/16 Scan arbeiten. Ein weiteres Detail ist die Größe der LEDs. Viele Hersteller verwenden sehr kleine LEDs und das sieht bei den größeren Display-Varianten ab P4 nicht sehr schön aus. Hier sollte man sich die Produktbilder genau anschauen.

Leider gibt es bei einigen älteren Matrix-Displays einen Kritikpunkt: Bei niedrigen Helligkeiten in dunkler Umgebung fallen schwach leuchtende Pixel auf, die eigentlich gar nicht angesteuert werden (Geisterpixel-Effekt). Dies lässt sich durch eine Konfigurations-Einstellung etwas mindern, aber nicht ganz beseitigen.

Symbol Schaltung

Schaltung

Die gesamte Schaltung der Matrixuhr-ESP32 ist im Vergleich zur älteren Matrixuhr sehr übersichtlich. Alle Funktionen der Uhr werden von einem Mikrocontroller-Board gesteuert, welches sich auf einer steckbaren Platine mit 38 Anschlüssen befindet (ESP32-WROOM-32 Dev Kit v4 von AZ-Delivery). Einen großen Teil dieses Boards belegt eine Tochterplatine, die den eigentlichen Mikrocontroller ESP32 von Espressif enthält. Dieser besteht intern aus 2 Mikroprozessoren und arbeitet mit einer Taktfrequenz von 240 MHz. Außerdem sind noch 4 MB Flashspeicher und 512 kB RAM integriert und für die Kommunikation über WLAN und Bluetooth gibt es noch eine Antenne am Platinenrand. Auf dem restlichen Teil des Boards befindet sich eine Micro-USB-Buchse, ein CP2102 zur seriellen USB-Kommunikation, ein 3,3V-Spannungsregler und 2 Taster. Übrigens, es können hier auch andere ESP32-WROOM-32-Boards verwendet werden, hier muss man aber unbedingt auf die Anschlussbelegung achten, die sehr stark abweichen kann. Als Referenz für den richtigen Anschluss gilt dabei die GPIO-Nummer. So muss z.B. die Leitung R1 vom Matrix-Display immer auf GPIO25 führen. Übrigens, der hier verwendete ESP32 ist eigentlich nicht mehr aktuell, hat sich aber in vielen Schaltungen bewährt und ist relativ günstig zu bekommen.

Eine wichtige Aufgabe des Mikrocontrollers ist die Ansteuerung des Matrix-Displays. Dieses hat trotz integrierter Treiber, Schieberegister und Latches keinerlei Intelligenz und muss ständig im Multiplexbetrieb aufgefrischt werden. Dafür werden die 32 Zeilen in 2 Multiplexeinheiten aufgeteilt, eine steuert die oberen 16, die andere die unteren 16 LED-Zeilen an. Beide Einheiten werden über gemeinsame Multiplex-Leitungen gleichzeitig bedient, die RGB-Farbinformationen für die 64 LED-Spalten gelangen dann getrennt über jeweils 3 Leitungen in die Schieberegisterketten. Wie das genau funktioniert, ist im Abschnitt Software beschrieben. Der Anschluss des Displays erfolgt über den 16-poligen Pfostenstecker J2, von dem 13 Leitungen mit dem Controller-Board IC1 verbunden sind. Die Ports GPIO25, GPIO26 und GPIO27 geben die RGB-Farbdaten an die obere Bildhälfte aus, die Ports GPIO14, GPIO12 und GPIO13 an die untere Bildhälfte. Die Ports GPIO23, GPIO19, GPIO5 und GPIO17 selektieren eine der 16 Bildzeilen für die Multiplexausgabe. Über die verbleibenden 3 Leitungen erfolgt die Steuerung der Datenausgabe: GPIO16 bestimmt den Takt für die Ausgabe einer Bildzeile, GPIO4 gibt das Signal zum Speichern einer gesendeten Bildzeile und über GPIO15 können die LED-Ausgänge ein- und ausgeschaltet werden. R1 sorgt für einen High-Pegel an GPIO15 bzw. OE während des Systemstarts sowie während der Programmierung des Controllers und reduziert ein Flackern des Displays.

Für den Sound wird ein Modul DY-SV8F aus chinesischer Produktion verwendet. Dafür gibt es einen Grund: Der ESP32 hat nicht genügend freie Ausgänge für eine direkte Ansteuerung der 6 Klänge. Somit kann das ELV-Soundmodul MSM4, welches bei der älteren Matrixuhr zum Einsatz kommt, hier nicht verwendet werden. Das DY-SV8F ermöglicht eine Steuerung über eine serielle Schnittstelle mit 9600 Baud. Damit reicht ein Ausgang des ESP32 (GPIO18) für die komplette Sound-Steuerung und es ist sogar möglich, die Lautstärke über diese Schnittstelle einzustellen. Das DY-SV8F enthält einen MP3/WAV-Player, einen 8 MB Flashspeicher für Sounddateien und einen 5W-Class-D-Verstärker, an den direkt ein Lautsprecher mit 4-8 Ω angeschlossen werden kann. Über eine Micro-USB-Buchse lässt sich das Modul mit einem PC verbinden. Es verhält sich dann wie ein externes Laufwerk und ermöglicht so die Übertragung der Sounddateien in den Flashspeicher. Die schlechte Nachricht ist, dass man dieses Modul nicht bei deutschen Händlern kaufen kann (Stand Oktober 2023). Allerdings gibt es viele Angebote bei Ebay oder Amazon.

Über die Bauelemente T1, R2, R3 und C2 wird die Helligkeit erfasst und in eine Gleichspannung umgesetzt. Diese gelangt über den Anschluss GPIO34 an einen internen Analog-Digital-Konverter des ESP32 und der ermittelte Wert wird dann von der Software der Matrixuhr weiterverarbeitet. Über das Trimmpotentiometer R3 kann die Empfindlichkeit der Helligkeitsregelung eingestellt werden. Das letzte noch nicht erwähnte Element ist eine Sensorfläche, die direkt mit dem Anschluss GPIO2 des ESP32 verbunden ist. Der ESP32 erkennt eine direkte Berührung dieser Sensorfläche und das wird genutzt, um 3 Funktionen der Matrixuhr zu steuern. Ich habe allerdings ein etwas ungutes Gefühl bei diesem Schaltungsteil und hoffe, der Anschluss ist gut gegen statische Aufladungen geschützt.

Die Stromversorgung der Uhr besteht aus einem leistungsstarken Schaltnetzteil (5V, 5A), welches direkt an das Matrix-Display und an die Schraubklemmen J1 der Controllerplatine angeschlossen wird. Der größte Verbraucher ist das Matrix-Display, welches bis zu 4A aufnimmt, wenn alle LEDs mit voller Helligkeit leuchten. In der Praxis liegt der Strombedarf meist unter 1A, da nie die volle Helligkeit verwendet wird und außerdem immer nur ein Teil der LEDs aktiv ist. Das ESP32-Modul hat laut Datenblatt eine maximale Stromaufnahme von 500 mA. Ich habe im normalen Betrieb Werte zwischen 100 mA und 200 mA gemessen. Mit etwa 14 mA im Ruhezustand ist das Sound-Modul recht sparsam, allerdings steigt der Stromverbrauch beim Abspielen von Sounds stark an. Hier können je nach Lautstärke Spitzenwerte über 1A auftreten.

Der Verkabelungsplan im nächsten Bild zeigt alle Komponenten der Matrixuhr-ESP32 und die notwendigen Verbindungen. Flachbandkabel und Stromkabel für das Matrix-Display liegen übrigens dem Display bei. Am Stromkabel sind bereits Kabelschuhe angebracht, die an das Netzteil passen, wenn man sie ein wenig zusammenbiegt.

Verkabelungsplan

Wichtiger Hinweis: Normalerweise verwende ich Netzteile, bei denen man nicht mit der Netzspannung in Berührung kommt. Bei diesem Projekt bin ich anders vorgegangen und habe ein preisgünstiges Industrienetzteil gewählt, bei dem das Netzkabel mit Schraubklemmen angeschlossen werden muss. Hier muss sehr sorgfältig gearbeitet werden und selbstverständlich nur im spannungsfreien Zustand! Eigentlich darf das nur ein Fachmann tun und wer sich das nicht zutraut, sollte besser auf ein Netzteil mit einem steckbaren Netzanschluss zurückgreifen. In der Stückliste habe ich eine passende Alternative angegeben. Hier lassen sich allerdings die Kabel zum Display und zur Controllerplatine nicht direkt anschließen und es muss ein passender Adapter gebastelt werden.

Symbol Hardware

Platine oben Für dieses Projekt wurde eine Lochrasterplatine mit einer Größe von 96mm x 96mm verwendet. Die Platinengröße orientiert sich hier an der Höhe des verwendeten P3-Displays. Am linken Rand befinden sich die Schraubklemmen J1 für die Betriebsspannung, der Pfostenstecker J2 für das Matrix-Display und darunter der Anschluss J4 für den Lautsprecher.

Der obere Bereich wird durch das ESP32-Board belegt, welches auf zwei 19-polige Buchsenleisten aufgesteckt wurde. Darüber sind die Bauteile für die Helligkeitssteuerung angeordnet. Der zweipolige Steckverbinder oben links ist für den Helligkeitssensor vorgesehen (J3). Im unteren Teil befindet sich das Sound-Modul, welches ebenfalls auf Buchsenleisten aufgesteckt wurde (2-polige Leiste oben und 12-polige Leiste unten). Die leichte Schieflage des Sound-Moduls ergibt sich übrigens durch die oberen beiden Anschlüsse, die nicht im 2,54mm-Raster liegen. Ganz rechts ist das Trimmpotentiometer R3 für die Empfindlichkeit der Helligkeitsregelung angeordnet und direkt links daneben wird der Touchsensor angeschlossen (J5).

Auf meiner Prototyp-Platine sind auch einige Bauteile zu sehen, die nicht im Schaltplan eingezeichnet sind: 2 Jumper und ein 3-poliger Steckverbinder. Diese Teile waren bei der Software-Entwicklung und beim Test der Helligkeitsregelung sehr hilfreich, sind aber für den Nachbau der Uhr nicht erforderlich.

Platine unten Die Platinenunterseite besteht aus einigen dicken Drähten (0,5mm) für Masse und Stromleitungen sowie aus jeder Menge Kupferlackdrähten (0,3mm) für die Signalleitungen. Zu beachten ist, dass links neben den Anschlüssen des ESP32-Boards keine weiteren Bauteile angeordnet werden sollten. Hier befindet sich die WLAN-Antenne des ESP32-Boards. Außerdem sollten die Leitungen zum Matrix-Display nicht länger als unbedingt nötig sein.

Gehäuse Rückseite Dieses Bild zeigt das Gehäuse der Uhr von hinten. Es besteht im Prinzip nur aus einem 8mm dicken Rahmen aus Sperrholz mit den Innenmaßen 192mm x 96mm, was genau der Displaygröße entspricht. Das Display liegt dabei auf insgesamt 6 kleinen Holzstücken auf, wobei die 4 auf der linken Seite gleichzeitig die Basis für die Controllerplatine bilden. Die rechte Seite ist hier für das Netzteil reserviert. An das Holzstück mit den 2 Löchern an der Oberseite wird später der Lautsprecher angeschraubt.

Hier sind auch schon 2 Kabel vorbereitet: Eins führt zum Helligkeitssensor T1, der sich in der rechten Seitenwand befindet (im Bild links). Das andere Kabel ist mit dem Touchsensor verbunden, welcher in der gleichen Seitenwand untergebracht ist.

Der Einbau des Helligkeitssensors ist etwas knifflig: Zunächst wird vom Sensorelement der Rand in der Nähe der Anschlüsse abgeschliffen. Dann wird das Anschlusskabel angelötet, wobei die Enden vorerst noch offen bleiben. Anschließend wird vorsichtig ein Loch (je nach Sensorvariante 3mm oder 5mm) von vorn in die Seitenwand gebohrt (Tiefe ungefähr 30mm), wobei man das Rahmenteil unbedingt fest einspannen sollte, damit die Lochränder nicht ausbrechen. Dann wird von der Innenseite ein wenige Millimeter tiefes Loch gebohrt und wenn man es richtig macht, treffen sich die beiden Löcher. Jetzt kann man das Kabel und den Sensor von vorn in das Loch stecken und das Kabel an der Innenseite herausführen. Ist man mit dem Ergebnis zufrieden, wird von innen etwas Zweikomponentenkleber in das Loch gegossen und der Sensor damit verklebt.

Beim Touchsensor habe ich eine recht simple Lösung realisiert: Da die Sensorfläche nicht zu groß sein darf, um Fehlauslösungen zu vermeiden, verwende ich einen verzinkten Nagel mit einem Kopfdurchmesser von ungefähr 5mm. Der Nagel wurde zunächst etwas gekürzt und dann ein Kabel angelötet. In die Seitenwand wurde ein passendes Loch gebohrt und der Nagel so eingeklebt, dass der Kopf bündig mit der Außenfläche des Gehäuses abschließt.

Gehäuse Netzteil eingebaut Auf diesem Bild ist die Gehäuse-Rückseite zu sehen, bei der das Netzteil eingebaut und komplett verkabelt ist. Über 2 kurze M3-Schrauben, die von außen durch die Seitenwand führen, wurde das Netzteil festgeschraubt. Da bei meiner Uhr die Anschlüsse zum Netzteil nach dessen Einbau nicht mehr zugänglich sind, musste ich diese vorher anschließen. Das Stromkabel zum Matrix-Display ist sehr reichlich bemessen und liegt hier in Schleifen zwischen Display und Netzteil. Das Stromkabel zur Controllerplatine ist ebenfalls schon vorbereitet. Hier habe ich 2 Kabelschuhe angebracht, so dass die Anschlüsse zusammen mit dem Display-Kabel an die entsprechenden Klemmen des Netzteils geschraubt werden können.

Gehäuse fertig Hier sind jetzt alle Komponenten eingebaut, festgeschraubt und verkabelt. Die Controllerplatine wurde mit unterschiedlichen Schrauben befestigt. Die beiden Kreuzschlitzschrauben greifen in die darunter liegenden Holzstücke, die Schlitzschrauben gehen durch die Holzstücke in die Gewinde des Matrix-Displays und fixieren damit beide Elemente.

Eine Rückwand ist hier übrigens nicht vorgesehen. Die Uhr kann einfach mit der offenen Rückwand an die Wand gehängt werden. Allerdings empfehle ich, 4 Abstandsstücken von ungefähr 5mm Dicke hinten an den 4 Ecken anzubringen. Damit entsteht ein unauffälliger Schlitz an allen Seiten, der zum einen für eine Luftzirkulation sorgt und zum anderen den Sound besser nach außen leitet.

Gehäuse vorn So sieht dann die Matrixuhr im Betrieb aus. Das Erstellen des Fotos war hier ähnlich schwierig wie bei der älteren Matrixuhr. Vielleicht gelingt irgendwann mal ein besseres Bild.

Symbol Software

Dieses Kapitel beschreibt die Software der Matrixuhr-ESP32. Das ist sehr trocken und wer sich nicht für die Details interessiert, darf das Kapitel gern überspringen. Für den Nachbau und den Betrieb der Uhr sind die folgenden Informationen nicht notwendig.

Zur Erstellung der Software für den ESP32 habe ich die Arduino-Plattform und die dort übliche Sprache C++ verwendet. Bei der Entwicklungsumgebung fiel die Wahl auf Visual Studio Code von Microsoft in Verbindung mit PlatformIO. Es ist ebenso möglich, die Arduino-Entwicklungsumgebung zu verwenden, diese ist allerdings nicht so komfortabel. Die Datei matrixesp-software-v1200.zip enthält den Quelltext in 2 Versionen: eine für PlatformIO und eine für die Arduino-IDE. Die Programmdateien sind in beiden Versionen identisch und haben folgende Funktion:

main.cpp / matrixuhr-esp32.inoenthält die Hauptfunktionen mit Initialisierung und Hauptprogrammschleife
http.henthält die HTML-Seitenstruktur für den Web-Server und eine Funktion für dynamische Inhalte
process.henthält Funktionen für die Verarbeitung von Sensordaten, Alarmen und Geburtstagen
functions.henthält zahlreiche Funktionen, die vom Hauptprogramm und anderen Komponenten benötigt werden
charset.henthält Zeichensätze für Ziffern und Textelemente in mehreren Größen und verschiedene Symbole
tables.henthält diverse Tabellen und Listen
platformio.inienthält Projekt-Einstellungen und eine Liste der benötigten Bibliotheken (nur bei der PlatformIO-Version notwendig)

main.cpp bzw. matrixuhr-esp32.ino: Das Hauptprogramm der Matrixuhr-ESP32 beginnt mit einer Liste von Definitionen. Hier werden alle benötigten GPIO-Anschlüsse festgelegt und einige wichtige Konstanten definiert. Anschließend folgt eine Liste mit den benötigten Bibliotheken, welche zum Teil von der ESP32-Entwicklungsumgebung mitgeliefert werden. Einige müssen jedoch von externen Quellen installiert werden. Bei der Verwendung von PlatformIO erfolgt diese Installation automatisch über die Datei platformio.ini, bei Verwendung der Arduino-IDE muss man diese Bibliotheken manuell installieren. Die nachfolgende Tabelle listet alle externen Bibliotheken und deren Bezugsquelle auf, die für die Matrixuhr-ESP32 notwendig sind:

ESP32 HUB75 LED MATRIX PANEL DMA Display https://github.com/mrfaptastic/ESP32-HUB75-MatrixPanel-DMA
Adafruit GFX Library https://github.com/adafruit/Adafruit-GFX-Library
Adafruit BusIOhttps://github.com/adafruit/Adafruit_BusIO
ESPAsyncWebServerhttps://github.com/me-no-dev/ESPAsyncWebServer
AsyncTCPhttps://github.com/me-no-dev/AsyncTCP
espMqttClienthttps://github.com/bertmelis/espMqttClient
ArduinoJsonhttps://github.com/bblanchon/ArduinoJson

Nach dem Einbinden der Bibliotheken werden eine Reihe Dateinamen festgelegt. Der ESP32 bietet die Möglichkeit, ein Dateisystem im Flashspeicher anzulegen. Hier können Dateien gespeichert und auch wieder ausgelesen werden. Dieses Dateisystem bleibt auch bei einem Update der Controller-Software erhalten und bietet sich deshalb zur Speicherung der Konfiguration an. Um die Arbeit mit den Konfigurationsdateien etwas zu vereinfachen, habe ich die Informationen auf mehrere Dateien aufgeteilt. Im nächsten Abschnitt werden 4 wichtige Elemente angelegt: das Matrix-Panel, der WLAN-Client, der Web-Server und der MQTT-Client. Die nachfolgende sehr lange Liste definiert alle Variablen, die in der Matrixuhr-ESP32 verwendet werden. Schließlich werden noch weitere Programmteile eingebunden, die wegen der besseren Übersicht in separaten Dateien untergebracht wurden. Jetzt beginnt das eigentliche Programm, welches aus 2 Teilen besteht:

setup(): Dieser Programmteil wird nur einmal beim Systemstart ausgeführt und beginnt mit der Initialisierung von 2 seriellen Schnittstellen. Die Schnittstelle Serial ist über einen CP2102-Chip mit dem USB-Anschluss des ESP32-Boards verbunden. Hier werden beim Systemstart und auch im laufenden Betrieb der Uhr einige Statusinformationen ausgegeben, die in der Entwicklungsumgebung oder mit einem Terminalprogramm angezeigt werden können. Außerdem dient diese Schnittstelle zur Herstellung der WLAN-Kommunikation bei der Inbetriebnahme. Die andere Schnittstelle Serial2 wird später zur Kommunikation mit dem Sound-Modul verwendet. Im nächsten Schritt erfolgt die Prüfung des Dateisystems. Wird kein Dateisystem gefunden, dann wird von einem fabrikneuen ESP32 ausgegangen und ein neues Dateisystem angelegt. Ich habe mich hier für das Dateisystem LittleFS entschieden, da dieses wohl langfristig das weit verbreitete SPIFFS ablösen wird.

Ist das Dateisystem in Ordnung, werden nacheinander alle Konfigurationsdateien gelesen und die dazugehörigen Variablen gesetzt. Fehlen Dateien oder sind Dateien unvollständig, dann werden die Variablen mit Voreinstellungen belegt. Damit ist in den meisten Fällen ein sauberer Systemstart möglich. Mit den geladenen Einstellungen kann nun das Matrix-Display und auch die grundsätzliche WLAN-Funktion aktiviert werden. Ein weiterer Programmteil stellt die Uhr auf ein aktuelles Datum und setzt einige Zähler-Variablen auf sinnvolle Werte. Der letzte Block ist zugleich auch der größte: Hier werden alle Funktionen definiert, die mit dem Web-Server zusammenhängen. Dazu sind für jede Web-Seite mindestens 2 Definitionen notwendig: eine für den Aufruf der Seite (HTTP GET) und eine für Aktionen, wenn ein Button auf der Seite angeklickt wird (HTTP POST). Letztere ist teilweise mehrfach vorhanden und etwas aufwändiger, da alle Informationen der Web-Seite ausgelesen und verarbeitet werden müssen.

loop(): Dieser Programmteil läuft in einer endlosen Schleife und erledigt alle zyklischen Aufgaben der Matrixuhr. Zunächst werden die Zeitinformationen für die spätere Ausgabe auf dem Matrix-Display aufbereitet und einige Zeitzähler geprüft. Letztere steuern einige Vorgänge, die nur zu bestimmten Zeiten ausgeführt werden sollen. So werden z.B. der Helligkeitssensor, der Touchsensor und einige Zeitzähler nur alle 40 ms aufgerufen. Für andere Vorgänge wie z.B. die Ausgabe von zusätzlichen Informationen auf dem Matrix-Display und die Steuerung der WLAN- und MQTT-Verbindung gilt ein Zeitintervall von 1 Sekunde.

Der nachfolgende Block ist für die Ausgabe aller Informationen auf dem Matrix-Display zuständig. Zunächst wird geprüft, ob der Display-Test-Modus aktiv ist und dann zur Ausgabe des gewünschten Tests verzweigt. Im Normalmodus erfolgt die Ausgabe aller Daten auf dem Matrix-Display. Die Anzeige ist dabei abhängig vom gerade aktuellen Anzeigemodus. So wird bei aktuellen Alarmmeldungen oder bei der Ausgabe einer Textnachricht die Zeit in einer anderen Form ausgegeben. Viele Funktionen der Ausgabe wurden in die Datei functions.h ausgelagert, damit das Hauptprogramm halbwegs übersichtlich bleibt. Das betrifft alle Funktionen für die Farbsteuerung sowie die Funktionen zur Ausgabe der einzelnen Pixel bei Texten, die wiederum aus den Zeichensätzen in der Datei charset.h entnommen werden. Eine Besonderheit bei der Datenausgabe auf das Matrix-Display möchte ich noch erwähnen: Die Matrix-Bibliothek verwaltet 2 Pixelpuffer. Während die Informationen des einen auf dem Display ausgegeben werden, lässt sich auf dem anderen Puffer das Display-Bild komplett neu aufbauen und anschließend erfolgt ein Wechsel zwischen den beiden Puffern. Das Ergebnis ist ein flackerfreies Bild.

Nach der Display-Ausgabe folgen einige kleinere Programmteile, die unter anderem folgendes tun:

Ein weiterer Programmblock kümmert sich um die WLAN-Steuerung. Viele ESP-Projekte, die man im Netz findet, gehen nach folgendem einfachen Prinzip vor: Die WLAN-Verbindung wird einmal im setup()-Programmteil hergestellt und sich selbst überlassen. Das funktioniert grundsätzlich auch über einen gewissen Zeitraum. Wenn aber im laufenden Betrieb die Verbindung unterbrochen wird, muss man meist das Gerät neu starten, um wieder eine Verbindung zu bekommen. Ich bin anders vorgegangen und stelle die Verbindung erst in der Hauptprogrammschleife her. Dabei erfolgt auch eine ständige Überwachung des Verbindungsstatus und im Falle einer Unterbrechung wird nach Ablauf eines Wartezählers die Verbindung wieder aktiv hergestellt. Im nachfolgenden Abschnitt steuert ein ähnlicher Mechanismus die MQTT-Verbindung.

Den Abschluss bildet ein Programmteil zur Kommunikation mit der seriellen Schnittstelle Serial, welche mit dem USB-Anschluss des ESP32 verbunden ist. Hier wurde ein einfacher Dialog realisiert, der es ermöglicht, die WLAN-Daten (SSID und Passwort) bei der ersten Inbetriebnahme der Uhr einzugeben. Dazu werden 4 Kommandos ausgewertet, die im Kapitel Inbetriebnahme beschrieben werden. Nach der erfolgreichen Eingabe der WLAN-Daten werden diese im Dateisystem des ESP32 gespeichert. Beim nachfolgenden Neustart der Uhr erfolgt dann die Aktivierung der WLAN-Verbindung.

http.h: In dieser Datei sind alle Programmteile und Informationen zusammengefasst, die mit dem Web-Server der Matrixuhr zusammenhängen. Das betrifft die komplette Web-Seiten-Struktur: HTML-Header, Seitenmenü, Hauptseite, alle Unterseiten sowie einige spezielle Elemente. Ein weiterer großer Block ist eine spezielle Funktion mit dem Namen processor, die für dynamische Informationen auf der Web-Seite notwendig ist. Dazu befinden sich in der Web-Seiten-Struktur Platzhalter-Elemente, die in Prozentzeichen eingeschlossen sind. Die Processor-Funktion wird immer dann aktiv, wenn ein Platzhalter in der Web-Seite gefunden wird. Dabei wird der Platzhalter durch den entsprechenden Wert oder Text ersetzt. Den Abschluss bilden 2 spezielle Funktionen: Eine ist zur Erstellung einer Liste für den Datei-Manager zuständig, die andere zur Erstellung einer Geburtstagsliste.

process.h: Diese Datei enthält alle Funktionen, die bei der älteren Matrixuhr als Perl-Programm auf dem Raspberry Pi laufen. Diese wurden an C++ angepasst und teilweise etwas anders strukturiert. Den Anfang macht eine Funktion zum Dekodieren der Wetterdaten, die im JSON-Format über MQTT empfangen werden. Dieser folgt eine weitere Funktion, die nach dem gleichen Prinzip für die Dekodierung der Kraftstoffpreise zuständig ist. Weitere 2 Funktionen kümmern sich um UTF-8-Zeichen und wandeln diese in den intern verwendeten Zeichenkode der Uhr um. Ein recht großer Funktionsblock verarbeitet Sensorwerte, Geburtstage und spezielle Alarme. Den Abschluss bildet eine Funktion, die eine Textnachricht (entweder eingegeben oder über MQTT empfangen) für die Laufschrift-Anzeige aufbereitet.

functions.h: In dieser Datei befinden sich viele Funktionen, die zur besseren Übersicht der Hauptprogrammschleife und anderer Programmteile ausgelagert wurden. Die wichtigsten sind in der folgenden Übersicht aufgelistet:

charset.h: Diese Datei enthält alle Zeichen für die Anzeige auf dem Matrix-Display in Form von Pixel-Bitmaps. Es gibt mehrere Zeichensätze, die sich in der Anzahl der Zeichen und der Größe unterscheiden, außerdem noch Wettersymbole, die auf die Wetterinformationen von OpenWeatherMap optimiert sind. Weiterhin sind noch 7 spezielle Symbole hier untergebracht.

tables.h: In dieser Datei sind einige Tabellen und Listen untergebracht. Den Anfang macht eine Farbtabelle, in der die 16 Farben der Matrixuhr als RGB-Wert festgelegt sind. Die beiden nachfolgenden Tabellen gehören zusammen und sind für die Einstellung der insgesamt 26 Helligkeitsstufen zuständig. Der Grund für die Teilung ist, dass die Matrix-Bibliothek nur wenige recht grobe Helligkeitsabstufungen bietet. So wird über die erste Tabelle die grobe Stufe eingestellt und über eine Berechnung des Farbwertes mit einem Divisor aus der zweiten Tabelle eine feinere Abstufung erreicht. Es folgen einige Texte, 2 kleine Tabellen für die UTF-8-Dekodierung und eine Liste mit Kommandos für das Sound-Modul. Weiter geht es mit einer Liste, welche die Datei favicon.png enthält, die vom Web-Server in die HTML-Struktur eingebunden wird. Eine weitere Liste hilft bei Ermittlung des richtigen Wettersymbols und den Abschluss macht eine lange Liste mit den Wetterlagetexten.

platformio.ini: Diese Datei enthält wichtige Informationen zum Projekt und wird nur dann benötigt, wenn der Quelltext mit Visual Studio Code und PlatformIO bearbeitet werden soll. Hier stehen Daten über die genutzte Controller-Plattform, die verwendete Hardware, die genutzten COM-Ports für die Programmierung und den seriellen Monitor sowie eine Liste mit den benötigten Bibliotheken.

Matrix-Display: Hier noch einige Informationen über die Ansteuerung: Das Matrix-Display ist in 2 identische Einheiten unterteilt, die jeweils die oberen 16 und die unteren 16 Zeilen bedienen. Die Ausgabe der Informationen an die 16 Zeilen erfolgt dabei gleichzeitig an beide Einheiten im Multiplexverfahren. Dazu wird zunächst über die Leitungen A, B, C und D in binärer Form die gewünschte Displayzeile ausgewählt. Sind alle 4 Leitungen auf Low-Pegel, dann ist z.B. die Zeile 1 an beiden Display-Einheiten gewählt (also Zeile 1 und Zeile 17). Im nächsten Schritt werden die RGB-Farbwerte für die 64 Pixelspalten in die ausgewählte Zeile übertragen. Dazu dienen die Leitungen R1, G1 und B1 für die obere Display-Einheit und die Leitungen R2, G2 und B2 für die untere Display-Einheit. Diese Leitungen führen zu insgesamt 6 Schieberegisterketten mit jeweils 64 Bit, in die nun die Farbwerte der 64 Pixelspalten hineingeschoben werden. Dazu müssen an die Leitung CLK 64 Taktimpulse angelegt werden und ein anschließender Impuls an der Leitung LAT über nimmt die Pixeldaten in einen Zwischenspeicher (Latch). An den insgesamt 6 x 64 Ausgängen der Latches sind die RGB-LEDs angeschlossen und können nun über die Leitung OE für eine bestimmte Zeit eingeschaltet werden.

Dieser Vorgang wird nun für alle weiteren Zeilen (2-16 und parallel dazu 18-32) wiederholt. Man erkennt vermutlich schon, dass dieser Ausgabezyklus in hoher Geschwindigkeit erfolgen muss, damit sich ein möglichst flimmerfreies Bild ergibt. Eine einfache Rechnung: um ein Bild mit 100 Hz zu erzeugen, muss der Multiplex-Takt mit 1,6 kHz arbeiten und innerhalb einer Multiplex-Phase müssen natürlich die 64 Farbwerte über 64 Taktimpulse ausgegeben werden und das idealerweise so schnell, dass noch Zeit zum Anzeigen bis zur nächsten Phase übrig bleibt. Die hier verwendete Bibliothek benutzt DMA und eine I2S-Schnittstelle zur Ausgabe der Daten. Damit wird eine sehr hohe Geschwindigkeit erreicht und trotzdem der Mikrocontroller nur wenig belastet. Die Geschwindigkeit zur Ausgabe der Pixeldaten an das Display lässt sich in 4 Stufen zwischen 8 MHz und 20 MHz einstellen, die Bildwiederholfrequenz kann bis zu 200 Hz erreichen.

Symbol Inbetriebnahme

Die nachfolgend beschriebene Inbetriebnahme der Matrixuhr-ESP32 erfolgt in 2 Schritten und muss nur einmal durchgeführt werden. Im ersten Schritt wird über den USB-Anschluss des ESP32-Boards und einer speziellen Software der ESP32 mit der Matrixuhr-Firmware programmiert. Anschließend können über die bestehende USB-Verbindung und einem Terminalprogramm die WLAN-Daten eingegeben werden. In Schritt zwei erfolgt die Vorbereitung des Sound-Moduls. Dieses wird dafür ebenfalls über USB mit dem PC verbunden und mit den gewünschten Sound-Dateien gefüllt.

Symbol Schritt 1 - Inbetriebnahme des ESP32

Wichtig: Für die Inbetriebnahme des ESP32 muss das Board aus der Uhr ausgebaut werden. Dafür gibt es einen einfachen Grund: Es dürfen auf keinen Fall mehrere Stromversorgungen gleichzeitig angeschlossen sein. Im ausgebauten Zustand ist das ESP32-Board vom Matrixuhr-Netzteil getrennt und kann gefahrlos über ein Micro-USB-Kabel mit einem PC verbunden werden. Eine rote LED zeigt den Betriebszustand an und Windows sollte nun den USB-Chip CP2102 automatisch erkennen.

ESP32 USB Auf dem Windows-PC erreicht man über Einstellungen und Geräte eine Liste mit den angeschlossenen Geräten. Hier muss wie im Bild das Gerät Silicon Labs CP210x USB to UART Bridge erscheinen und außerdem ein COM-Port zugewiesen sein. Die Nummer des COM-Ports sollten wir uns merken, die wird später noch gebraucht.

Jetzt gibt es mehrere Möglichkeiten, die Software für die Matrixuhr in den Flashspeicher des ESP32 zu bekommen. Wer bereits eine Entwicklungsumgebung wie Visual Studio Code sowie PlatformIO oder alternativ die Arduino-Entwicklungsumgebung installiert hat, kann diese verwenden. In diesem Fall setze ich voraus, dass bekannt ist, wie man aus dem Quelltext die Software zusammenbaut und den ESP32 programmiert. Allerdings ist es für den Nachbau der Uhr nicht notwendig, eines dieser riesigen Software-Pakete zu installieren. Deshalb beschreibe ich hier etwas ausführlicher den Weg über ein relativ einfaches Programmiertool. Dieses wird von Espressif (dem Entwickler des ESP32) zur Verfügung gestellt und kann auf dessen Homepage geladen werden: https://www.espressif.com/en/support/download/other-tools. Hier findet man das Paket Flash Download Tools und dieses brauchen wir. Außerdem brauchen wir das aktuelle Firmware-Paket für die Matrixuhr matrixesp-firmware-v1200.zip.

Nach dem Download beider Pakete wird zunächst das Flash Download Tool entpackt und alle enthaltenen Dateien in einen geeigneten Ordner kopiert. Wichtig für uns ist die Programmdatei flash_download_tool_x.x.x.exe (die x enthalten die Versionsnummer) und das leere Verzeichnis bin. Dieses Verzeichnis ist für die Dateien vorgesehen, die in den ESP32 programmiert werden sollen und hier kopieren wir die 4 Dateien aus dem Firmware-Paket matrixesp-firmware-v1200.zip hinein. Jetzt wird das Programm flash_download_tool_x.x.x.exe gestartet.

Flash-Tool-Start Bei jedem Start zeigt das Flash-Download-Tool einen kleinen Dialog wie im Bild. Hier ist es wichtig, die erste Einstellung ChipType in ESP32 zu ändern. Mit einem Klick auf OK erscheint das Hauptfenster.

Flash-Tool-Hauptbild Im Hauptfenster sind etwas mehr Einstellungen notwendig. Der ESP32 verwaltet mehrere Speicherbereiche, die unterschiedliche Funktionen haben. Bei diesem Projekt müssen insgesamt 4 Dateien an ganz bestimmte Speicherpositionen geschrieben werden. Beim ersten Start des Flash-Download-Tools ist die Tabelle im oberen Bereich zunächst leer. Um diese zu füllen, klickt man in der ersten Zeile ganz links auf die Checkbox. Dabei wird ein Haken gesetzt und die gesamte Zeile rot eingefärbt. Als nächstes klickt man auf den Button mit den 3 Punkten. Es öffnet sich ein Dialog, mit dem man nun in das Verzeichnis bin wechseln und die erste Datei bootloader.bin auswählen kann. Die gewählte Datei erscheint anschließend in der Tabelle und der Eintrag wird grün. Jetzt muss noch in der rechten Spalte die Speicheradresse eingetragen werden, an die die angegebene Datei geschrieben werden soll. Beim Bootloader in der ersten Zeile ist das die Adresse 0x1000 (hexadezimale Schreibweise). Die Eingaben der Zeilen 2-4 erfolgen auf die gleiche Weise und am Ende muss das Programmfenster so aussehen wie im Bild.

Beim mittleren Teil SPIFlashConfig besteht kein Handlungsbedarf, hier sind die Voreinstellungen korrekt. Einstellungen sind jetzt nur noch im unteren Teil DownloadPanel 1 notwendig. Hier muss zuerst der COM-Port ausgewählt werden, der unserem ESP32-Board zugewiesen wurde. Das Flash-Download-Tool erkennt alle aktiven COM-Ports und bietet den richtigen in der Auswahlliste an. Zum Schluss kann man noch die Baudrate erhöhen, um den Programmiervorgang etwas zu beschleunigen. Eine gute Einstellung sind hier 921600 Baud.

Jetzt ist alles vorbereitet und mit einem Klick auf START wird der Programmiervorgang gestartet. Dieser dauert bei 921600 Baud ungefähr 10-15 Sekunden. Mit den voreingestellten 115200 Baud dauert es über eine Minute.

Flash-Tool fertig Wenn der untere Teil des Programmfensters so aussieht wie im nebenstehenden Bild, dann war der gesamte Programmiervorgang erfolgreich. Die Werte im Anzeigefeld sind bei jedem ESP32 anders und zeigen die Netzwerk-Adressen (MAC) an.

Hinweis: Wenn das für die Matrixuhr vorgesehene ESP32-Board vorher in einem anderen Projekt verwendet wurde, dann sollte man zuerst über den Button ERASE den Flash-Speicher löschen. Anschließend kann ein normaler Programmiervorgang über START erfolgen.

Das Flash-Download-Tool wird vorerst nicht mehr benötigt und kann beendet werden. Der ESP32 muss aber noch am PC angeschlossen bleiben, denn jetzt ist es noch erforderlich, die WLAN-Daten einzugeben. Dazu wird ein Terminalprogramm benötigt. Wer schon andere Projekte auf dieser Seite nachgebaut hat, hat vielleicht schon ein Terminal installiert und verwendet, z.B. TeraTerm, PuTTY oder Termite. Falls noch kein Terminalprogramm vorhanden ist, empfehle ich Termite. Dieses Programm ist sehr kompakt und einfach zu bedienen. Auf der Homepage von Termite https://www.compuphase.com/software_termite.htm gibt es 2 Versionen zum Download: eine komplette Setup-Version und eine Minimalversion als ZIP-Datei. Hier überlasse ich jedem selbst die Auswahl, beide Versionen können verwendet werden.

Termite 1 Nach der Installation und dem Programmstart präsentiert sich Termite wie im nebenstehenden Bild. Es müssen jetzt noch einige Einstellungen vorgenommen werden, damit Termite mit dem ESP32 kommunizieren kann. Dazu klicken wir auf den Button Settings.

Termite 2 Dieses Bild zeigt die Einstellungen von Termite. Ich habe hier bereits alles passend für das Matrixuhr-Projekt eingestellt. Man muss allerdings diese Einstellungen zweimal aufrufen, damit sich dieses Bild ergibt. Zuerst wird das Element User interface language auf Deutsch (de) geändert. Nach dem Klick auf OK wird ein Neustart-Fenster angezeigt, welches bestätigt werden muss. Anschließend erscheint Termite in deutscher Sprache wieder und über Einst. ruft man erneut die Einstellungen auf. Jetzt müssen noch folgende Elemente angepasst werden:

Schnittstelle - Hier muss der COM-Port eingestellt werden, der unserem ESP32-Board zugewiesen wurde.

Baudrate - Hier wird 115200 eingestellt.

Schrift - Hier wird die Einstellung auf standard geändert.

Mit OK erscheint wieder das Programmfenster von Termite.


Termite 3 Jetzt ist es notwendig, den ESP32 neu zu starten. Dazu drückt man kurz auf den mit EN bezeichneten Taster auf dem ESP32-Board. Es ist der Taster, der sich in der Nähe der roten LED befindet. Der ESP32 führt nun einen Neustart aus und gibt wie im Bild nebenan jede Menge Fehlermeldungen aus. Das ist völlig normal und hängt damit zusammen, dass noch keine Konfigurationsdateien vorhanden sind. Die letzte Meldung sollte wie auf dem Bild WLAN-Verbindungsaufbau sein.

Die Matrixuhr-Software auf dem ESP32 gibt hier nicht nur Informationen aus, es können auch Informationen eingegeben werden. Für einen ersten Test drücken wir einfach mal die Enter-Taste.

Termite 4 Die Software der Matrixuhr bietet hier eine Eingabemöglichkeit für die WLAN-Informationen über 4 Kommandos. Wenn man kein Kommando eingibt, dann erscheint dieser nebenstehende Hilfetext. Um die Matrixuhr mit dem WLAN zu verbinden, sollte zuerst mit dem ssid-Kommando der WLAN-Name eingegeben werden. Anschließend erfolgt die Eingabe des WLAN-Passwortes über das pass-Kommando. Mit dem Kommando list kann man sich die eingegebenen Informationen zur Kontrolle noch einmal anzeigen lassen. Wenn alles passt, wird schließlich das save-Kommando verwendet. Dieses speichert die WLAN-Daten im Dateisystem des ESP32 ab und startet den ESP32 neu.

Termite 5 Dieses Bild zeigt das Terminalfenster nach der Eingabe von Beispieldaten über die Kommandos ssid, pass und list. Das sieht auf den ersten Blick etwas seltsam aus, hat aber seinen Grund. So haben die Zeilen beim ssid-Kommando folgende Bedeutung:

ssid Mein_WLAN - Dieses Kommando muss über die separate Zeile ganz unten eingegeben werden und nach dem Abschluss mit ENTER erscheint diese Zeile zur Kontrolle hier im Terminalfenster. Mein_WLAN muss dann natürlich durch den richtigen WLAN-Namen ersetzt werden.

ssid Mein_WLAN - Diese Zeile wird von Termite generiert und enthält die Informationen, die über die serielle Schnittstelle zum ESP32 gesendet wurden.

SSID: Mein_WLAN - Diese Zeile zeigt die Informationen an, die vom ESP32 empfangen wurden. Hier hat die Software der Matrixuhr das Kommando verarbeitet und die eingegebene SSID akzeptiert.

Zusammengefasst gilt: nur die blauen Zeilen müssen eingegeben werden.

Termite 6 Hier kann man sehen, was nach der Eingabe des save-Kommandos passiert. Der ESP32 wird neu gestartet und es kommen wegen der noch fehlenden Konfiguration wieder viele Fehlermeldungen. Aber jetzt wird die WLAN-Verbindung hergestellt und die vom Netzwerk zugewiesene IP-Adresse sowie die Empfangsfeldstärke des WLAN-Signals in dBm angezeigt. Die Matrixuhr-Software hat sogar schon einen voreingestellten Zeitserver kontaktiert und die Uhrzeit eingestellt.

Wenn alles wie beschrieben funktioniert hat, kann man das Terminalprogramm wieder beenden. Das ESP32-Board wird nun vom PC getrennt und wieder in die Matrixuhr eingesetzt.

Es kann durchaus passieren, dass keine Verbindung zum WLAN hergestellt wird. In einem solchen Fall kann man die Eingabeprozedur der WLAN-Informationen wiederholen. Das ist jederzeit möglich, dabei müssen aber immer beide Parameter (SSID und Passwort) neu eingegeben werden. Ein weiterer Sonderfall tritt ein, wenn das gewünschte WLAN nicht in Reichweite ist. In diesem Fall geht man genau so vor wie bei einer erfolgreichen Verbindung: Terminalprogramm beenden, ESP32-Board vom PC trennen und in die Matrixuhr einsetzen. Die Uhr wird dann am zukünftigen Platz, wo auch das eingegebene WLAN erreichbar sein sollte, final in Betrieb genommen.

Mit dem fertig eingerichteten ESP32-Board sollte die Matrixuhr jetzt getestet werden. Die Grundeinstellung für das Matrix-Display ist so gewählt, das die Anzeige auf jeden Fall funktionieren sollte. Falls nicht, dann beginnt jetzt die Fehlersuche.

Hinweis: Diese Inbetriebnahme-Prozedur ist nur einmal erforderlich. Firmware-Updates können später über einen Web-Browser und die bestehende WLAN-Verbindung durchgeführt werden. Falls es erforderlich sein sollte, die WLAN-Daten zu ändern oder wenn die Uhr in ein anderes WLAN umziehen soll, dann kann man über die bisherige Verbindung ebenfalls mittels Web-Browser die neuen WLAN-Daten eingeben. Beim nächsten Neustart verbindet sich die Matrixuhr dann mit dem neuen WLAN.

Symbol Schritt 2 - Inbetriebnahme des Sound-Moduls

Wichtig: Für die Inbetriebnahme des Sound-Moduls muss dieses aus der Uhr ausgebaut werden. Der Grund ist der gleiche wie beim ESP32-Board: Es dürfen auf keinen Fall mehrere Stromversorgungen gleichzeitig angeschlossen sein. Das Sound-Modul wird nun über ein Micro-USB-Kabel mit einem PC verbunden. Es sollte dann vom PC wie ein USB-Stick erkannt und ein Laufwerksbuchstabe zugeordnet werden. Auf diesem Laufwerk, welches eine Speicherkapazität von ungefähr 8 MB hat, findet man einen Ordner, auf dem vermutlich schon einige Beispiel-Klänge vorhanden sind. Diese kann man (sofern brauchbar) verwenden oder einfach löschen.

Jetzt brauchen wir das Paket mit den Matrixuhr-Sounds matrixesp-sounds.zip oder beliebige andere Sound-Dateien. Bei Verwendung des Sound-Paketes entpackt man dessen Inhalt am besten direkt auf das Laufwerk des Sound-Moduls. In diesem Fall haben die Dateien bereits den korrekten Namen. Wenn man andere Klänge verwenden möchte, dann muss man folgende Dateinamen verwenden:

00001.mp3Klang 1 für Alarme
00002.mp3Klang 2 für Alarme
00003.mp3Klang 3 für Alarme
00004.mp3Klang 4 für Alarme
00005.mp3Klang für die Textnachricht
00006.mp3Klang für den Stundengong

Anstatt mp3 können auch Sounds im Format wav verwendet werden.

Sind alle benötigten Klänge auf dem Sound-Modul gespeichert, kann das Modul über die Windows-Funktion Hardware sicher entfernen vom System abgemeldet und anschließend vom PC getrennt werden. Bevor es wieder in die Matrixuhr eingebaut wird, muss über die 3 Dip-Schalter eine andere Betriebsart eingestellt werden:

Dip-Schalter 1 - OFF
Dip-Schalter 2 - OFF
Dip-Schalter 3 - ON

Diese Einstellung setzt das Sound-Modul in den UART-Modus. In dieser Betriebsart werden die Klänge nicht über separate Eingänge ausgewählt, sondern durch Senden von Kommandos über eine einzige Leitung. Bevor das Sound-Modul wieder in die Uhr eingebaut wird, empfehle ich noch, die Lautstärke zu verringern. Dazu wird das kleine Potentiometer auf der Platine kurz vor den linken Anschlag gedreht.

Symbol Bedienung

Dieser Abschnitt gliedert sich in 2 Teile. Im ersten Teil werden einige Informationen und Besonderheiten der Matrixuhr-Anzeige beschrieben und auf die Funktionen des Touchsensors eingegangen. Teil zwei beschreibt alle Möglichkeiten, die der integrierte Web-Server für die Einstellung und Konfiguration der Matrixuhr bietet.

Symbol Teil 1 - Bedienung der Matrixuhr-ESP32

Zunächst einige Worte über die Anzeige der Matrixuhr. Diese kennt mehrere Anzeige-Modi, die verschiedene Informationen darstellen können:

Anzeige 1 Die Matrixuhr-ESP32 verwendet ein RGB-LED-Matrix-Panel mit insgesamt 2048 LEDs, die in 32 Zeilen und 64 Spalten angeordnet sind. Damit steht ausreichend Platz für eine große Zeitanzeige zur Verfügung (48 x 18 Pixel). Der Platz neben der Uhrzeit (16 x 18 Pixel) wird für die Anzeige der Sekunden und des Kalendertages bzw. Wochentages genutzt. Darunter passt eine Textzeile, in der weitere Informationen dargestellt werden können. Hier wird eine Proportionalschrift mit einer Höhe von 11 Pixel verwendet, welche Platz für ungefähr 12 Zeichen bietet.

Anzeige 2 Auf der unteren Zeile werden im normalen Betrieb das Datum und der Wochentag im Wechsel angezeigt. Die Wechselzeit lässt sich auf 2, 3 oder 4 Sekunden einstellen. Im gleichen Rhythmus kann auch die kleine Anzeige neben der Uhrzeit zwischen Kalendertag und Wochentag wechseln. Hier ist es möglich, nur den Kalendertag, nur den Wochentag oder beides im Wechsel anzuzeigen.

Anzeige 3 Ist die Matrixuhr mit einem MQTT-Server verbunden, dann lassen sich praktisch alle Daten anzeigen, die auf dem MQTT-Server als Wert im Klartext verfügbar sind, z.B. Werte von Sensoren im Haus. Hat man auf dem Server zusätzlich Node-RED und die Module für OpenWeatherMap und Tankerkönig installiert, dann lassen sich auch Wetterdaten und ausgewählte Kraftstoffpreise anzeigen. Diese Daten erscheinen ebenfalls im eingestellten Wechsel-Rhythmus auf der unteren Zeile.

Anzeige 4 Weiterhin kann die Matrixuhr eine Liste mit Geburtstagsdaten verwalten und am Geburtstag den Namen und das Alter der Jubilare anzeigen. Diese fügen sich in den Wechsel-Rhythmus ein und erscheinen nach dem letzten Sensorwert. Nach der Anzeige aller Geburtstage kehrt die Anzeige dann wieder zum Datum zurück und der Zyklus beginnt von vorn. Übrigens, alle Informationen in der unteren Zeile werden grundsätzlich zentriert dargestellt.

Anzeige 5 Die Matrixuhr kann auch Alarme des Temperatur-Messsystems anzeigen. Damit man während der Anzeige des Alarms nicht auf die anderen Informationen verzichten muss, schaltet die Uhr in einen 3-zeiligen Modus um. Die Uhrzeit wird dafür in einem anderen Zeichensatz mit nur 8 Pixel Höhe angezeigt und das schafft Platz für 2 Textzeilen mit jeweils 11 Pixel Höhe. Dabei rücken die Informationen wie Datum, Wochentag, Sensorwerte und Geburtstage um eine Zeile nach oben und ganz unten erscheint die Alarmmeldung, die ebenfalls immer zentriert angezeigt wird. Abhängig von der Konfiguration und der Tageszeit kann gleichzeitig ein akustischer Alarm ausgelöst werden.

Anzeige 6 Geht ein Alarm wieder in den inaktiven Zustand über, dann wird der Alarmtext unterstrichen dargestellt. Die Unterstreichung erfolgt in einer anderen Farbe, um den Zustand etwas auffälliger zu gestalten. Im nebenstehenden Bild wurde beispielsweise die Klappe des Briefkastens wieder geschlossen. Treten mehrere Alarme gleichzeitig auf, dann werden diese im gleichen Wechsel-Rhythmus wie die anderen Informationen angezeigt. Mit der Quittierungsfunktion, deren Beschreibung weiter unten folgt, lassen sich inaktive Alarme wieder löschen.

Anzeige 7 Über die Web-Seite der Matrixuhr lässt sich eine Textnachricht eingeben und diese erscheint dann auf der Uhr als Laufschrift. Alternativ ist es auch möglich, eine über MQTT übermittelte Textnachricht anzuzeigen. Gleichzeitig wird auch hier ein akustisches Signal abgespielt. Die Nachricht wird fortlaufend wiederholt, bis man sie über die Quittierungsfunktion wieder löscht. Gleichzeitig auftretende Alarme erzeugen einen akustischen Alarm, erscheinen aber erst in der Anzeige, wenn die Textnachricht quittiert wurde.

Die Matrixuhr verwendet 3 Grundfarben. In allen Beispielbildern dieser Beschreibung verwende ich einheitlich folgende Farben und Bezeichnungen:

Zeit-FarbeHellblauStunden, Minuten und Sekunden
Datum-FarbeHellgrünDatum, Wochentag, Sensorwerte, Geburtstage und kleine Anzeige für Kalendertag oder Wochentag, Unterstreichungen
Alarm-FarbeRotAlarme und Textnachricht

Für jede dieser 3 Grundfarben kann man entweder eine der 16 verfügbaren Farben fest zuweisen oder die Auswahl einem Zufallsgenerator überlassen, der zu jeder vollen Stunde eine neue Farbe auswählt. Der Zufallsgenerator sorgt dafür, dass sich alle dem Generator zugewiesenen Farben ändern und keine Farben doppelt vergeben werden. Durch die unabhängige Einstellmöglichkeit kann man z.B. die Zeit- und Datum-Farbe vom Zufallsgenerator bestimmen lassen und die Alarmfarbe fest auf Rot setzen (die bevorzugte Einstellung auf meiner Matrixuhr). Es gibt allerdings eine Besonderheit: Die Symbole für die Wetterinformationen und einige spezielle Symbole haben feste Farben, die nicht geändert werden können.

Die Matrixuhr kann auch auf einige abnormale Zustände hinweisen. Dafür werden die blinkenden Doppelpunkte zwischen Stunde und Minute und der Platz zwischen den Doppelpunkten genutzt.

Anzeige 8 Dieses Bild zeigt das Display der Matrixuhr kurz nach dem Start. Hier blinkt nicht nur der Doppelpunkt in Alarm-Farbe, auch die Pixel zwischen den Punkten blinken im gleichen Takt und ebenfalls in Alarm-Farbe. Dieser ausgefüllte Zwischenraum signalisiert, dass keine WLAN-Verbindung vorhanden ist. Sobald die WLAN-Verbindung hergestellt wurde, ist nur noch der blinkende Doppelpunkt zu sehen.

Anzeige 9 Auch auf diesem Bild ist das Display der Matrixuhr kurz nach dem Start zu sehen. Die WLAN-Verbindung ist hier aktiv, aber der in Alarm-Farbe blinkende Doppelpunkt weist darauf hin, dass noch keine gültige Uhrzeit vorhanden ist.

Anzeige 10 Auf diesem Bild ist der blinkende Doppelpunkt abweichend vom Normalzustand in Datum-Farbe zu sehen. Hier läuft die Matrixuhr zwar mit einer gültigen Zeit, allerdings ist die regelmäßige Zeitsynchronisierung fehlgeschlagen. Das kann passieren, wenn der Zeitserver vorübergehend nicht erreichbar ist. Die Matrixuhr läuft trotzdem normal weiter und versucht weiterhin, den Zeitserver zu erreichen.

An der Matrixuhr befindet sich eine kleine Sensorfläche, die Berührungen mit dem Finger erkennt und die Steuerung von 3 Funktionen ermöglicht:

kurze Berührung (< 1s)Quittieren von inaktiven Alarmen, Löschen einer Textnachricht, Display während des Nachtmodus aktivieren
lange Berührung (> 1s)Stummschaltung (Mute) aktivieren oder deaktivieren
2 kurze Berührungen (innerhalb 0,5s)Anzeige der aktuellen IP-Adresse und des Empfangssignals als Laufschrift-Nachricht

Anzeige 11 Dieses Bild soll zeigen, was bei einer kurzen Berührung des Touchsensors passiert. Zuerst werden alle inaktiven (unterstrichenen) Alarme gelöscht und es erscheint wieder die normale Anzeige. Außerdem wird zur Bestätigung der Sensorberührung eine kurze Animation eingeblendet. Diese besteht aus einer Pixelzeile in Alarm-Farbe, die zunächst die gesamte Displaybreite einnimmt und dann durch Löschen der Pixel an den Enden in schneller Folge wieder verschwindet. Falls eine Textnachricht aktiv ist, dann wird zuerst diese gelöscht. Eventuell anstehende Alarme werden dann wieder sichtbar und können durch eine weitere Berührung des Sensors gelöscht werden. Die Animation erscheint übrigens auch, wenn es eigentlich nichts zu quittieren gibt. So kann man die Funktion der Sensorfläche prüfen.

Anzeige 12 Berührt man den Touchsensor länger als eine Sekunde, dann aktiviert sich die Stummschaltung der Matrixuhr. Dieser Zustand wird durch eine dauerhafte Anzeige einer Pixelzeile in Alarm-Farbe unter der Uhrzeit angezeigt. Ist die Stummschaltung aktiv, werden von der Matrixuhr keine Töne ausgegeben. Der Stundengong ertönt dann nicht mehr und Alarme werden geräuschlos auf dem Display signalisiert. Ein erneutes langes Berühren des Touchsensors schaltet die Stummschaltung wieder aus. Vergessen kann man die Stummschaltung nicht, diese deaktiviert sich automatisch nach 12 Stunden. Übrigens, während der langen Touchsensor-Berührung wird gleichzeitig auch die Quittierung ausgelöst.

Anzeige 13 Wird der Touchsensor 2 mal kurz innerhalb einer halben Sekunde berührt, dann wird die aktuelle IPv4-Adresse der Matrixuhr und die ermittelte Empfangsfeldstärke angezeigt. Diese wird ähnlich wie eine empfangene Textnachricht als Laufschrift auf der unteren Display-Zeile ausgegeben. Falls keine Netzwerk-Verbindung besteht, dann erscheint der Text IP: 0.0.0.0. Durch eine weitere Berührung kann die Nachricht wieder gelöscht werden.

Anzeige 14 Die bereits erwähnte Pixelzeile kann neben der Quittierung und Stummschaltung noch eine weitere Information darstellen: Wenn ein Firmware-Update über die Web-Seite gestartet wird, dann dient die Pixelzeile als Fortschrittsanzeige. Während des Updates wird die Zeile von links beginnend immer länger und erreicht beim Ende des Updates den rechten Rand. Ist das Update erfolgreich, dann wird jedes zweite Pixel der Zeile ausgeschaltet.

Die Matrixuhr-ESP32 kann so konfiguriert werden, dass das Display zu bestimmten Zeiten ausgeschaltet wird (Nachtmodus). Während dieser Zeit kann das Display durch eine kurze Berührung des Touchsensors aktiviert werden. 30 Sekunden nach der letzten Sensorbedienung wechselt die Uhr wieder in den Nachtmodus zurück.

Noch ein Hinweis: Solange die Uhr keine gültige Zeit hat, werden keine akustischen Alarme ausgegeben und es wird kein Nachtmodus aktiviert.

Symbol Teil 2 - Bedienung der Web-Seite

Alle Einstellungen an der Matrixuhr-ESP32 erfolgen über einen integrierten Web-Server. Dieser kann von einem beliebigen Web-Browser über die IP-Adresse der Uhr aufgerufen werden. Voraussetzung dafür ist eine vollständige Inbetriebnahme des ESP32-Boards, ein funktionierendes Display und eine aktive WLAN-Verbindung. Wichtig ist natürlich auch die IP-Adresse der Uhr. Diese kann man bei der Inbetriebnahme des ESP32-Boards aus dem Terminalfenster auslesen oder mittels zweier Berührungen des Touchsensors über die Laufschriftanzeige der Uhr ermitteln. Wir starten nun unseren Lieblings-Web-Browser und geben die IP-Adresse der Matrixuhr-ESP32 in die Adresszeile ein. Ich verwende hier eine Beispiel-Adresse: http://192.168.1.224

Web-Seite 1 Wenn alles passt, dann sollte das nebenstehende Bild zu sehen sein, wobei einige der angezeigten Daten abweichen werden.

Die Web-Seite ist relativ einfach aufgebaut und besteht aus einem Seitenmenü und einem Hauptfenster, welches den im Menü ausgewählten Inhalt anzeigt. Das Seitenmenü ist zur besseren Übersicht in 4 Bereiche unterteilt. Der nachfolgende Abschnitt beschreibt die 4 Bereiche und deren Menü-Optionen in der Reihenfolge, wie sie im Menü erscheinen.

Bei der ersten Inbetriebnahme empfehle ich, mit dem Bereich System-Einstellungen zu beginnen.

Informationen / Status

Über diese Menü-Option gelangt man zu einer Übersichtsseite mit allgemeinen Informationen über die Matrixuhr (siehe Bild oben). Diese Seite ist auch gleichzeitig die Startseite. Die meisten Informationen in der tabellarischen Übersicht sind selbsterklärend. Bei einigen Werten sind vielleicht noch einige Worte notwendig:

Systemlaufzeit: Diese wird zunächst in Minuten angegeben. Nach einer Laufzeit von 60 Minuten wechselt der Wert in Stunden mit einer Nachkommastelle und nach 24 Stunden in Tage mit 2 Kommastellen.

RAM verwendet, RAM frei: Diese Werte beziehen sich auf den Heap-Speicher der C++ Firmware.

Dateisystem, Zeit-Status, MQTT-Status: Die Anzeige dieser Statuswerte erfolgt über Symbole. Es können folgende Zustände auftreten:

ParameterStatusBedeutung
DateisystemFehler beim Zugriff auf das Dateisystem. Das Lesen und Speichern von Einstellungen ist nicht möglich.
Das Dateisystem ist in Ordnung.
Zeit-StatusDie Uhr hat noch keine gültige Zeit.
Die Uhr hat eine gültige Zeit, wurde aber schon länger nicht mehr synchronisiert.
Die Uhr hat eine gültige Zeit und wurde vor kurzem synchronisiert.
MQTT-StatusDie Uhr hat keine Verbindung zum MQTT-Server.
Die Verbindung zum MQTT-Server wurde hergestellt.

Auf dieser Seite befinden sich einige Buttons, die folgende Funktion haben:

Alarme quittieren Ein Klick auf diesen Button quittiert eine Laufschrift-Nachricht oder inaktive Alarme auf dem Uhren-Display. Dieser Button hat die gleiche Funktion wie eine einzelne Berührung des Touchsensors an der Uhr.

Stummschaltung Über diesen Button kann die Stummschaltung aktiviert oder deaktiviert werden. Er hat die gleiche Funktion wie eine lange Berührung des Touchsensors an der Uhr.

Aktualisieren Ein Klick auf diesen Button lädt die Seite neu und aktualisiert dabei alle Werte. Eine automatische Aktualisierung der Daten erfolgt generell nicht.

Nachricht anzeigen Mit einem Klick auf diesen Button wird der Text in der darüberliegenden Eingabezeile als Laufschrift auf der Uhr angezeigt und ein akustischer Alarm ausgelöst.

Konfiguration / Geburtstage

Web-Seite 2 Über diese Menü-Option kann eine Geburtstagsliste verwaltet werden. Wenn die Software der Matrixuhr Einträge in der Liste findet, die zum aktuellen Datum passen, dann erscheint der Name und das errechnete Alter der Jubilare auf der Matrixuhr im Wechsel mit den anderen Informationen. Auf diesem Beispiel-Bild ist bereits ein Eintrag vorhanden.

Die Geburtstagsliste kann bis zu 100 Einträge aufnehmen und jeder Eintrag besteht aus einem Namen und dem Geburtsdatum. Die Länge des Namens ist zwar nicht begrenzt, aber man muss bedenken, dass ungefähr 12 Zeichen auf eine Display-Zeile passen. Zieht man hier den Platz für ein zweistelliges Alter und ein Leerzeichen ab, dann bleiben 9 Zeichen für den Namen übrig. Die Geburtstagsliste wird übrigens immer nach dem Datum sortiert (Monat und Tag).

Zur Eingabe eines neuen Geburtstages klickt man zunächst auf das kleine Kalender-Symbol im Datum-Eingabefeld. Es öffnet sich ein Kalender mit einer Monatsübersicht und hier hat man die Möglichkeit, über ein Auswahlfeld das Geburtsjahr und den Monat auszuwählen. Anschließend klickt man noch auf den Tag in der Übersicht und es erscheint wieder das Datum-Eingabefeld mit dem fertigen Datum. Alternativ kann man auch direkt auf die Felder für Tag, Monat und Jahr klicken und die Werte direkt eingeben. Jetzt wird noch der Name im entsprechenden Feld ergänzt (möglichst nicht mehr als 9 Zeichen) und mit einem Klick auf den Button  +  wird der neue Eintrag übernommen. Dabei erfolgt automatisch eine Sortierung und Speicherung der Liste. Wenn der Vorgang erfolgreich war, erscheint unten rechts ein  OK , anderenfalls  Fehler .

Über den Button Eintrag löschen kann ein Eintrag aus der Liste entfernt werden. Dazu muss vorher die Nummer des Geburtstages in das kleine Feld links neben dem Button eingetragen werden. Auch hier wird die Liste automatisch neu geordnet und gespeichert und es erscheint unten rechts ein  OK , wenn die Löschung erfolgreich war, anderenfalls  Fehler . Eine Korrektur ist übrigens nicht vorgesehen. Ein fehlerhafter Eintrag muss gelöscht und neu angelegt werden.

Konfiguration / Sensoren

Web-Seite 3 Die Matrixuhr-ESP32 kann verschiedene Sensorwerte anzeigen und überwachen. Zur Aktivierung dieser Funktion ist es zunächst erforderlich, alle benötigten Sensoren auf dieser Seite zu erfassen. Damit wird der Datenempfang über MQTT aktiviert und jedem Sensor ein eindeutiger Name [A] bis [L] zugeordnet. Auf den weiter unten beschriebenen Seiten Datenanzeige und Alarme können die Sensorwerte dann angezeigt bzw. ausgewertet werden.

Voraussetzung für die Anzeige von Sensorwerten ist ein MQTT-Server im lokalen Netzwerk. Im Rahmen des Projektes Temperatur-Messsystem habe ich den Aufbau des Web-Moduls beschrieben. Dieses Modul stellt neben anderen Funktionen auch einen MQTT-Server bereit, den die Matrixuhr nutzen kann. Von diesem Server kann die Uhr neben Sensorwerten aus dem Haus auch Informationen aus dem Internet beziehen, wie z.B. Wetterdaten und Kraftstoffpreise.

Um einen Sensorwert für die Anzeige auf der Uhr zu definieren, muss dessen MQTT-Topic bekannt sein. Dies ist der Name, unter dem der Sensorwert auf dem MQTT-Server abgelegt wurde. Dieser Name wird für jeden gewünschten Sensor in eines der 12 Felder wie auf dem Beispielbild eingetragen. Die Felder müssen übrigens nicht zwingend der Reihe nach belegt werden, es können auch Lücken bleiben. Über das Auswahlfeld in der Spalte Dezimal lässt sich die Anzahl der Nachkommastellen (0, 1 oder 2) festlegen. Empfangene Sensordaten werden auf Plausibilität geprüft und in die gewählte Einstellung konvertiert. Zusätzlich steht noch die Auswahlmöglichkeit aus zur Verfügung. Diese schaltet die Plausibilitätsprüfung und Konvertierung komplett aus und ermöglicht die Anzeige beliebiger Informationen, die z.B. dynamisch von Node-RED generiert werden können.

Der untere Bereich ist für spezielle Informationen vorgesehen. Wenn der MQTT-Server Wetterdaten von OpenWeatherMap und Kraftstoffpreise von Tankerkönig bereitstellt, dann kann man die entsprechenden MQTT-Topics hier eintragen. Die Übertragung dieser Informationen erfolgt als Datenblock im JSON-Format und wird von der Uhr in Einzelwerte zerlegt. Die letzte Zeile ermöglicht den Empfang von Textnachrichten vom MQTT-Server, diese werden dann von der Uhr als Laufschrift angezeigt.

Mit einem Klick auf den Button Einstellungen speichern werden alle Eingaben im Dateisystem des ESP32 gespeichert und außerdem alle MQTT-Topics beim Server abonniert. War die Aktion erfolgreich, dann erscheint neben dem Button ein  OK , anderenfalls  Fehler . An dieser Stelle sollte die letzte Tabellenspalte Wert erwähnt werden: Hier werden die über MQTT empfangenen Daten angezeigt. Es handelt sich dabei um die Roh-Daten, die Dezimal-Einstellung wird bei dieser Anzeige nicht berücksichtigt. Bei den speziellen Informationen für Wetter und Kraftstoff sieht man die ersten 12 Zeichen des JSON-Datensatzes.

Diese Seite wird nicht automatisch aktualisiert. Um aktuelle Werte zu bekommen, ist ein Klick auf den Button Aktualisieren erforderlich. Übrigens, wenn neue MQTT-Topics definiert werden, dann kann es etwas dauern, bis Werte verfügbar sind. Das liegt daran, dass der MQTT-Server keine Daten zwischenspeichert. Erst wenn ein Sensor einen neuen Wert an den MQTT-Server übermittelt, geht dieser an die Abonnenten weiter. Diese Eigenschaft lässt sich allerdings auf der Senderseite ändern.

Konfiguration / Datenanzeige

Web-Seite 4 Auf dieser Seite lassen sich die Sensordaten zusammenstellen, die auf der Matrixuhr angezeigt werden sollen. Alle hier eingegebenen Zeilen werden aufbereitet und nacheinander im eingestellten Wechsel-Rhythmus auf der unteren Zeile der Matrixuhr angezeigt. Voraussetzung für diese Funktion ist die vorherige Erfassung der benötigten Sensoren im Menü Konfiguration / Sensoren.

Für die Anzeige von Sensordaten und anderen Informationen stehen insgesamt 10 Datenfelder zur Verfügung. In ein Datenfeld passen ungefähr 12 Zeichen und diese können aus Sensorwerten, festen Zeichen oder auch Symbolen bestehen. Für die Anzeige von Sensorwerten dienen hier Platzhalter, die aus einem eckigen Klammerpaar und einem eingeschlossenen Buchstaben zusammengesetzt sind. Die Matrixuhr ersetzt dann zum Zeitpunkt der Anzeige den Platzhalter durch den entsprechenden Sensorwert.

Als kleine Hilfe gibt es auf der rechten Seite eine Übersicht mit allen zur Verfügung stehenden Platzhaltern und deren Bedeutung. Hier sind auch die aktuellen Werte in Klammern zu sehen. Außerdem sind hier noch 4 Symbole aufgelistet, die ebenfalls für die Anzeige verwendet werden können.

Mit dem Button Einstellungen speichern werden alle Eingaben übernommen und im Dateisystem gespeichert. War die Aktion erfolgreich, dann erscheint neben dem Button ein  OK , anderenfalls  Fehler . Im Erfolgsfall werden die neuen Eingaben sofort wirksam und erscheinen auf der Anzeige der Matrixuhr.

Der Button Aktualisieren erneuert alle in Klammern stehenden Werte im Hilfe-Bereich. Es erfolgt hier keine automatische Aktualisierung.

Auf dem Bild oben sind bereits 6 Datenfelder gefüllt, die ich genau so in meiner Matrixuhr verwende. Die nachfolgende Tabelle beschreibt diese und einige weitere Beispiele etwas ausführlicher:

ZeileAnzeigebeispielBemerkung
[W] [A]°CWeb-Seite 5 Dieses Datenfeld besteht aus einem Wettersymbol, dem Wert des Sensors A (Außentemperatur vom Sensor im Außenbereich) und dem abschließenden Text °C. Das Wettersymbol wird dynamisch aus den Daten des Wetterdienstes generiert und ist immer 24 Pixel breit (ca. 4 Zeichen). Es gibt Symbole für den Tag und die Nacht, die zum Sonnenaufgang bzw. Sonnenuntergang wechseln.
$Z [S] mmWeb-Seite 6 Bei diesem Datenfeld wird ein festes Regensymbol, die vom Wetterdienst übermittelte Regenmenge mit einer Nachkommastelle in mm/h und ein abschließender Text mm angezeigt. Das Regensymbol ist 16 Pixel breit (ca. 3 Zeichen).
$Y [V] [R]Web-Seite 7 Hier wird ein festes Windsymbol, ein dynamischer Windrichtungspfeil, der von den Daten des Wetterdienstes generiert wird und die ebenfalls vom Wetterdienst übermittelte Windgeschwindigkeit in km/h ohne Nachkommastelle angezeigt. Für eine Einheit wie z.B. km/h ist leider nicht genug Platz. Das Windsymbol hat übrigens eine feste Breite von 16 Pixel (ca. 3 Zeichen), der Windpfeil ist 7 Pixel breit.
[B]°C [C]%Web-Seite 8 Dieses Datenfeld besteht zunächst aus dem Sensorwert B (Temperatur im Wohnzimmer) und dem nachfolgenden Text °C. Hier schließt sich nach einem Leerzeichen der Sensorwert C (Luftfeuchtigkeit im Wohnzimmer) und ein Prozentzeichen % an.
$W [a]€Web-Seite 9 Bei diesem Datenfeld wird ein festes Tankstellensymbol, ein von Tankerkönig übermittelter Kraftstoffpreis und ein Euro-Zeichen verwendet. Wenn man auf das Euro-Zeichen verzichtet, passen auch 2 Preise nebeneinander. Das Tankstellensymbol hat übrigens eine feste Breite von 10 Pixel.
$U [E] kWWeb-Seite 25 Dieses Datenfeld verwendet das feste Solarsymbol, den Sensorwert E (aktuelle Solar-Leistung in kW mit 2 Nachkommastellen) und den festen Text kW.
[X]Web-Seite 10
Web-Seite 11
Die Wetterlage ist ein spezielles Element und muss einzeln im Datenfeld stehen. Bei der Anzeige kann diese aus bis zu 4 Textteilen bestehen, die nacheinander ausgegeben werden. Die Anzeige der nachfolgenden Datenfelder erfolgt dann nach dem letzten Textteil.
[Y]Web-Seite 12 Auch die Sonnenzeiten werden durch ein spezielles Element definiert, welches einzeln im Datenfeld stehen muss. Auf der Anzeige erscheinen dann in einem festen Format die Zeiten von Sonnenaufgang und Sonnenuntergang, getrennt durch ein Sonnensymbol.

Hier noch einige Hinweise und Tipps für die Benutzung der Datenfelder:

Konfiguration / Alarme

Web-Seite 13 Auf dieser Seite kann man Alarm-Ereignisse definieren und festlegen, wie die Matrixuhr darauf reagieren soll. Insgesamt können 8 Alarme verwaltet werden: 4 Alarme sind für das Temperatur-Messsystem bestimmt (Nr 1-4) und weitere 4 Alarme stehen für die Überwachung von Sensorwerten oder als Timer zur Verfügung (Nr 5-8).

Jedem der 8 Alarme kann über das Auswahlfeld Sound ein Klang zugeordnet werden, der bei Auslösung des Alarms auf der Matrixuhr abgespielt wird. Zur Auswahl stehen die Nummern 1 bis 6, die den 6 verfügbaren Klängen der Matrixuhr entsprechen. Weiterhin gibt es noch die Auswahl 0, bei der im Alarmfall kein Ton erzeugt wird (stumme Signalisierung). Bei der Sound-Auswahl ist zu beachten, dass der Klang 5 bereits für die Textnachricht verwendet wird und der Klang 6 für den Stundengong.

Das nächste Auswahlfeld Halten legt fest, was nach einer Alarm-Auslösung auf der Matrixuhr passieren soll. Lässt man die Checkbox unverändert, dann wird die Anzeige des betroffenen Alarms automatisch nach 2 Minuten gelöscht. Wird ein Haken gesetzt, bleibt der Alarm im Display stehen und muss manuell an der Uhr oder über die Web-Seite quittiert werden. Im nächsten Eingabefeld Text kann der Text eingegeben werden, der bei Auslösung des Alarms auf dem Display der Matrixuhr erscheinen soll. Hier gilt wieder der Richtwert von 12 Zeichen für die Textlänge.

Das nächste Eingabefeld unterscheidet sich bei den beiden Alarmgruppen. Möchte man Alarme des Temperatur-Messsystems auswerten, dann kann man bei den Alarmen 1-4 das MQTT Topic der gewünschten Alarme eingeben. Bei den Alarmen 5-8 lässt sich stattdessen eine Bedingung festlegen, die zum Auslösen des entsprechenden Alarms führen soll. Etwas weiter unten wird dieser Mechanismus mit einigen Beispielen etwas genauer beschrieben.

Interessant ist noch die letzte Spalte Wert: Hier steht bei einem inaktiven Alarm eine 0, anderenfalls eine 1.

Mit dem Button Einstellungen speichern werden alle Eingaben übernommen und im Dateisystem gespeichert. War die Aktion erfolgreich, dann erscheint neben dem Button ein  OK , anderenfalls  Fehler .

Über den Button Aktualisieren werden alle Alarmwerte erneuert. Es erfolgt hier keine automatische Aktualisierung.

Hinweis zu den Alarmen 1-4: Hier können die 4 Alarme eines Sensormoduls ausgewertet werden. Dazu muss das Sensormodul am Web-Modul angeschlossen und konfiguriert sein. Zur Aktivierung eines Alarms vom Sensormodul übernimmt man einfach das MQTT-Topic, welches im Web-Modul für diesen Alarm eingetragen wurde und füllt die restlichen Felder passend aus. Es müssen nicht alle Alarme des Sensormoduls definiert werden, außerdem können Zeilennummer und Reihenfolge beliebig sein. Falls kein Sensormodul verwendet wird, bleiben alle Felder der Alarm-Konfiguration leer.

Hinweis zu den Alarmen 5-8: Hier hat man die Möglichkeit, Sensorwerte zu überwachen und einen Alarm bei dessen Über- oder Unterschreitung auszulösen. Es ist auch möglich, zwei Sensorwerte miteinander zu vergleichen. Alternativ kann man auch Alarme zu einer festgelegten Zeit auslösen. Die nachfolgende Tabelle zeigt einige Beispiele und Möglichkeiten.

BedingungBeschreibung
[B]<20Ein Alarm wird ausgelöst, wenn die Temperatur im Wohnzimmer (Sensor B) 20°C unterschreitet.
[A]>30Ein Alarm wird ausgelöst, wenn die Außentemperatur (Sensor A) 30°C überschreitet.
[A]<[B]Ein Alarm wird ausgelöst, wenn die Außentemperatur (Sensor A) niedriger als die Temperatur im Wohnzimmer (Sensor B) ist.
[R]>70Ein Alarm wird ausgelöst, wenn die Windgeschwindigkeit (Sensor R) 70 km/h überschreitet (Sturmwarnung).
[a]<1.70Ein Alarm wird ausgelöst, wenn der Preis von Tankstelle 1 (Sensor a) unter 1,70€ liegt (Preisalarm).
*:17:50Es wird jeden Tag ein Alarm um 17:50 Uhr ausgelöst.
3:20:30Es wird jeden Mittwoch ein Alarm um 20:30 Uhr ausgelöst. Die Ziffer an der ersten Stelle bestimmt den Wochentag: 1 = Montag, 7 = Sonntag.
+:08:00Es wird an jedem Geburtstag ein Alarm um 8:00 Uhr ausgelöst.

Noch ein Hinweis: Beim Prüfen der Bedingung wird auch die Gültigkeit der Sensorwerte überwacht. Ist die Gültigkeitsfrist der zu prüfenden Sensoren abgelaufen, wird die Bedingung ignoriert und kein Alarm ausgelöst. Für die Bedingung können alle Sensoren außer den folgenden verwendet werden: V, W, X und Y. Die Bedingung wird übrigens immer zum Wechsel-Intervall der Matrixuhr geprüft, also alle 2, 3 oder 4 Sekunden. Es kann also zu Verzögerungen bis maximal 4 Sekunden bis zur Alarm-Auslösung kommen.

Konfiguration / Farben

Web-Seite 14 Auf dieser Seite kann man die Farbeinstellungen der Matrixuhr festlegen. Etwas weiter oben wurde bereits erwähnt, dass die Uhr mit 3 Grundfarben arbeitet: Eine Farbe ist für die Zeit-Elemente bestimmt, eine weitere für das Datum sowie Sensorwerte und eine dritte für Alarme und Textnachrichten. Für die Auswahl steht eine Palette aus 16 festen Farben zur Verfügung, die auf dem nebenstehenden Bild dargestellt ist. Außerdem gibt es ganz oben noch ein Zufallsfeld. Über eine Matrix aus so genannten Radio-Buttons kann man nun für jede der 3 Grundfarben (Zeit, Datum, Alarm) entweder eine feste Farbe oder den Zufall auswählen. Das Bild zeigt, dass die Farben für Zeit und Datum zufällig gewählt werden und die Alarm-Farbe fest auf Rot gesetzt ist.

Die mit meiden bezeichnete Spalte bietet die Möglichkeit, eine bestimmte Farbe aus dem Zufallsgenerator auszuschließen. Die aktuelle Einstellung auf dem Bild erscheint nicht logisch und bewirkt, dass keine Farbe ausgeschlossen wird, also alle Farben für den Zufall verwendet werden. Übrigens, der Zufallsgenerator wird zu jeder vollen Stunde aktiv.

Mit dem Button Einstellungen speichern werden alle Eingaben übernommen und im Dateisystem gespeichert. War die Aktion erfolgreich, dann erscheint neben dem Button ein  OK , anderenfalls  Fehler . Die gewählten Farben werden sofort auf der Matrixuhr sichtbar, außerdem startet der Zufallsgenerator bei jedem Speichervorgang und erneuert die Zufallsfarben.

Konfiguration / Anzeige/Sound

Web-Seite 15 Diese Seite ermöglicht allgemeine Einstellungen für die Anzeige im oberen Teil und den Sound im unteren Teil. Die meisten Optionen sollten eigentlich selbsterklärend sein, einige erfordern vielleicht noch zusätzliche Informationen:

Kleinanzeige-Modus: Diese Einstellung betrifft die kleine zweistellige Anzeige unterhalb der Sekunden. Hier hat man die Möglichkeit, entweder den Kalendertag, den Wochentag oder beides im Wechsel anzuzeigen. Der Wechsel erfolgt dann im gleichen Intervall wie die Hauptanzeige.

Helligkeits-Änderungen: Hier lässt sich festlegen, ob Helligkeits-Änderungen direkt, beim Sekundenwechsel oder im Intervall der Wechselanzeige (alle 2, 3 oder 4 Sekunden) an das Display weitergegeben werden sollen. Diese Einstellung gibt es aus folgendem Grund: Die Helligkeitsstufen der Matrixuhr sind recht grob und wenn sich die ermittelte Umgebungs-Helligkeit an der Grenze zwischen zwei Stufen befindet, kann bei der Einstellung Direkt ein leichtes Flackern entstehen. Mit den alternativen Einstellungen fällt dieser Effekt weniger auf.

Nacht Beginn- und Endezeit: Hier lässt sich ein Zeitraum einstellen, in dem das Display dunkel bleibt (Nachtmodus). Wird die Beginn- und Endezeit wie im Bild gleich eingestellt, dann bleibt das Display immer aktiv.

minimale und maximale Helligkeit: Mit diesen Einstellungen lässt sich der Bereich für die Helligkeitsregelung einschränken. So kann die minimale Helligkeit um bis zu 10 Stufen erhöht und die maximale Helligkeit um bis zu 15 Stufen verringert werden. Meist wird man die maximale Helligkeit reduzieren, da die Matrix-Displays extrem hell sind. Hier muss man einfach ein wenig experimentieren und dabei auch das Potentiometer R3 für die Empfindlichkeit der Regelung einbeziehen.

Scroll-Geschwindigkeit: Diese Einstellung bestimmt die Geschwindigkeit der Laufschrift beim Empfang einer Textnachricht oder bei der Anzeige der IP-Adresse durch zweimaliges Berühren des Touchsensors an der Matrixuhr.

Sound aktivieren: Dies ist der Hauptschalter für die Sound-Ausgabe. Wird dieser nicht aktiviert, funktioniert auch der Stundengong nicht.

Sound Beginn- und Endezeit: Hier lässt sich der Zeitraum einstellen, in dem die Sound-Ausgabe der Matrixuhr aktiv sein soll. Bei der Einstellung im Bild sind Sounds zwischen 8:00 Uhr und 22:01 Uhr zu hören. Die Verlängerung um eine Minute bei der Endzeit bewirkt, dass der letzte Gongschlag um 22:00 Uhr erklingt, falls der Stundengong aktiviert ist. Es ist übrigens auch möglich, einen Zeitraum über Nacht festzulegen oder den Sound dauerhaft zu aktivieren, indem man die Beginn- und Endezeit gleich einstellt.

Lautstärke: Hier lässt sich die Lautstärke für die Sound-Ausgabe festlegen. Kleiner Tipp: Diesen Schieberegler zunächst auf der Voreinstellung lassen und mit dem Potentiometer auf dem Sound-Modul die richtige Lautstärke einstellen. Anschließend hat man genügend Reserve in beide Richtungen. Für diese Einstellung kann das weiter unten beschriebene Menü Wartung / Test-Funktionen sehr hilfreich sein.

Mit dem Button Einstellungen speichern werden alle Eingaben sofort wirksam und im Dateisystem gespeichert. War die Aktion erfolgreich, dann erscheint neben dem Button ein  OK , anderenfalls  Fehler .

System-Einstellungen

Grundsätzliches zu den System-Einstellungen: Diese werden normalerweise nur bei der Inbetriebnahme einer Matrixuhr-ESP32 bearbeitet und nur selten im laufenden Betrieb geändert. Hier gibt es auch die Besonderheit, dass fast jede Änderung einen Neustart der Uhr erfordert, damit die neuen Einstellungen wirksam werden. Bei jedem Speichervorgang wird deshalb der entsprechende Hinweis Bitte Matrixuhr neu starten ausgegeben. Der Neustart muss dann über das Menü Wartung / Neustart ausgelöst werden.

System-Einstellungen / Matrix

Web-Seite 16 Auf dieser Seite können einige Parameter für das Matrix-Display eingestellt werden. Die auf dem Bild dargestellte Voreinstellung sollte grundsätzlich mit allen Matrix-Displays funktionieren. Man kann die Einstellung grundsätzlich so lassen, aber es sind auch einige Verbesserungen damit möglich.

Taktfrequenz: Hier kann die Frequenz der I2S-Schnittstelle für die Datenübertragung zum Display in 4 Stufen eingestellt werden. Hier habe ich erst später bemerkt, dass es nicht notwendig ist, die Voreinstellung zu ändern.

Treiber-Chip: Über diese Einstellung kann eine zusätzliche Initialisierung für FM6126A-Chips aktiviert werden. Ich habe diese in der Grundeinstellung aktiviert, damit möglichst viele Matrix-Displays sofort funktionieren. Sollte ein Display mit Standard-Treibern angeschlossen sein, dann sollte hier die entsprechende Einstellung gewählt werden. Das vermeidet kleine Bildstörungen, die beim Systemstart zu sehen sind.

Latch-Blanking: Bei älteren Displays kann es vorkommen, dass einige nicht angesteuerte Pixel schwach mitleuchten (Geisterpixel-Effekt). Diesen Effekt kann man durch erhöhen dieser Einstellung mindern. Hier werden beim Umschalten der Zeilen im Multiplexbetrieb kurze Wartezyklen eingefügt.

Bildwiederholfrequenz: Hier kann man einstellen, wie oft der gesamte Inhalt des Matrix-Displays pro Sekunde ausgegeben werden soll. Möglich sind hier Werte von 50 bis 200. Die Voreinstellung ist erst mal ein sicherer Wert, mit dem alle Displays stabil arbeiten, aber es zeigt sich hier ein wahrnehmbares Flimmern. Es empfiehlt sich also, eine höhere Frequenz von mindestens 100 Hz einzustellen. Anschließend sollte man das Display bei verschiedenen Bildinhalten und Helligkeiten beobachten. Je nach Ergebnis kann man den Wert weiter erhöhen oder wieder reduzieren. Ein älteres Test-Display kam hier gut mit 200 Hz klar, das Display im Prototyp lässt nur maximal 100 Hz zu. Bei höheren Werten traten gelegentlich Bildstörungen auf.

Mit dem Button Einstellungen speichern werden die Eingaben im Dateisystem gespeichert. War die Aktion erfolgreich, dann erscheint neben dem Button ein  OK , außerdem der Hinweis auf den notwendigen Neustart. Im Fehlerfall wird  Fehler  angezeigt.

System-Einstellungen / WLAN

Web-Seite 17 Auf dieser Seite können die WLAN-Zugangsdaten geändert werden. Zunächst erscheinen hier die Daten des aktuellen WLAN, die bei der Inbetriebnahme über das Terminalprogramm eingegeben wurden. Falls die Matrixuhr in ein anderes WLAN umziehen soll, dann kann man an dieser Stelle die neuen Zugangsdaten eingeben. Das funktioniert natürlich nur, wenn die Uhr noch mit dem bisherigen Netz verbunden ist.

Mit dem Button Einstellungen speichern werden die Eingaben im Dateisystem gespeichert. War die Aktion erfolgreich, dann erscheint neben dem Button ein  OK , außerdem der Hinweis auf den notwendigen Neustart. Im Fehlerfall wird  Fehler  angezeigt. Wenn die WLAN-Daten geändert wurden und jetzt der Neustart ausgeführt wird, geht die Verbindung zum bisherigen WLAN verloren und die Matrixuhr versucht den Verbindungsaufbau mit dem neuen Netzwerk.

Wichtig: Wenn die Uhr in ein neues WLAN integriert werden soll, dann muss zwingend vorher die statische IP-Adresse (siehe nächste Einstellung) deaktiviert werden.

System-Einstellungen / Netzwerk

Web-Seite 18 Diese Seite kann normalerweise leer bleiben. Die Matrixuhr-ESP32 bekommt vom Router im Heimnetz eine dynamische IP-Adresse zugewiesen und mit dieser kann man grundsätzlich gut arbeiten. Oft besteht aber der Wunsch, eine feste IP-Adresse zu vergeben und diese Möglichkeit wurde über diese Seite geschaffen.

Bei der Beispiel-Konfiguration auf dem Bild wurde zunächst die statische IP-Adresse mittels Checkbox aktiviert. Es muss dann eine gültige IP-Adresse eingegeben werden, die im Netzwerk frei ist und auch nicht im dynamischen Adress-Bereich liegt. Die Subnetzmaske ist hier typisch für ein Heimnetzwerk. Für Gateway und DNS wird üblicherweise die IP-Adresse des Routers eingetragen.

Beim Ausfüllen der Felder sollte sehr sorgfältig gearbeitet werden, denn eine falsche Eingabe kann dazu führen, dass die Matrixuhr nicht mehr über das Netzwerk erreichbar ist. In einem solchen Fall muss man wie bei einer Inbetriebnahme das ESP32-Board ausbauen, mit einem PC verbinden und mittels Terminalprogramm eine neue WLAN-Verbindung herstellen. Bei dieser Prozedur werden die Einstellungen für die statische IP-Adresse gelöscht und die Matrixuhr bekommt wieder eine dynamische IP-Adresse zugewiesen.

Mit dem Button Einstellungen speichern werden die Eingaben im Dateisystem gespeichert. War die Aktion erfolgreich, dann erscheint neben dem Button ein  OK , außerdem der Hinweis auf den notwendigen Neustart. Im Fehlerfall, der hier auch durch eine fehlende oder falsche Eingabe ausgelöst werden kann, erscheint  Fehler . Nach dem Neustart ist die Matrixuhr nur noch über die neue IP-Adresse erreichbar.

System-Einstellungen / MQTT

Web-Seite 19 Über diese Seite kann die Kommunikation mit einem MQTT-Server im Heimnetz konfiguriert werden. Gibt es diesen nicht, dann lässt man diese Seite einfach in der abgebildeten Voreinstellung. Man hat dann allerdings keine Möglichkeit, Sensorwerte, Wetterdaten oder Kraftstoffpreise anzuzeigen.

Ist ein MQTT-Server vorhanden, z.B. in Form des Web-Moduls, dann wird zunächst über die Checkbox die MQTT-Kommunikation aktiviert. Im nächsten Feld muss die IP-Adresse des MQTT-Servers angepasst werden. Das Feld für die Port-Einstellung kann normalerweise so bleiben. Falls der MQTT-Server mit Name und Passwort abgesichert ist, dann müssen diese Daten in die Felder für Username und Passwort eingetragen werden. Anderenfalls bleiben diese leer.

Die Matrixuhr kann nicht nur Daten vom MQTT-Server empfangen, es werden auch Daten an den Server gesendet. Es handelt sich dabei um Status-Informationen, die z.B. auf dem Web-Modul über Node-RED angezeigt werden können.

LWT Topic: LWT steht für „Last will and testament“ und ist eine spezielle MQTT-Funktion. Unter dem hier eingetragenen Topic wird eine Nachricht auf dem MQTT-Server hinterlegt, die im Falle einer Verbindungsunterbrechung zwischen Matrixuhr und MQTT-Server an die Abonnenten verschickt wird. Bei der Matrixuhr lautet diese Nachricht offline. Während des Verbindungsaufbaus zum MQTT-Server wird außerdem unter dem hier eingetragenen Topic die Nachricht online verschickt. Damit werden alle Abonnenten jederzeit über den Online-Status der Matrixuhr informiert: Verbindet sich die Uhr mit dem Server, wird online weitergegeben. Kommt es zur Trennung, greift der LWT-Mechanismus und es wird offline weitergegeben.

Uptime Topic: Über dieses Topic sendet die Matrixuhr einmal pro Minute die aktuelle Systemlaufzeit in Tagen mit 2 Nachkommastellen.

RSSI Topic: Über dieses Topic sendet die Matrixuhr einmal pro Minute (gleichzeitig mit der Systemlaufzeit) die Stärke des WLAN-Empfangssignals in dBm.

Werte-Gültigkeit: Der hier eingegebene Wert bestimmt, wie lange die über MQTT empfangenen Sensorwerte [A] bis [L] gültig sind, die auf der Seite Konfiguration / Sensoren eingegeben wurden. Werden von einem Sensor keine Daten mehr empfangen, dann wird dessen Wert nach Ablauf der Gültigkeitsfrist nicht mehr angezeigt und bei den Alarmen nicht mehr ausgewertet.

Mit dem Button Einstellungen speichern werden die Eingaben im Dateisystem gespeichert. War die Aktion erfolgreich, dann erscheint neben dem Button ein  OK , außerdem der Hinweis auf den notwendigen Neustart. Im Fehlerfall, der hier auch durch eine fehlende oder falsche Eingabe ausgelöst werden kann, erscheint  Fehler . Nach dem Neustart baut die Matrixuhr automatisch eine Verbindung zum MQTT-Server auf, abonniert dann alle eingegebenen MQTT-Topics und sendet dann außerdem regelmäßig die Status-Informationen an den Server.

System-Einstellungen / Zeit

Web-Seite 20 Diese Seite ist für die richtige Zeiteinstellung der Matrixuhr wichtig. Die nebenstehende Voreinstellung ist für Deutschland optimiert und sollte auch in Österreich und der Schweiz passen. In die beiden Felder für den Server können beliebige andere NTP-Server eingetragen werden, wobei der Eintrag für den NTP-Server 2 weggelassen werden kann. Bei Verwendung einer FritzBox als Router im Heimnetz kann man auch deren IP-Adresse als NTP-Server eintragen.

Zeitzonen-Einstellung: Hier lässt sich die Zeitzone für die Normalzeit, die Sommerzeit sowie die Zeitpunkte zum Wechsel zwischen Normal- und Sommerzeit in einer speziellen Form (Posix-Format) definieren. Die Einstellung auf dem Bild funktioniert in Deutschland und wahrscheinlich auch in allen angrenzenden Ländern.

Sync-Intervall: Diese Einstellung legt den zeitlichen Abstand zwischen den NTP-Server-Abfragen fest. Die erste Abfrage erfolgt beim Systemstart der Matrixuhr, alle weiteren Abfragen im hier eingestellten Intervall.

Mit dem Button Einstellungen speichern werden die Eingaben im Dateisystem gespeichert. War die Aktion erfolgreich, dann erscheint neben dem Button ein  OK , außerdem der Hinweis auf den notwendigen Neustart. Im Fehlerfall, der hier auch durch eine fehlende oder falsche Eingabe ausgelöst werden kann, erscheint  Fehler .

System-Einstellungen / Sicherheit

Web-Seite 21 Über diese Seite lässt sich ein Passwortschutz für den Web-Server der Matrixuhr einrichten. Dazu wird zunächst über die Checkbox die Schutzfunktion aktiviert. Anschließend können geeignete Daten in die beiden Felder für Username und Passwort eingegeben werden, wobei auch Umlaute und Sonderzeichen möglich sind.

Mit dem Button Einstellungen speichern werden die Eingaben im Dateisystem gespeichert. War die Aktion erfolgreich, dann erscheint neben dem Button ein  OK , anderenfalls  Fehler . An dieser Stelle ist kein Neustart notwendig, der Passwortschutz wird sofort wirksam.

Wartung / Test-Funktionen

Web-Seite 22 Über diese Seite lassen sich einige Funktionen zum Testen des Matrix-Displays und des Sound-Moduls starten. Im oberen Bereich kann das Matrix-Display über 5 Buttons in verschiedene Test-Modi geschaltet werden. Damit kann man prüfen, ob alle 2048 LEDs funktionieren und alle Farben darstellen können. Die Helligkeit wird dabei nicht verändert. Über den Button Normal wird wieder auf die normale Uhrenanzeige zurückgeschaltet.

Im unteren Bereich kann man testen, ob das Sound-Modul funktioniert und alle Sound-Dateien abgespielt werden können. Diese Funktionen sind immer verfügbar, auch wenn auf der Seite Konfiguration / Anzeige/Sound die Sound-Ausgabe ausgeschaltet ist.

Wartung / Datei-Manager

Web-Seite 23 Auf dieser Seite hat man die Möglichkeit, auf das Dateisystem der Matrixuhr-ESP32 zuzugreifen. Alle auf dem Bild gelisteten Dateien hat die Software der Matrixuhr beim Speichern von Einstellungen erstellt, sie enthalten somit alle Konfigurationsdaten der Matrixuhr. Jede Datei erscheint hier mit einer Nummer, dem Dateinamen und der Dateigröße in Bytes. Alle Dateien können heruntergeladen, gelöscht oder durch Hochladen einer gleichnamigen Datei ersetzt werden.

Zum Download einer Datei wird zunächst deren Nummer in das Eingabefeld links neben dem Download-Button eingegeben und anschließend mit einem Klick auf Download die Übertragung gestartet. Der Browser sollte dann ohne weitere Rückfragen den Download durchführen, was übrigens nur wenige Millisekunden dauert. Eine Erfolgs- oder Fehlermeldung wird nicht ausgegeben.

Zum Löschen einer Datei wird ähnlich vorgegangen. Nach der Eingabe der Dateinummer wird auf den Button Löschen geklickt. Auch hier gibt es keine Meldung, allerdings wird die Dateiliste nach dem Löschvorgang aktualisiert. In dieser Liste fehlt die gelöschte Datei und alle verbleibenden Dateien werden neu nummeriert.

Im unteren Bereich hat man über 2 Buttons die Möglichkeit, eine Datei in das Dateisystem der Matrixuhr hochzuladen. Der obere Button wird je nach Browser unterschiedlich benannt. Beim hier verwendeten Firefox-Browser heißt dieser Durchsuchen ..., Google Chrome und Microsoft Edge benennen diesen mit Datei auswählen. Die Funktion ist aber identisch und öffnet ein Dialog-Fenster, in dem die gewünschte Datei komfortabel ausgewählt werden kann. Über den Button Öffnen in diesem Fenster wird die gewählte Datei registriert und das Dialog-Fenster wieder geschlossen.

Neben dem Button Durchsuchen ... wird jetzt die soeben ausgewählte Datei angezeigt und ein Klick auf Upload startet die Übertragung zur Matrixuhr. Dieser Vorgang dauert wegen der relativ kleinen Dateien weniger als eine Sekunde und es erscheint anschließend der Hinweis auf einen notwendigen Neustart der Matrixuhr. Hochgeladene Dateien werden nicht ausgewertet, die enthaltenen Konfigurationsdaten werden deshalb erst nach einem Neustart wirksam. Es können aber mehrere Dateien nacheinander hochgeladen und dann mit einem einzigen Neustart aktiviert werden.

Die nachfolgende Tabelle listet alle Konfigurationsdateien der Matrixuhr-ESP32 in alphabetischer Reihenfolge auf und beschreibt deren Funktion:

DateinameSeiteFunktion
alarms.txtKonfiguration / AlarmeAlarm-Konfiguration (Alarm-Parameter, MQTT-Topics)
birthdays.txtKonfiguration / GeburtstageGeburtstagsdaten (Namen und Geburtsdaten)
colors.txtKonfiguration / FarbenFarbeinstellungen
datadisp.txtKonfiguration / DatenanzeigeKonfiguration der Datenfelder
dispsound.txtKonfiguration / Anzeige/SoundAnzeige- und Sound-Einstellungen
http.txtSystem-Einstellungen / SicherheitPasswortschutz für den Web-Server
matrix.txtSystem-Einstellungen / MatrixEinstellungen für das Matrix-Display
mqtt.txtSystem-Einstellungen / MQTTEinstellungen für die MQTT-Kommunikation
network.txtSystem-Einstellungen / NetzwerkNetzwerk-Einstellungen (statische IP-Adresse)
sensors.txtKonfiguration / SensorenSensor-Konfiguration (MQTT-Topics, Parameter)
time.txtSystem-Einstellungen / ZeitZeit-Einstellungen (NTP-Server, Zeitzone)
wifi.txtSystem-Einstellungen / WLANWLAN-Einstellungen (SSID, Passwort)

Wenn die Matrixuhr vollständig konfiguriert ist, sollte man alle Dateien downloaden und auf einem Backup-Medium sichern. Falls eine Neueinrichtung der Matrixuhr notwendig sein sollte, kann man auf diese Dateien zurückgreifen. Nach Herstellung der WLAN-Verbindung lassen sich damit alle Einstellungen der Uhr wiederherstellen. Auch bei der Einrichtung einer weiteren Uhr können einzelne Dateien die Einrichtung vereinfachen. Übrigens, die Datei birthdays.txt ist kompatibel mit der Datei bdaymu der älteren Matrixuhr. Somit kann man durch Kopieren und Umbenennen dieser Datei alle Geburtstagsdaten von einer älteren Matrixuhr auf die Matrixuhr-ESP32 übertragen.

Wartung / Firmware-Update

Web-Seite 24 Auf dieser schlichten Seite hat man die Möglichkeit, die Firmware der Matrixuhr-ESP32 zu ersetzen. Als Firmware wird hier die kompilierte Software bezeichnet, die alle Funktionen der Uhr steuert. Im Gegensatz zur älteren Matrixuhr, wo eine Konfiguration des Raspberry Pi sowie ein Programmiergerät für den Atmel-Mikrocontroller notwendig war, benötigt man für ein vergleichbares Update der Matrixuhr-ESP32 keine zusätzlichen Komponenten. Die neue Firmware wird einfach über WLAN in den Flashspeicher des ESP32 übertragen. Man nennt dieses Verfahren auch OTA (Over the air). Alle Einstellungen der Matrixuhr bleiben dabei übrigens erhalten.

Vor einem Update sollte man zunächst die Firmware-Datei bereitlegen. Diese findet man im Paket matrixesp-firmware-v1200.zip als Datei firmware.bin mit einer Größe von ungefähr 1 MB. Das Firmware-Update funktioniert ähnlich wie der weiter oben beschriebene Upload im Datei-Manager. Über den oberen Button Durchsuchen ... (der auf anderen Browsern mit Datei auswählen bezeichnet ist), wird ein Dialog-Fenster geöffnet, in dem die Firmware-Datei ausgewählt werden kann. Über den Button Öffnen in diesem Fenster wird die gewählte Firmware-Datei registriert und das Dialog-Fenster wieder geschlossen.

Neben dem Button Durchsuchen ... wird jetzt die soeben ausgewählte Firmware-Datei angezeigt und ein Klick auf Update startet die Übertragung zur Matrixuhr. Dieser Vorgang dauert im besten Fall 10 Sekunden, kann aber bei schlechter WLAN-Verbindung durchaus bis zu einer Minute in Anspruch nehmen. Auf der Web-Seite sieht man leider keine Informationen während der Übertragung (kommt vielleicht in einer späteren Version), allerdings erscheint auf der Uhr eine Fortschrittsanzeige in Form einer Pixelzeile. Wurde die Datei erfolgreich übertragen, wird bei dieser Zeile jedes zweite Pixel ausgeschaltet. Gleichzeitig erscheint im Browser neben dem Update-Button ein  OK  und darunter der Hinweis auf einen notwendigen Neustart der Uhr. Sollte der Upload fehlgeschlagen sein, dann bleibt eine unvollständige Pixelzeile auf der Uhr stehen und es erscheint  Fehler  im Browser.

Hinweis: Ein Firmware-Update ist grundsätzlich ein kritischer Vorgang. Wenn die neue Firmware fehlerhaft ist, dann kann es passieren, dass die Matrixuhr nicht mehr startet. Selbstverständlich teste ich neue Firmware auf meiner Uhr, bevor ich sie veröffentliche. Trotzdem kann ich nicht dafür garantieren, dass alles perfekt funktioniert. Ein abgebrochener Upload-Vorgang ist übrigens weniger kritisch. In einem solchen Fall bleibt die bisherige Firmware aktiv, auch bei einem Neustart. Man kann an dieser Stelle einfach den Update-Vorgang wiederholen.

Erfahrungen: Ich hatte in der Testphase viele abgebrochene OTA-Updates und konnte einfach keinen Fehler finden. Auch dauerte der Aufbau der Web-Seite oft viel zu lange. Die Ursache war relativ simpel: Die Uhr stand einfach nur zu nah am Router. Man sollte also auf der Seite Informationen / Status das WLAN-Signal im Auge behalten und auf Werte zwischen -80 und -40 dBm achten. Liegt der Wert außerhalb dieses Bereiches und ist der Seitenaufbau ungewöhnlich langsam, dann muss man mit Fehlschlägen beim OTA-Update rechnen. Grundsätzlich funktioniert das aber sehr gut: In der letzten Phase der Software-Entwicklung habe ich nur noch mit OTA gearbeitet und ungefähr 50 Updates erfolgreich durchgeführt.

Wartung / Neustart

Diese Menü-Funktion ruft zunächst die Status-Seite (Informationen / Status) auf, wartet noch eine Sekunde und führt dann ohne weitere Nachfragen einen Reboot der Systemsoftware aus. Die Status-Seite bleibt dabei unverändert und muss nach dem Neustart manuell aktualisiert werden. Dabei sollte man noch etwa 10 Sekunden warten, damit die Uhr die WLAN-Verbindung wieder herstellen kann und erst dann auf Aktualisieren klicken. Falls vor dem Neustart Änderungen an der WLAN-Verbindung oder an den Netzwerk-Einstellungen vorgenommen wurden, muss die Seite über die neue IP-Adresse der Matrixuhr aufgerufen werden.

Symbol Weitere Informationen

In diesem Abschnitt folgen noch einige Informationen, die in den anderen Kapiteln noch nicht erwähnt worden sind.

• Anzeige von Informationen und Alarmen

Die untere Zeile der Matrixuhr dient zur Anzeige von Informationen. Hier lassen sich verschiedene Elemente konfigurieren: Datum, Wochentag, Sensorwerte und Geburtstage. Diese Elemente wechseln in einem einstellbaren Intervall (2, 3 oder 4 Sekunden) und verwenden dabei immer die folgende feste Reihenfolge:

DatumWochentagDatenfeld 1Datenfeld 2Datenfeld nGeburtstag 1Geburtstag 2Geburtstag nDatum ⋅⋅⋅

Fehlen bestimmte Elemente, weil sie nicht konfiguriert sind oder bewusst ausgeschlossen wurden, dann werden diese im Zyklus einfach weggelassen. Die anderen Elemente rücken nach, so dass keine Lücken in der Anzeige entstehen. Es gibt dabei einige Spezialfälle: Ist die Anzeige des Datums konfiguriert, die Uhr aber noch nicht synchronisiert, dann erscheint anstatt des Datums der Platzhalter kein Datum. Beim Wochentag funktioniert das ähnlich, hier erscheint dann kein Tag. Sind gar keine Elemente für die Anzeige verfügbar, dann wird dauerhaft keine Daten angezeigt.

Wird ein Alarm ausgelöst, schaltet das Display in einen 3-zeiligen Modus um. Die Informationen (Datum, Wochentag, Sensorwerte und Geburtstage) rücken dann in die mittlere Zeile und laufen im eingestellten Intervall weiter. Auf der unteren Zeile erscheinen dann die aktuellen Alarme und auch diese wechseln im eingestellten Intervall und in einer starren Reihenfolge:

Alarm 1Alarm 2Alarm nAlarm 1 ⋅⋅⋅

Nicht mehr aktive Alarme erscheinen weiterhin in der Anzeige, werden aber unterstrichen dargestellt. Je nach Konfiguration der einzelnen Alarme verschwinden diese nach 2 Minuten automatisch aus dem Anzeigezyklus oder bleiben dauerhaft sichtbar, bis sie manuell gelöscht werden. Eine Löschung ist jederzeit durch kurzes Berühren des Touchsensors an der Uhr oder über den Button Alarme quittieren auf der Web-Seite möglich.

Eine besondere Funktion ist die Anzeige einer Textnachricht, die entweder über die Web-Seite eingegeben oder über MQTT empfangen werden kann. Hier wird die Anzeige ebenfalls in den 3-zeiligen Modus umgeschaltet und die untere Zeile zeigt dann die Nachricht als Laufschrift an. Eventuell anstehende Alarme werden dabei in den Hintergrund gestellt und erst dann wieder angezeigt, wenn die Textnachricht über den Touchsensor oder die Web-Seite gelöscht wurde.

• Sonderzeichen in Texten

Auf der Web-Seite können an vielen Stellen Texte eingegeben werden. Dabei gibt es folgendes zu beachten:

MQTT-TopicsHier sollten grundsätzlich keine Sonderzeichen verwendet werden.
GeburtstageDie Namen dürfen folgende Sonderzeichen enthalten: ÄÖÜäöüéß°€.
DatenanzeigeDie Datenfelder dürfen folgende Sonderzeichen enthalten: ÄÖÜäöüéß°€.
AlarmtexteDiese dürfen folgende Sonderzeichen enthalten: ÄÖÜäöüéß°€.

• Verschiedene Symbole

Die Matrixuhr kann Symbole für die aktuelle Wetterlage, die Windrichtung und noch einige andere anzeigen. Die meisten Symbole werden automatisch entsprechend der empfangenen Wetterinformationen ausgewählt, andere können in den Datenfeldern für eigene Anzeigen verwendet werden. Ein großer Teil der Symbole verwendet feste Farben, die nicht geändert werden können. Grundsätzlich können alle verfügbaren Symbole auch für andere Zwecke verwendet werden. Die folgende Tabelle zeigt alle Symbole und deren Kodierung, die in den Datenfeldern verwendet werden muss:

SymbolKodierungBedeutungBesonderheit
Symbol$AKlarer Himmel (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$BKlarer Himmel (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$CEin paar Wolken (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$DEin paar Wolken (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$EMäßig bewölkt (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$FMäßig bewölkt (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$GÜberwiegend bewölkt, bedeckt (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$HÜberwiegend bewölkt, bedeckt (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$IRegenschauer (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$JRegenschauer (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$KRegen (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$LRegen (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$MGewitter (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$NGewitter (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$OSchnee (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$PSchnee (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$QNebel, Dunst, Trüb (Tag-Symbol)24 Pixel breit, feste Farben
Symbol$RNebel, Dunst, Trüb (Nacht-Symbol)24 Pixel breit, feste Farben
Symbol$SEmpfang eines fehlerhaften Symbol-Kodes24 Pixel breit, feste Farben
Symbol$0Windrichtung unbestimmt7 Pixel breit, Datum-Farbe
Symbol$1Wind aus Richtung Süd7 Pixel breit, Datum-Farbe
Symbol$2Wind aus Richtung Südwest7 Pixel breit, Datum-Farbe
Symbol$3Wind aus Richtung West7 Pixel breit, Datum-Farbe
Symbol$4Wind aus Richtung Nordwest7 Pixel breit, Datum-Farbe
Symbol$5Wind aus Richtung Nord7 Pixel breit, Datum-Farbe
Symbol$6Wind aus Richtung Nordost7 Pixel breit, Datum-Farbe
Symbol$7Wind aus Richtung Ost7 Pixel breit, Datum-Farbe
Symbol$8Wind aus Richtung Südost7 Pixel breit, Datum-Farbe
Symbol$TSonnen-Symbol10 Pixel breit, feste Farben; für Anzeige der Sonnenzeiten (wird intern verwendet)
Symbol$USolar-Symbol13 Pixel breit, feste Farben; für die Anzeige von Solarenergie
Symbol$VBatterie-Symbol5 Pixel breit, feste Farben; für die Anzeige von Batterie-Ladeständen
Symbol$WTankstellen-Symbol10 Pixel breit, feste Farben; für die Anzeige von Kraftstoffpreisen
Symbol$XWolken-Symbol16 Pixel breit, feste Farben; für die Anzeige der Wolkendichte
Symbol$YWind-Symbol16 Pixel breit, feste Farben; für die Anzeige von Windinformationen
Symbol$ZRegen-Symbol16 Pixel breit, feste Farben; für die Anzeige der Regenmenge

Symbol Sonstiges

Die ältere Matrixuhr läuft bei mir inzwischen seit 8 Jahren im Dauerbetrieb (Stand Oktober 2023) und das absolut störungsfrei. Auch das Matrix-Display scheint recht langlebig zu sein, es sind bisher keine nachlassenden LEDs zu erkennen. Es gibt aber auch Nachteile: Die Inbetriebnahme der Uhr ist wegen der 2 Mikrocontroller recht aufwändig und erfordert außerdem ein Programmiergerät. Das gleiche gilt auch für Updates, die ebenfalls viel Zeit und meist auch ein Programmiergerät benötigen. Außerdem ist das Linux auf dem Raspberry Pi recht empfindlich, wenn das System nicht sauber heruntergefahren wird. Es gibt also durchaus noch viele Möglichkeiten für Verbesserungen und so habe ich im Februar 2023 begonnen, eine neue Matrixuhr zu entwickeln.

Die neue Uhr sollte ungefähr die gleiche Funktionalität wie die ältere Uhr haben und auch mit dem gleichen bewährten LED-Matrix-Display arbeiten. Die gesamte Steuerung soll jetzt allerdings nur noch ein leistungsfähiger Mikrocontroller übernehmen. In Frage kamen dabei der Raspberry Pi Pico W oder der ESP32. Ich habe mich für letzteren entschieden, da es hier sowohl leistungsfähige Entwicklungsumgebungen als auch viele fertige Bibliotheken gibt. Insbesondere Netzwerk-Funktionen und Display-Ansteuerung sind sehr komplex und hier kann man auf Bibliotheken zurückgreifen, die man relativ einfach in das Projekt integrieren kann. Das war der Plan, aber ganz so einfach war es dann doch nicht und auch die am besten geeigneten Bibliotheken sind nicht so leicht zu finden.

Zunächst musste ich mich für die richtige Entwicklungsumgebung entscheiden. Da die Arduino-Plattform mit der Programmiersprache C++ genutzt werden sollte, war es naheliegend, auch die Arduino-Entwicklungsumgebung zu verwenden. Schöner fand ich dann aber Visual Studio Code, welches mittels PlatformIO zur vollwertigen Entwicklungsumgebung für verschiedene Mikrocontroller-Familien aufgerüstet werden kann. Auf dieser Basis versuchte ich dann in einem ersten Test, mit der PxMatrix-Bibliothek das Display zum Leben zu erwecken. Man kann hier allerdings das Display nicht über das mitgelieferte 16-polige Flachbandkabel an den ESP32 anschließen und muss stattdessen eine sehr ungewöhnliche Verkabelung basteln. Aber es funktionierte auf Anhieb - bis ich im nächsten Schritt eine WLAN-Verbindung herstellen wollte. Es kam dabei immer wieder zu sporadischen Reboots, die nicht nachvollziehbar waren.

Zum Glück gibt es noch andere Bibliotheken für diese Matrix-Displays und so versuchte ich es mit ESP32-HUB75-MatrixPanel-DMA. Diese verwendet wieder die übliche Ansteuerung über das Flachbandkabel und funktionierte sofort, und das auch zusammen mit einer WLAN-Verbindung. In der weiteren Software-Entwicklung waren noch weitere Bibliotheken erforderlich und auch hier musste ich immer wieder experimentieren und Rückschläge in Kauf nehmen. Ein weiteres Extrembeispiel war hier die Bibliothek pubsubclient, die für die MQTT-Kommunikation zuständig ist und perfekt mit Sensordaten und Alarmen funktionierte. Erst später kamen Wetterdaten und Kraftstoffpreise hinzu und hier gab es wegen eines zu kleinen Puffers Probleme. Zwar lässt die Bibliothek eine Vergrößerung des Puffers zu, das führt allerdings leider zu einem Crash. Also musste ich mal wieder alles umbauen und mit der Bibliothek espMqttClient konnten endlich auch größere Datenpakete problemlos über MQTT empfangen werden.

Um es kurz zu machen: Die Entwicklung hat mal wieder viel länger gedauert als geplant und ich war auch nah dran, das Projekt aufzugeben. Das Endprodukt ist dann aber doch ganz gut geworden, auch wenn nicht alles optimal funktioniert. Ich habe hier mal die Matrixuhr-ESP32 mit der älteren Matrixuhr verglichen und die Unterschiede in der nachfolgenden Übersicht aufgelistet.