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 und Kraftstoffpreise. Dabei kann man zwischen einer Wechselanzeige und einer Laufschriftausgabe wählen. Weiterhin können Alarme signalisiert sowie eine Textnachricht als Laufschrift ausgegeben 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 Bearbeitung30.11.2025
Aktueller Softwarestandv2.000 vom 27.11.2025
SymbolDownloads
Schaltplan
Stückliste mit Empfehlungen zur Bauteilbestellung
Software v2.000 für ESP32 (AZ-Delivery ESP32-WROOM-32 Devkit v4) als kompletter Quelltext in C vom 27.11.2025 matrixesp-software-v2000.zip
Fertig kompilierte Firmware v2.000 für ESP32 (AZ-Delivery ESP32-WROOM-32 Devkit v4) vom 27.11.2025 matrixesp-firmware-v2000.zip
Sound-Paket mit 6 Klängen für das Sound-Modul der Matrixuhr-ESP32matrixesp-sounds.zip
Platinen-Layout vom 21.04.2025 von Martin Krügermatrixesp-layout.zip
3D-Druck-Dateien für ein Gehäuse mit P5-Display vom 28.04.2025 von Martin Krügermatrixesp-3d-druck.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 InformationenEinige zusätzliche Informationen
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.

Ü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. Nach Veröffentlichung dieses Projektes wurde allerdings festgestellt, das einige ESP32-Boards den Anschluss GPIO2 intern verwenden und somit die Touchsensor-Funktion nicht zur Verfügung steht. In einem solchen Fall kann man die GPIO-Anschlüsse 32 oder 33 als Sensor-Eingang verwenden. Alternativ lässt sich beim gewählten GPIO-Port auch eine normale Tasterfunktion realisieren.

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 pioarduino. Es ist ebenso möglich, die Arduino-Entwicklungsumgebung zu verwenden, diese ist allerdings nicht so komfortabel. Die Datei matrixesp-software-v2000.zip enthält den Quelltext in 2 Versionen: eine für PlatformIO/pioarduino 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 (wird nur bei PlatformIO/pioarduino benötigt)

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/mrcodetastic/ESP32-HUB75-MatrixPanel-DMA
Adafruit GFX Library https://github.com/adafruit/Adafruit-GFX-Library
Adafruit BusIOhttps://github.com/adafruit/Adafruit_BusIO
ESPAsyncWebServerhttps://github.com/ESP32Async/ESPAsyncWebServer
AsyncTCPhttps://github.com/ESP32Async/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. Eine Ausnahme ist hier die Laufschriftausgabe. Diese erfolgt in einem Zeitraster von 22 bis 62 Millisekunden und ist abhängig von der konfigurierten Scroll-Geschwindigkeit.

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 definiert eine 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 und Geburtstage für die Wechselanzeige. Hier schließen sich 2 Funktionen an, die für die Bearbeitung und Auslösung von Alarmen zuständig sind. Weiter geht es mit einer Funktion, die eine Textnachricht (entweder eingegeben oder über MQTT empfangen) für die Laufschrift-Anzeige aufbereitet. Den Abschluss bilden 2 größere Funktionen, die Sensorwerte und Geburtstage auswerten und daraus eine Laufschrift erstellen.

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 pioarduino bzw. 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-v2000.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-v2000.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 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 dessen 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 die Auswahl jedem selbst, 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 (ganz unten) 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 vermutlich schon einige Beispiel-Klänge. 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 Alternativ können alle Informationen wie Datum, Wochentag, Sensorwerte, Wetterdaten, Kraftstoffpreise und Geburtstage in Form einer Laufschrift angezeigt werden. Diese ist frei konfigurierbar und erlaubt die Darstellung von Daten, die sonst nicht auf eine Displayzeile passen würden, z.B. Einheiten hinter Sensorwerten oder lange Namen bei Geburtstagen.

Anzeige 6 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 7 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 8 Ü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. Je nach Einstellung wird die Nachricht bis zu 5 mal wiederholt und dann wieder ausgeblendet oder 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 9 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 10 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 11 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 12 Bei der Quittierungsfunktion durch kurze Berührung des Touchsensors wird immer unter der Uhrzeit eine Animation zur Bestätigung 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. Werden inaktive (unterstrichene) Alarme angezeigt, dann werden diese gelöscht und es erscheint die normale Anzeige wieder. Läuft gerade eine Textnachricht, dann wird diese vorrangig quittiert und wieder ausgeblendet, eventuell anstehende Alame werden dann wieder sichtbar. Sollen diese ebenfalls gelöscht werden, dann muss die Quittierungsfunktion nochmals verwendet werden.

Anzeige 13 Berührt man den Touchsensor länger als eine Sekunde, dann aktiviert sich die Stummschaltung der Matrixuhr. Auch hier erscheint zunächst die soeben erwähnte Animation, danach wird der neue Zustand durch eine dauerhafte Anzeige einer Pixelzeile in Alarm-Farbe unter der Uhrzeit angezeigt. Ist die Stummschaltung aktiv, werden von der Matrixuhr keine Sounds 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 14 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. Je nach Einstellung erscheint die Nachricht bis zu 5 mal oder dauerhaft und kann durch eine weitere Berührung wieder gelöscht werden.

Anzeige 15 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 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 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 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 kurze 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 Auf dieser Seite 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. Auf diesem Beispiel-Bild ist bereits ein Eintrag vorhanden.

Die Geburtstagsliste kann bis zu 100 Einträge aufnehmen und zur besseren Übersicht verwendet der Web-Server 4 Bildschirmseiten mit jeweils 25 Einträgen. Jeder dieser Einträge besteht aus einem Namen und dem Geburtsdatum. Die Länge des Namens ist auf 25 Zeichen begrenzt und bei Verwendung der Laufschriftanzeige wird dieser vollständig zusammen mit dem errechneten Alter ausgegeben. Nutzt man die Wechselanzeige, dann werden aus Platzgründen nur die ersten 9 Zeichen des Namens und das errechnete Alter ausgegeben. 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 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 oben 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 Feld links neben dem Button eingetragen werden. Auch hier wird die Liste automatisch neu geordnet und gespeichert und es erscheint oben 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.

Enthält die Geburtstagsliste mehr als 25 Einträge, dann kann über einen Klick auf den Button Seite 1 die nächste Seite angezeigt werden. Der Button ändert sich dann in Seite 2 und es erscheinen die Einträge 26-50. Die Eingabe eines neuen Geburtstages kann auf jeder beliebigen Seite erfolgen. Sind bereits 100 Geburtstage vorhanden, dann wird der Button + inaktiv. Das Löschen eines Geburtstages ist ebenfalls auf jeder beliebigen Seite möglich, auch wenn die eingegebene Nummer gerade nicht sichtbar ist. Nach jeder Änderung der Geburtstagsliste wird zunächst wieder die Seite 1 angezeigt.

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 Datenausgabe 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.

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. Wurde eine Textnachricht empfangen, dann erscheinen hier die ersten 12 Zeichen.

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 / Datenausgabe

Web-Seite 4 Auf dieser Seite lassen sich die Informationen und Sensordaten zusammenstellen, die auf der Matrixuhr angezeigt werden sollen. Voraussetzung dafür ist die vorherige Erfassung der benötigten Sensoren auf der Seite Konfiguration / Sensoren. Für die Ausgabe der Daten gibt es grundsätzlich 2 Möglichkeiten:

Wechselanzeige: Alle im oberen Bereich (Datenfeld 1 bis Datenfeld 10) eingegebenen Daten werden aufbereitet und nacheinander im eingestellten Wechsel-Rhythmus auf der unteren Zeile der Matrixuhr angezeigt. 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.

Laufschrift: Alle in der mittleren langen Zeile eingegebenen Daten werden aufbereitet und zu einer kompletten Laufschrift verarbeitet, die dann auf der unteren Zeile der Matrixuhr ausgegeben wird. Die Eingabezeile kann bis zu 200 Zeichen aufnehmen und die resultierende Laufschrift kann bis zu 2000 Pixel lang sein. Auch hier können Sensorwerte, feste Zeichen oder Texte und Symbole verwendet werden. Für die Anzeige von Sensorwerten dienen hier die gleichen Platzhalter wie bei der Wechselanzeige, die bei der Erstellung der Laufschrift durch den entsprechenden Sensorwert ersetzt werden.

Hinweis: Die Datenfelder für die Wechselanzeige und die Laufschrift können gleichzeitig verwendet werden. Ob die Ausgabe der Daten in Wechselfeldern oder als Laufschrift erfolgen soll, wird auf der Seite Konfiguration / Anzeige festgelegt.

Der untere Teil der Seite zeigt als kleine Hilfe eine Übersicht mit allen zur Verfügung stehenden Platzhaltern und deren Bedeutung. Sofern verfügbar, werden hier auch die aktuellen Werte in Klammern angezeigt. Außerdem sind hier noch 7 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.

Wechselanzeige: Die folgende Tabelle beschreibt die Beispiele in den 6 Datenfeldern im Bild weiter oben und einige weitere Beispiele:

ZeileAnzeigebeispielBemerkung
[W] [A]°CAnzeige 5 Dieses Datenfeld besteht aus einem Wettersymbol, dem Wert des Sensors A (Temperatur 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] mmAnzeige 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]Anzeige 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]%Anzeige 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] €Anzeige 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] kWAnzeige 25 Dieses Datenfeld verwendet das feste Solarsymbol, den Sensorwert E (aktuelle Solar-Leistung in kW mit 2 Nachkommastellen) und den festen Text kW.
[X]Anzeige 10
Anzeige 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]Anzeige 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.

Die im Bild weiter oben in den Datenfeldern eingegebenen Daten führen zu folgender Wechselanzeige auf der unteren Zeile der Matrixuhr:

Anzeige 43Anzeige 41Anzeige 42Anzeige 41Anzeige 5Anzeige 41Anzeige 6Anzeige 41Anzeige 7Anzeige 41Anzeige 8Anzeige 41Anzeige 9Anzeige 41Anzeige 25Anzeige 41

Die Wechselzeit der Datenfelder lässt sich auf der Seite Konfiguration / Anzeige auf 2, 3 oder 4 Sekunden einstellen. Auf der gleichen Seite kann man auch festlegen, ob das Datum und der Wochentag angezeigt werden soll. Sind Geburtstage aktiv, dann werden diese immer nach dem letzten Datenfeld angezeigt. Mit dem Beispiel-Geburtstag vom Bild etwas weiter oben hätte die Ausgabe am 10.07.2025 folgendermaßen aussehen können:

Anzeige 44Anzeige 41Anzeige 45Anzeige 41Anzeige 5Anzeige 41Anzeige 6Anzeige 41Anzeige 7Anzeige 41Anzeige 8Anzeige 41Anzeige 9Anzeige 41Anzeige 25Anzeige 41Anzeige 46Anzeige 41

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

Laufschrift: Die in der oben stehenden Tabelle beschriebenen Beispiele der Wechselanzeige funktionieren auch bei der Laufschrift und produzieren die gleichen Ergebnisse. Der hauptsächliche Unterschied ist jedoch, dass alle für die Laufschrift benötigten Daten in ein einzelnes Feld geschrieben werden. Das hat zur Folge, dass man selbst für die nötigen Abstände zwischen den Elementen sorgen muss - oder man macht vom dynamischen Bereich Gebrauch. Um die etwas kryptisch aussehende Eingabezeile im Bild weiter oben besser zu verstehen, verwende ich zunächst nur das folgende Element in der Eingabezeile:

[W] [A]°C

Als Ergebnis würde folgende Laufschrift generiert:

Anzeige 26Anzeige 29Anzeige 28

Jetzt kann allerdings ein Sonderfall eintreten. Wenn z.B. nach dem Start der Uhr noch keine Wetterdaten vorliegen oder der Wetterdienst über einen längeren Zeitraum nicht erreichbar ist, dann gibt es kein Wettersymbol. Ebenso fehlt beim Start vielleicht noch der Wert vom Außensensor und dann würde die Laufschrift folgendermaßen aussehen:

Anzeige 26Anzeige 30Anzeige 28

Hier wird ein Ersatzsymbol eingeblendet und der fehlende Sensorwert durch ein Fragezeichen ersetzt. Bei der Wechselanzeige würde in einem solchen Fall keine Ausgabe erfolgen und das Datenfeld einfach übersprungen. Hier kann man diesen Mechanismus nicht einsetzen, da es eben keine abgegrenzten Datenfelder gibt. Aber das Problem lässt sich elegant lösen und zwar mit dem dynamischen Bereich. Dazu schließt man das Beispiel von oben einfach in geschweifte Klammern ein:

{[W] [A]°C}

Jetzt passiert folgendes: Sind alle auszugebenden Sensorwerte innerhalb der geschweiften Klammern vorhanden und gültig, dann wird dieser Teil ganz normal als Laufschrift ausgegeben (natürlich ohne die geschweiften Klammern). Fehlen einzelne oder mehrere Sensorwerte, dann wird der gesamte Inhalt zwischen den Klammern verworfen und nicht ausgegeben. Es gibt hier keine Einschränkungen bei der Anzahl der eingeschlossenen Elemente und es können beliebig viele dynamische Bereiche definiert werden. Eine Verschachtelung ist allerdings nicht möglich.

Dynamische Bereiche kann man bei allen auszugebenden Daten verwenden, also auch beim Wochentag, beim Datum und bei den Geburtstagen, denn auch hier werden bei fehlenden Informationen Ersatzwerte wie kein Tag, kein Datum oder kein Geburtstag angezeigt. Setzt man die dynamischen Bereiche konsequent ein, dann kann man noch einen weiteren Vorteil nutzen: Die Uhr setzt bei der Laufschrift-Ausgabe automatisch ein Trenn-Element zwischen die Bereiche und dieses kann selbst definiert werden. Hier habe ich als Beispiel die Zeile aus dem Screenshot weiter oben noch einmal im Klartext aufgelistet (im Bild ist die Zeile leider nicht vollständig zu sehen):

{[f]}{[g]}{[W] [A]°C}{$Z [S] mm}{$Y [V] [R] km/h}{Wohnzimmer [B]°C [C]%}{$W [a] €}{$U [E] kW}

Damit ergibt sich folgende Laufschrift-Ausgabe:

Anzeige 26Anzeige 31Anzeige 27Anzeige 29Anzeige 27Anzeige 33Anzeige 27Anzeige 32Anzeige 27Anzeige 34Anzeige 27Anzeige 35Anzeige 27Anzeige 36Anzeige 28

Obwohl in diesem Beispiel der Bereich {[g]} (Geburtstage) definiert wurde, werden keine Geburtstags-Informationen ausgegeben. Mit dem Beispiel-Geburtstag vom Bild etwas weiter oben hätte die Ausgabe am 10.07.2025 so aussehen können:

Anzeige 26Anzeige 37Anzeige 27Anzeige 38Anzeige 27Anzeige 29Anzeige 27Anzeige 33Anzeige 27Anzeige 32Anzeige 27Anzeige 34Anzeige 27Anzeige 35Anzeige 27Anzeige 36Anzeige 28

Zwischen den dynamischen Elementen werden hier automatisch 3 Leerzeichen als Trenn-Element eingefügt. Dies ist die Voreinstellung und kann auf der Seite Konfiguration / Anzeige geändert werden. Hier ist ein Beispiel mit einem alternativen Trenn-Element, welches aus 2 Leerzeichen, einem Stern und weiteren 2 Leerzeichen besteht:

Anzeige 26Anzeige 31Anzeige 39Anzeige 29Anzeige 39Anzeige 33Anzeige 39Anzeige 32Anzeige 39Anzeige 34Anzeige 39Anzeige 35Anzeige 39Anzeige 36Anzeige 28

Hier noch einige Hinweise und Tipps für die Laufschrift:

Vermutlich werden viele Versuche nötig sein, bis man die optimale Laufschrift-Anzeige gefunden hat. Hier sollte man einfach experimentieren und alle Möglichkeiten ausprobieren.

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 einmal pro Sekunde geprüft, es kann also zu minimalen Verzögerungen bei der 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

Web-Seite 15 Diese Seite ermöglicht allgemeine Einstellungen für die Anzeige im oberen Teil und spezielle Einstellungen für die Wechselanzeige sowie die Laufschrift im unteren Teil.

Datenausgabe-Modus: Dies ist sozusagen der Hauptschalter für die Datenausgabe und legt fest, wie Geburtstage, Sensorwerte, Wetterinformationen und Kraftstoffpreise auf dem Matrix-Display erscheinen sollen. Hier hat man die Auswahl zwischen einer Wechselanzeige (zyklisch wechselnde Datenfelder) oder einer Laufschrift (fortlaufende Ausgabe der Informationen).

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.

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 9 Stufen erhöht und die maximale Helligkeit um bis zu 14 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: Mit dieser Einstellung wird die Geschwindigkeit der Laufschrift für die Datenausgabe und für empfangene Textnachrichten festgelegt.

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

Nachrichten anzeigen: Diese Einstellung bestimmt, wie empfangene Textnachrichten angezeigt werden sollen. Bei der Auswahl von bis zur Quittierung wird die Textnachricht fortlaufend angezeigt und muss manuell quittiert werden (über Touchsensor oder Web-Seite). Die weiteren Einstellungen 1 mal bis 5 mal zeigen die Nachricht in der entsprechenden Anzahl an und löschen diese dann automatisch.

Wechsel-Interval: Diese Einstellung legt das Zeitraster fest, in dem die Wechselanzeige arbeiten soll. Weiterhin bestimmt diese Einstellung auch die Kleinanzeige unterhalb der Sekunden sowie die Anzeige von Alarmen.

Datum anzeigen und Wochentag anzeigen: Diese Einstellungen sind nur bei der Wechselanzeige relevant und fügen zusätzlich das Datum und/oder den Wochentag in die Wechselanzeige ein.

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.

dynamisches Trenn-Element: Wird bei der Laufschrift der dynamische Bereich {...} verwendet, dann wird das hier konfigurierte Element automatisch zwischen den Bereichen eingefügt. Dieses Trenn-Element kann aus bis zu 10 Zeichen bestehen, wobei keine Buchstaben und Zahlen verwendet werden können. Diese dienen hier als Platzhalter für das Leerzeichen und werden immer durch ein solches ersetzt. Die Voreinstellung xxx bewirkt also das Einfügen von 3 Leerzeichen zwischen den dynamischen Bereichen. Um das alternative Trenn-Element mit einem Stern wie in der Beispiel-Laufschrift weiter oben zu erzeugen, könnte man folgende Eingabe verwenden: xx*xx.

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.

Konfiguration / Sound

Web-Seite 40 Auf dieser Seite können einige Einstellungen für die Sound-Ausgabe festgelegt werden.

Sound aktivieren: Dies ist der Hauptschalter für die Sound-Ausgabe. Erst nach Aktivierung dieser Einstellung werden Sounds erzeugt.

Stundengong aktivieren: Über diese Einstellung lässt sich der Stundengong aktivieren.

Sound Beginn- und Endezeit: Hier lässt sich der Zeitraum in vollen Stunden 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 die weiter unten beschriebene Seite 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 die Menü-Option Wartung / Neustart ausgelöst werden.

System-Einstellungen / Hardware

Web-Seite 16 Auf dieser Seite können einige Parameter für das Matrix-Display eingestellt werden und es ist eine Konfiguration des Touchsensors möglich. 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. Nutzt man die Laufschrift-Ausgabe, dann sind für eine saubere Darstellung 200 Hz optimal.

Eingabetyp: Mit dieser Einstellung kann man wählen, ob man einen Touchsensor oder einen Taster verwenden möchte. Bei Auswahl des Tasters wird am GPIO-Anschluss des ESP32 ein Pull-up-Widerstand aktiviert, so dass (außer dem Taster) keine weiteren Bauteile erforderlich sind.

Anschluss: Über diese Einstellung lässt sich ein alternativer Anschluss für den Touchsensor bzw. den Taster auswählen. Möglich sind hier die GPIO-Anschlüsse 2, 32 und 33. Hintergrund: Einige aktuelle ESP32-WROOM-32-Boards verwenden den vorgegebenen Anschluss 2 intern und blockieren damit die Sensor-Funktion. Ein Wechsel auf GPIO 32 oder 33 behebt das Problem.

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.

Änderungen auf dieser Seite sollten gut überlegt sein. Hat man fehlerhafte Daten eingegeben, dann verbindet sich die Uhr nach dem Neustart nicht mehr mit dem Netzwerk. In einem solchen Fall muss das ESP32-Board aus der Matrixuhr ausgebaut, mit einem PC verbunden und dann mit einem Terminal mit neuen WLAN-Daten versorgt werden.

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.

Bevor man die statische IP-Adresse über die Checkbox aktiviert, sollte man alle Beispiel-Einträge an das eigene Heimnetz anpassen und sicher sein, dass die neue IP-Adresse auch verfügbar ist. 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 ist die gleiche Prozedur wie bei falschen WLAN-Zugangsdaten erforderlich: ESP32-Board ausbauen, mit einem PC verbinden und mittels Terminalprogramm eine neue WLAN-Verbindung herstellen. Dabei 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 / 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, der Dateigröße in Bytes und dem Datum der letzten Änderung. 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 der Liste fehlt dann 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.

Übrigens, hochgeladene Dateien werden nicht überprüft. Es sind beliebige Namen und auch beliebige Größen möglich. Ich rate jedoch davon ab, unnütze und sehr große Dateien hochzuladen.

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
display.txtKonfiguration / AnzeigeAnzeige-Einstellungen
hardware.txtSystem-Einstellungen / HardwareEinstellungen für das Matrix-Display und den Touchsensor
http.txtSystem-Einstellungen / SicherheitPasswortschutz für den Web-Server
mqtt.txtSystem-Einstellungen / MQTTEinstellungen für die MQTT-Kommunikation
network.txtSystem-Einstellungen / NetzwerkNetzwerk-Einstellungen (statische IP-Adresse)
sensors.txtKonfiguration / SensorenSensor-Konfiguration (MQTT-Topics, Parameter)
sound.txtKonfiguration / SoundSound-Einstellungen
time.txtSystem-Einstellungen / ZeitZeit-Einstellungen (NTP-Server, Zeitzone)
wifi.txtSystem-Einstellungen / WLANWLAN-Einstellungen (SSID, Passwort)

Die nachfolgende Tabelle listet einige veraltete Konfigurationsdateien auf. Nach einem Firmware-Update auf v2.000 oder höher werden alle Änderungen in die blau dargestellten neuen Dateien geschrieben und die alten Dateien nicht mehr gepflegt. Diese stören die Uhrenfunktion jedoch nicht und können im Dateisystem verbleiben.

DateinameFunktionwird ersetzt durch
dispsound.txtAnzeige- und Sound-Einstellungendisplay.txt und sound.txt
matrix.txtEinstellungen für das Matrix-Displayhardware.txt

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 Matrixuhr-ESP32 können einzelne Dateien die Einrichtung vereinfachen. Übrigens, die Datei birthdays.txt ist kompatibel mit der gleichnamigen Datei der Matrixuhr-Mini und auch mit der Datei bdaymu der älteren Matrixuhr. Damit lassen sich lange Geburtstagslisten zwischen den Uhren austauschen.

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-v2000.zip als Datei firmware.bin mit einer Größe von ungefähr 1,2 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ü-Option 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.

• 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: ÄÖÜäöüéß°€.
DatenausgabeDie 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
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.

Im April 2025 habe ich eine kleinere Version dieser Uhr als Matrixuhr-Mini veröffentlicht. Diese hat viele Funktionen der Matrixuhr-ESP32 übernommen, aber es gibt einen großen Unterschied: Wegen des kleineren Displays war hier keine Wechselanzeige sinnvoll und so wurde die Datenausgabe vollständig als Laufschrift realisiert. Das hat mich auf die Idee gebracht, die Matrixuhr-ESP32 ebenfalls mit einer Laufschrift-Anzeige auszustatten. Auch von Bastler-Kollegen kam der Wunsch, lange Namen bei den Geburtstagen anzeigen zu können und das geht nur mit einer Laufschrift.

Im Herbst 2025 habe ich das neue Projekt begonnen. Zunächst musste aber noch ein anderes Problem gelöst werden. Bisher verwendete ich Visual Studio Code zusammen mit PlatformIO für die Entwicklung meiner ESP32-Projekte. Hier gibt es leider den Nachteil, dass nur das veraltete ESP32-Arduino-Framework 2.0.0 verwendet wird. Dieses funktioniert zwar problemlos auf dem hier verwendeten ESP32-WROOM-32, unterstützt aber keine aktuellen ESP32-Varianten. Hier war also ein Wechsel notwendig und mit pioarduino als Ersatz für PlatformIO ist es jetzt möglich, das aktuelle ESP32-Arduino-Framework 3.3.4 zu verwenden. Auch alle für das Uhrenprojekt benötigten Bibliotheken wurden auf den aktuellen Stand gebracht. Das hat allerdings für einige Überraschungen gesorgt und die Software musste an vielen Stellen angepasst werden.

Aber jetzt hatte ich eine stabile und aktuelle Basis und konnte mit der Entwicklung der Laufschrift-Anzeige beginnen. Grundsätzlich gibt es in der Matrixuhr-ESP32 bereits eine Laufschrift-Funktion für die Anzeige von Textnachrichten. Diese konnte ich aber nicht verwenden, da sie nur mit einer einfachen Pixelgrafik arbeitet, die dann mit einer bestimmten Farbe ausgegeben wird. Die neue Laufschrift muss aber auch farbige Symbole darstellen können und dafür war etwas mehr Aufwand erforderlich. Für jedes Pixel muss jetzt ein Farbwert gespeichert werden und das braucht mehr Speicherplatz und auch zusätzliche Funktionen zum Erstellen und Ausgeben der Grafik. Aber der ESP32 hat genug Rechenleistung und RAM für diese Aufgabe. Leider wird der verfügbare Platz im Flashspeicher langsam knapp und viel Raum für Erweiterungen steht jetzt nicht mehr zur Verfügung.