LED-Matrix-Uhr mit ESP32: Minecraft-Uhr mit Sonne und Mond
Eine LED-Matrix-Uhr aus 64 × 64 LEDs für den Schreibtisch: wie ich aus dem Projekt Clockwise eigene Zifferblätter mit Jahreszeiten und Wetter gebaut habe.
- Stack
- ESP32, HUB75, LED-Matrix, Clockwise, JSON
- Jahr
- 2026
Mein Arbeitszimmer sollte etwas aus Anime und Gaming bekommen, das es so nicht zu kaufen gibt. Die erste Idee waren FUT-Cards, die Spielerkarten aus FIFA Ultimate Team, mit eigenen Daten auf einem kleinen runden Display. Das Display war dafür viel zu klein. Geworden ist es eine LED-Matrix-Uhr: ein Feld aus 64 × 64 einzeln ansteuerbaren LEDs, auf dem Sonne und Mond wie in Minecraft durch den Tag wandern.
Das Minecraft-Motiv ist nur eines von mehreren Zifferblättern, die ich auf die Uhr laden kann. Hier sind vier davon: Minecraft, Stardew Valley, Fields of Mistria und Nyan Cat.
Was die Minecraft-Uhr auf dem Schreibtisch zeigt
Die Uhr steht neben meinem Schreibtisch und zeigt keine einzige Ziffer. Zu sehen ist eine Drehscheibe mit Sonne und Mond, die sich mit der Uhrzeit weiterdreht. Wie spät es ist, lese ich daran ab, wo die beiden gerade stehen.
Ich schalte sie morgens ein, danach läuft sie von allein. Der Reiz liegt darin, zwischendurch hinzusehen und festzustellen, dass sich wieder etwas bewegt hat. Manchmal erschreckt mich, wie weit die Sonne schon gewandert ist. Vor allem erinnert mich die Uhr an die Zeit, in der ich regelmäßig Minecraft gespielt habe: am Samstagmorgen angefangen, und auf einmal war Sonntagabend.
Helligkeit, Zeitzone und Sprache stelle ich im Browser ein. Die Uhr bringt dafür eine eigene Einstellungsseite mit, die im Heimnetz erreichbar ist.
Das Minecraft-Zifferblatt ist eines von mehreren, die ich gebaut habe. Eines im Stil von Stardew Valley zeigt Datum, Wochentag und Uhrzeit, dazu ein Symbol für die Jahreszeit und eines für Tag oder Nacht. Ein anderes sieht aus wie eine FUT-Card, mit Spielernummer, Initialen und Uhrzeit. Die Uhr kann außerdem Figuren zu jeder vollen Minute oder Stunde bewegen und das aktuelle Wetter als Sonne, Regen oder Schnee zeigen.
Von der Mario-Uhr zum eigenen Zifferblatt
Auf die runden LCD-Displays bin ich 2025 gestoßen, als ich bei AliExpress nach Bauteilen gesucht habe. Nach ein paar Tutorials auf YouTube wollte ich darauf nicht mehr nur FUT-Cards zeigen, sondern Inhalte aus jedem Spiel und jedem Anime. Für all das reichte die Fläche nicht.
Bei der Suche nach etwas Größerem habe ich die Mario-Uhr entdeckt: eine LED-Matrix, auf der Mario jedes Mal springt, wenn eine Minute vergangen ist. Pixelgrafik und Retro-Spiele mochte ich schon immer, ich komme aus der Zeit des Game Boy. Eine Spielfigur, die zugleich eine Uhr ist, wollte ich selbst bauen.
Dahinter steckt das Projekt Clockwise (öffnet in neuem Tab). Es liefert die Firmware, also das Programm für den ESP32, fertig zum Flashen. Flashen heißt, das Programm auf den Microcontroller zu übertragen. Mein erster Prototyp lief genau so: Mario-Uhr aufgespielt und ausprobiert.
Für eigene Zifferblätter gibt es clock-club (öffnet in neuem Tab). Dort wird ein Zifferblatt, im Projekt heißt es Clockface, nicht programmiert, sondern in einer JSON-Datei beschrieben. Das ist eine Textdatei mit fester Struktur. Ich habe eigene Sprites gezeichnet, also die kleinen Einzelbilder, aus denen Figuren und Animationen bestehen, und sie auf die Uhr gebracht.
Schnell stieß ich an Grenzen. Die Mario-Uhr ist in C++ geschrieben und kann deshalb mehr als ein beschriebenes Zifferblatt. Also habe ich einen Fork angelegt, eine eigene Kopie des Projekts, und sie mit Hilfe von KI ausgebaut:
- Sprites, die zu festen Zeiten erscheinen: jede Minute, jede Stunde oder je nach Jahreszeit
- ein Modus Jahreszeit, den das Zifferblatt im Stil von Stardew Valley für sein Symbol nutzt
- das aktuelle Wetter über die Schnittstelle von OpenWeather (öffnet in neuem Tab), angezeigt als Symbol
- korrigierte Fehler aus dem bestehenden Projekt
Danach kam die Idee zur Minecraft-Uhr. Sie war ein Sonderfall, weil hier keine Figur zu einem festen Zeitpunkt springt. Die Uhr muss für jede Uhrzeit berechnen, wie die Drehscheibe steht.
Bauteile und Kosten der LED-Matrix-Uhr
Die Preise sind die, die ich bezahlt habe. Fast alles kommt von AliExpress und in größeren Stückzahlen, als eine Uhr braucht.
| Bauteil | Bestellt | Preis |
|---|---|---|
| LED-Matrix mit HUB75-Anschluss, 64 × 64 LEDs, 192 × 192 mm | 1 | 12,22 € |
| ESP32 Wroom 32 | 5 Stück | ca. 18 € |
| Netzteil 5 V, 6 A, 30 W | 1 | 15 € |
| PTC-Sicherungen | 30 Stück | 1,45 € |
| Elektrolytkondensatoren 220 µF, 35 V | 10 Stück | 1,59 € |
| Schraubklemmen KF301 | 50 Stück | 2,37 € |
| Lochrasterplatinen, doppelseitig | Set mit 32 Stück | 5,14 € |
| Abstandshalter M3, sechskant | 1 Set | 2,99 € |
| Schwarze Plexiglasscheibe (Acrylglas XT), 3 mm stark, 192 × 192 mm | 1 | Teil einer Sammelbestellung |
Die Plexiglasscheibe habe ich passend zur LED-Matrix als Zuschnitt beim Acrylglas-Shop (öffnet in neuem Tab) bestellt, zusammen mit weiteren Zuschnitten, deshalb steht kein Einzelpreis in der Tabelle. Die übrigen Posten kommen zusammen auf 58,76 €. Der größte Teil der Sicherungen, Kondensatoren, Klemmen und Platinen liegt danach für das nächste Projekt in der Schublade.
Der ESP32 ist ein Microcontroller, ein kleiner Rechner auf einer Platine, der ein einzelnes Programm ausführt. HUB75 heißt der Anschluss, über den er die LED-Matrix ansteuert. Bei 192 mm Kantenlänge und 64 LEDs sitzt alle 3 mm eine LED. Ein Hinweis zu den ESP32 von AliExpress: Ihre Qualität ist deutlich schlechter als die von Boards aus anderen Quellen.
An Werkzeug habe ich Lötkolben und Lötzinn, eine Abisolierzange, einen Akkuschrauber und Spiralbohrer in verschiedenen Größen gebraucht.
Angefangen habe ich im Dezember 2025, der erste funktionierende Prototyp stand im Mai 2026. Insgesamt hat mich die Uhr ein halbes bis dreiviertel Jahr beschäftigt.
Aufbau: ESP32, Schutzschaltung und Rückwand aus Plexiglas
Der Aufbau ist überschaubar. Der ESP32 steuert die LED-Matrix, und beide hängen am selben Netzteil mit 5 V. Weil sie sich eine Stromquelle teilen, sitzen Sicherungen und ein Kondensator dazwischen. Sie schützen die Bauteile vor Stromspitzen und Schwankungen.
Alle Teile habe ich mit Draht auf einer Lochrasterplatine verlötet, einer Platine mit Lochraster für eigene Schaltungen. Über die Schraubklemmen bekommen ESP32 und LED-Matrix ihren Strom, und an ihnen ist auch das Netzteil angeschlossen. Die Platine sitzt direkt hinter der LED-Matrix.
Ein Gehäuse hat die Uhr nicht. An die LED-Matrix sind die Abstandshalter geschraubt, und mit 5 bis 7 cm Abstand folgt eine quadratische schwarze Plexiglasscheibe als Rückwand.
Software: Ein Zifferblatt als JSON-Datei
Ein Zifferblatt besteht aus Bildern und der Angabe, wo und wann sie erscheinen. Die Bilder stehen als Base64 in der Datei, also als lange Zeichenkette. Hier ist das Minecraft-Zifferblatt, gekürzt um die Bilddaten:
{
"name": "minecraft-clock-clockface-v1",
"version": 1,
"bgColor": 0,
"delay": 100,
"setup": [
{ "type": "image", "x": 0, "y": 0, "image": "iVBORw0KGgo…" },
{ "type": "image", "x": 8, "y": 8, "image": "iVBORw0KGgo…" }
],
"sprites": [
[
{ "image": "iVBORw0KGgo…" },
{ "image": "iVBORw0KGgo…" }
]
],
"loop": [],
"events": {
"timeFrames": [
{ "type": "timeFrame", "sprite": 0, "x": 17, "y": 14 }
]
}
}
Unter setup steht, was einmal beim Start gezeichnet wird: ein Hintergrund über die ganze Fläche von 64 × 64 Pixeln und darauf, mittig, ein zweites Bild mit 48 × 48 Pixeln. Unter sprites liegen die Einzelbilder der Drehscheibe. Es sind 64 Stück mit je 30 × 21 Pixeln, im Auszug stehen zwei davon.
Die eigentliche Uhr ist die Zeile unter timeFrames. Sie legt fest, dass an der Position x: 17, y: 14 immer das Einzelbild steht, das zur Uhrzeit passt. loop bleibt leer, weil sich sonst nichts bewegt.
Welches Einzelbild das ist, ergibt sich aus einer Division: Der Tag hat 24 Stunden, die Drehscheibe 64 Einzelbilder. Jedes steht also 22,5 Minuten, dann rückt die Scheibe ein Bild weiter.
Das Zifferblatt im Stil von Stardew Valley kommt ganz ohne Sprites aus. Es setzt sich aus Elementen zusammen, die selbst wissen, was sie zeigen:
{
"type": "seasonImage",
"x": 38,
"y": 19,
"images": {
"winter": "iVBORw0KGgo…",
"spring": "iVBORw0KGgo…",
"summer": "iVBORw0KGgo…",
"autumn": "iVBORw0KGgo…",
"default": "iVBORw0KGgo…"
}
},
{
"type": "datetime",
"x": 18,
"y": 51,
"content": "H:i"
}
seasonImage hält für jede Jahreszeit ein Bild mit 12 × 8 Pixeln bereit, die Uhr wählt das passende aus. Genauso arbeitet dayNightImage mit einem Bild für den Tag und einem für die Nacht. Die Elemente vom Typ datetime schreiben Text: H:i ergibt die Uhrzeit, d.m.Y das Datum und l den Wochentag.
Jedes Zifferblatt liegt als Header-Datei mit der Endung .h vor, zum Beispiel minecraft-clock-clockface-v1.h. Das JSON ist darin als Text eingebettet. Ein öffentliches Repository für meinen Fork gibt es bisher nicht.
Was schiefging: Speicher, Flackern und überlagerte Sprites
Gehakt hat es vor allem an der Software, und das über Monate. Es war ein zermürbender Prozess.
Das erste Display war zu klein. Die runden LCD-Displays sahen in den Tutorials gut aus. Für Karten mit Namen und Werten oder für ganze Szenen fehlte ihnen die Fläche. Erst dadurch bin ich bei der LED-Matrix gelandet.
Der ESP32 ist an großen Zifferblättern gescheitert. Je größer die Sprites als Base64 wurden, desto öfter brach die Übertragung auf die Uhr ab. Der kleine Speicher des ESP32 lief voll, oder die Verbindung hielt nicht durch. Manche Dateien konnte er gar nicht erst abrufen oder verarbeiten. Geholfen hat nur, sparsamer zu werden: Ich habe die Sprites je Zifferblatt deutlich reduziert und in kleinere Teile aufgeteilt.
Sprites und Uhrzeit haben sich überlagert. Bei Animationen, die zu einer festen Zeit starten, lagen Sprite und Uhr zeitweise übereinander. Ich musste die Reihenfolge der Elemente neu regeln. Die Uhrzeit wird jetzt immer als letztes Element gezeichnet, alle Sprites kommen davor.
Die Sprites haben geflackert. Ursache war, dass die Uhr das ganze Bild ständig neu auf die LED-Matrix geschrieben hat. Gelöst habe ich das, indem ich die Fläche in Bereiche zerlegt habe. Neu gezeichnet wird nur noch der Bereich, in dem sich etwas ändert.
Ursprünglich wollte ich einen eigenen Store für Zifferblätter veröffentlichen und das Repository öffnen. Mit den Problemen bei der Übertragung habe ich das zurückgestellt.
Stand heute und die nächste Anzeige
Die LED-Matrix-Uhr läuft jeden Tag, aktuell dauerhaft mit dem Minecraft-Zifferblatt. Die FUT-Card vom Anfang gibt es inzwischen auch, als Zifferblatt statt auf einem runden Display. Die Idee dahinter ist aufgegangen: Auf 64 × 64 LEDs passt fast alles, was sich als Pixelgrafik zeichnen lässt, und mit Uhrzeit, Jahreszeit und Wetter hat die Uhr drei Quellen, auf die ein Zifferblatt reagieren kann.
Als Nächstes überlege ich, eine Infotafel zu bauen, mit einer LED-Matrix mit 64 × 32 LEDs auf 256 × 128 mm. Sie soll das nächste Spiel des HSV oder unseres Sportvereins TSV Heidenau (öffnet in neuem Tab) zeigen, oder Grüße zu Feiertagen.
Eine LED-Matrix steckt auch in meiner Punktestandsanzeige für die Montagsliga, dort einfarbig und mit Tastern. Wie ich überhaupt dazu gekommen bin, Bauteile ohne Plan zu bestellen, steht im Artikel DIY-Projekt anfangen: Wie schwer kann das schon sein?.



