Two years ago I already built a word clock with NeoPixel LEDs. You can find the article about it here. At that time I built the word clock only with an Arduino and queried the time via radio. But this time the plan is to make the clock bigger, prettier and with more features. The word clock with WiFi gets the time from an NTP server and can control some functions via an HTML webserver on the microcontroller (ESP8266). Here is a quick overview of all features before I get into the step-by-step instructions.

UPDATE 2024: Based on the code of this project I built another clock with ESP8266 and NeoPixel LEDs. I call it RingClock and you can find a blog post with step-by-step instructions to build it here.

Wordclock 2.0

Features of the clock:

  • has 6 modes (Clock, Digital Clock, SPIRAL animation, TETRIS, SNAKE, PONG)
  • receives time updates via a NTP server
  • automatic switches between summer and winter time
  • provides easy WIFI setup with WifiManager
  • has a HTML webserver interface for configuration and control
  • color of display is configurable
  • night mode is configurable (start and end time)
  • brightness of LEDs is adjustable
  • automatic mode change every 10 seconds (optional)
  • has a physical button to change mode or enable night mode without webserver
  • an automatic current limiting of LEDs protects the power supply

Languages:

I provide the source code and front plate layout for German, English and Italian. See detailed instructions in the FAQ section below.


Content

  1. Material for the Word Clock with WiFi
  2. Step-by-Step Instructions: The Hardware
  3. Look at the Heart: The Software
  4. Community Gallery

1. Material for the Word Clock with WiFi

You need the following material for building this clock:

  • wooden picture frame 50x50cm (about 2 cm deep),
  • NeoPixel-Strip with 125x WS2812b LEDs (30 LEDs/m) (amazon.de*)
  • ESP8266 NodeMCU V3 (amazon.de*),
  • USB power supply 5V/3A (amazon.de*),
  • cardboard 50x50cm,
  • white backing paper,
  • 470 Ohm resistor,
  • 1000uF capacitor,
  • push button (amazon.de*),
  • micro USB socket (amazon.de*),
  • micro USB cable (amazon.de*),
  • some cables

Additionally, some special tools are needed:

  • soldering iron
  • spray bottle
  • hot glue
  • cutter knife

* The links are affiliate links. The offers do not come from me, however, I receive a commission through the reference, if then a purchase takes place, but without you incurring additional costs.


2. Step-by-Step Instructions: The Hardware

I will describe the build process of the hardware as step-by-step instructions as this will give you the best overview of the project. The mechanical base is again a particularly deep picture frame with a 500×500 mm glass plate. The distinguishing feature of the clock is of course the front panel, which this time contains 121 letters. That means it has eleven lines instead of only ten, which offers several advantages. On the one hand, it allows me to display my name “Techniccontroller”, on the other hand, it allows me to display two letters on top of each other. More details about this topic are in the chapter Digital clock.


STEP 1: Drawing the front panel foil

I decided to have the foil for the front panel lasered/plotted instead of cutting out each letter individually from the foil with a knife, as I did with the first clock. To order the plotted foil, you need a vector graphic. This can be done best with the free program Inkscape. The plotted foil can then be ordered online, e.g., from here: https://www.printingpoint.de/ (product: Folienplots, einfarbig schwarz).

I have created a detailed How-To, in which I show how to draw the front plate with Inkscape:

You can also use my Inkscape template: Link to GitHub. The distance between the letters is 33.25 mm in both directions (horizontal and vertical) because I use a LED strip with 30 LEDs per meter.


STEP 2: Sticking the front panel foil on the glass plate

Sticking the foil onto the glass plate is a bit tricky. But with the following tips it worked well for me:

  • Clean the work surface thoroughly.
  • Clean the glass plate with glass cleaner.
  • Spray hands with a water-soap mixture (1L water + 1 spoon of dish soap).
  • Remove the protective film from the adhesive foil.
  • Wet the glass plate and the foil with the mixture of water and dish soap from a spray bottle.
  • Place the glass plate on the foil and using a squeegee with a felt edge, carefully brush all air bubbles from the center to the edge.
  • Turn the glass plate over and spray transfer the paper side of the adhesive film with the water-soap mixture.
  • Squeegee strongly and evenly from the inside out (5-10 minutes).
  • You can remove the transfer paper after a drying time of 10-12 hours. Be careful to remove the paper from the top left to the bottom right at a flat angle so as not to damage the letters E and F.
removing transfer paper
The direction of removing the transfer paper
foil on glass plate
Result of sticking the foil on the glass plate.

Detailed instructions for sticking with a few additional pictures can be found here (german):


STEP 3: Cut and build the light grid

The light grid prevents the individual LEDs from shining into other letters. In addition, it serves as a reflector, which ensures uniform illumination of the individual letters. I use a little stronger cardboard, which I cut with scissors. Specifically, I cut 25 strips with the following dimensions:

light grid strip
light grid strip

Then I put the strips together to form a grid structure and paint them with mirror paint. This helps to reflect the light from the LEDs better. Since the grid has bent a lot, I glued wooden rods on two sides to stiffen it.

When gluing the light grid to the back of the picture frame later, you may have to cut a few notches for the cables so that the light grid is flush with the back and prevents light leakage (see pictures below).


STEP 4: Mounting the electronic components

To make the LED matrix, I first divide the long LED strip into 11 strips of 11 LEDs. Then I glued them at a distance of 33mm on the back of the picture frame. I recommend drawing a grid of lines to place the LED strips correctly. As you can see in the pictures below, I spray painted the back with silver/mirror paint to improve the reflections later (You may notice, that in the first version I painted it black to avoid reflection. This time I try it with the mirror color to improve the uniform illumination of the individual letters).

As the twelfth row, I added four additional LEDs, which will later show the minutes on my clock. Very important for the placement is the direction of how the LED strips are arranged. For efficient wiring, a ZIC-ZAC arrangement as shown in the picture is the best.

ZIC-ZAC of LED strips

The wiring is not complicated only a bit complex. First I soldered the data line in the ZIC-ZAC pattern so that each DO pin is connected to the next DI pin. Then I soldered all GND and 5V contacts together.

The other electronic components are very manageable. Of course, we need the ESP8266 microcontroller (ESP8266 NodeMCU V3) as the brain of the whole thing, which already has a WLAN interface integrated. Besides that, I only added a 1000 uF capacitor, a 470 Ohm resistor, a push button, and a micro USB connector. The following schematic shows the complete wiring:

As you can see in the pictures below, I use a micro USB cable to connect the ESP8266 to the micro USB socket. This allows me to program the ESP8266 from outside via the USB socket.


STEP 5: Bring everything together

In the final step, I stick a sheet of white backing paper on the back of the glass plate. This results in the wanted diffuse illumination of the individual letters. I glued the light grid with hot glue on the backplate with the LEDs so that everything becomes a solid composition. Now the backplate only needs to be mounted in the picture frame and fastened with four nails.

Backplate with the mounted light grid

3. Look at the Heart: The Software

Quickstart

For those who want to get started directly with the code, you can find the complete source code on GitHub:

techniccontroller / wordclock_esp8266

ESP8266 source code for Wordclock 2.0 on GitHub

  1. Just clone the project into the sketch folder of the Arduino IDE,
  2. Rename the file example_secrets.h to secrets.h. You don’t need to change anything in the file if you want uses the normal WiFi setup with WiFiManager (see section “Remark about the WiFi setup” in the README.md).
  3. Install the additional libraries and flash it to the ESP8266 as usual.
  4. The implemented WiFiManager helps you to set up a WiFi connection with your home WiFi -> on the first startup it will create a WiFi access point named “WordclockAP”. Connect your phone to this access point and follow the steps which will be shown to you.
  5. After a successful WiFi setup, open the browser and enter the IP address of your ESP8266 to access the interface of the webserver.
  6. Here you can then upload all files located in the folder “data”. Please make sure all icons stay in the folder “icons” also on the webserver. The steps for uploading the files should be:
    • Open http://<ip-address>/fs.html in a browser
    • Upload fs.html
    • Upload style.css
    • Upload index.html
    • Create a new folder icons
    • Upload all icons into this new folder icons

The word clock is now ready. Navigate to http://<ipaddress>/ or http://wordclock.local/ to open the web server interface of the word clock and have fun with it!


Detailed Look

For all others, who want to know more about the software, I would like to explain the different functions in detail. I have rarely developed such a structured Arduino project and it’s worth inspecting the code :). The whole code is well documented.

SW structure of ESP8266 code

OWN LIBRARIES
NTPClientPlus

Handles all the NTP update stuff, like getting a new time update, converting it to the correct timezone, calculating summer- or wintertime, and splitting the time up in hours, minutes and seconds.


LEDMatrix

Handle all functions related to turning on or off any LED in the Matrix. Provides functions for drawing single pixels, numbers, or characters on the matrix.

It has a low-pass filter function implemented to create smooth transitions between different LED images on the Matrix. The algorithm for that is quite simple. The filtered (to be displayed) color value of a pixel will be calculated like this:

factor = [0...1]
filteredValue_R = currentValue_R + factor * (newValue_R - currentValue_R)
filteredValue_G = currentValue_G + factor * (newValue_G - currentValue_G)
filteredValue_B = currentValue_B + factor * (newValue_B - currentValue_B)

Another neat feature is the LED current limiting and automatic dimming function, which I have implemented in this class. Before writing the color values to the LED strip, the code estimates the total current which is needed to display the given pattern. If the estimated current is above the configurable current limit, it will automatically reduce the overall brightness to meet the total current limit. The code snippet is shown below:

// Calc estimated current (mA) for one pixel with the given color and brightness
uint16_t LEDMatrix::calcEstimatedLEDCurrent(uint32_t color){
  // extract rgb values
  uint8_t red = color >> 16 & 0xff;
  uint8_t green = color >> 8 & 0xff;
  uint8_t blue = color & 0xff;
  
  // Linear estimation: 20mA for full brightness per LED 
  // (calculation avoids float numbers)
  uint32_t estimatedCurrent = (20 * red) + (20 * green) + (20 * blue);
  estimatedCurrent /= 255;
  estimatedCurrent = (estimatedCurrent * brightness)/255;

  return estimatedCurrent;
}

// Draws the targetgrid to the ledmatrix
void LEDMatrix::drawOnMatrix(float factor){
  uint16_t totalCurrent = 0;
  // go over all leds in matrix
  for(int s = 0; s < WIDTH; s++){
    for(int z = 0; z < HEIGHT; z++){
      // inplement momentum as smooth transistion function
      uint32_t filteredColor = interpolateColor24bit(currentgrid[z][s], targetgrid[z][s], factor);
      (*neomatrix).drawPixel(s, z, color24to16bit(filteredColor)); 
      currentgrid[z][s] = filteredColor;
      totalCurrent += calcEstimatedLEDCurrent(filteredColor);
    } 
  }

  // minutes indicator leds
  for(int i = 0; i < 4; i++){
    uint32_t filteredColor = interpolateColor24bit(currentindicators[i], targetindicators[i], factor);
    (*neomatrix).drawPixel(WIDTH - (1+i), HEIGHT, color24to16bit(filteredColor));
    currentindicators[i] = filteredColor;
    totalCurrent += calcEstimatedLEDCurrent(filteredColor);
  }

  // Check if totalCurrent reaches CURRENTLIMIT -> if yes reduce brightness
  if(totalCurrent > currentLimit){
    uint8_t newBrightness = brightness * float(currentLimit)/float(totalCurrent);
    (*neomatrix).setBrightness(newBrightness);
  }
  (*neomatrix).show();
}

UDPLogger

As the ESP8266 is most of the time not connected to a computer, it would be convenient to still have some information about what the controller is currently doing. I created this library already for previous projects. With this library, you can easily send UDP multicast messages into the network and everyone in the network can receive these messages. I wrote a small python script (multicastUDP_receiver.py) that can receive and display the messages.

The output of the received logger messages.

Snake, Tetris, Pong

All these classes are structured similarly. They contain the algorithm for the games which can be played via controls from the webserver. So each class has some update function, which is called in every cycle to draw potentially new pixels on the matrix. Also, each class has one or more control functions which can be called when the user triggers some action from the web server interface (e. g. turn left, turn up, rotate,…).

Public methods of the game classes

OUTSOURCED CODE
animationfunctions.ino

In this file, I moved all functions, which are needed for the animation. So for example the SPIRAL animation and the animations for the random SNAKE or TETRIS game (if the clock is set to automatic state-changing mode, the different game states will show a random animation of their game). In the outsourced functions, I used as few as possible global variables, so if a variable needs to be available for the next execution of the function, I used static variables.


otafunctions.ino

Contains all the functions needed to set up ArduinoOTA updates. Is just the setupOTA() and handleOTA() function. Nothing fancy, just to get this standard code out of the main file.


wordclockfunctions.ino

This file contains some interesting functions. Most of the word clocks out there uses some kind of direct mapping from time values (hour and minute) to LED coordinates on the word clock. One disadvantage is that when you change the layout of the word clock (e. g. more rows, more columns, another language, …) you need to do the whole mapping again. I did this in my first version as well and had to deal with a lot of x and y coordinates.

This time I use a different approach, instead of doing a mapping from time to coordinates, I split this task up into two parts. Firstly, a mapping from time value to words (or sentence) and secondly a mapping from words (or sentence) to coordinates. The first mapping is still a little bit of work, but instead of dealing with coordinates, you can easily write down the strings that correspond to the specific time value. In the following picture, you can see a short comparison of the code amount of both approaches.

Left: the original mapping function of my first word clock, right: the new approach

What about the second mapping? The great thing about the seconds mapping is that we can implement it completely generic. This means if we have a string representation of the whole word clock, we can easily fit a given sentence in it and so automatically identify which LEDs need to be switched on. An example is shown in the figure below.


LittleFS.ino

This file is an unchanged takeover from https://fipsok.de/Esp8266-Webserver/esp8266. It provides a very nice file manager for the easier upload of files to ESP8266.

FAQ – Customization

What do I have to change if I use a different layout or a different language?

The Wordclock is available in GermanEnglish, and Italian language. By default the language is German. To use the English or Italian language please replace the file wordclockfunctions.ino with wordclockfunctions.ino_english or wordclockfunctions.ino_italian. The code compiles only with one file named wordclockfunctions.ino. So please rename the file you want to use to wordclockfunctions.ino and replace the existing file.

To use a custom layout, you have to do the following:

• in the wordclockfunctions.ino change the variable clockStringGerman according to your layout.

• in the wordclockfunctions.ino change the function timeToString() so that your wished sentence (e. g. “IT IS ONE OCLOCK”) is created based on the given hours and minutes value.

What do I have to change if I use only 10 rows instead of 11?

You have to do the following (But keep in mind that due to the letter size, the digital clock mode does not look good with only 10 rows):

• in ledmatix.h, tetris.h and wordclock_esp8266.ino change the line

#define HEIGHT 11

to

#define HEIGHT 10

• in pong.h and snake.h change the line

#define Y_MAX 11

to

#define Y_MAX 10

• in the wordclockfunctions.ino change the variable clockStringGerman according to your layout.

• in ledmatrix.cpp change the line

(*neomatrix).drawPixel(WIDTH - (1+i), HEIGHT, color24to16bit(filteredColor));

to

(*neomatrix).drawPixel(i,  HEIGHT, color24to16bit(filteredColor)); 

(this needs to be changed, as the minute indication LEDs are now at the beginning of the last row instead of the end).

Can I make a smaller version of the word clock?

Yes! A simple way to reduce the size of the clock is to use an LED strip with 60 LEDs per meter instead of the standard 30 LEDs per meter. This modification will roughly halve the clock’s dimensions to about 20×20 cm, making it compact enough to fit into a smaller picture frame, like the one suggested by Hajo in the comments (Accent Holzrahmen Aura, 20 x 20 cm, Prod. Nr. 24789549, www.bauhaus.info). Additionally, Hajo has shared a helpful sketch of the front plate and an STL file that you can use to 3D print the grid for this version of the clock:

I left the outer line of the SVG file larger than 20×20 cm. If you have the foil plotted, you can adjust it to the exact size of the frame yourself later.


Modes of the word clock

One can change the different modes by a short press on the physical push button in the picture frame or by selecting it in the web interface. In the web interface, there is also the option to enable an automatic mode change every 10 seconds. If this function is active the game modes TETRIS, SNAKE and PONG will just play an animation without user interaction.

I additionally implemented a night mode that turns off all LEDs. The clock enters night mode at a specific time, which can be configured in the settings menu of the web interface. The night mode can also be activated at any time directly via the web interface or a long press on the physical push button.


Word clock

Standard mode which is active after startup is of course the normal word clock mode, where the clock displays the time as text.


Digital clock

The second mode also displays the time, but as digits drawn on the LED matrix. This is only possible because of the 11th row so that I can construct two lines of 5 row high digits with one empty line in between.


SPIRAL animation

In this mode, the clock displays a spiral animation with changing colors.


TETRIS game

Tetris is one of three game modes, which can be controlled via the web interface. I have not written the core game code of those three games completely myself. Instead, I used some code parts from here as a basis and integrated them into my object-oriented software. The code for the random animation of Tetris and Snake is a takeover from my previous LED-Matrix project.


SNAKE game

Here you can control a snake to catch the randomly placed apple. Well, just the traditional Snake game, I don’t think I need to explain much more.


PONG game

For Pong, you need usually two players. But, I extended the code by a bot that can control just one or both paddles. So the user can control the right paddle via the web interface or let the bot take over the paddle movement in case of the animation mode.

Have fun rebuilding it! If you have any questions, please feel free to write a comment.

In the years since I first published this article, I’ve received lots of messages from people who rebuilt the word clock themselves. Below you’ll find a selection of photos you sent me—your own beautiful takes on the Wordclock. Thanks for sharing your builds!

Have you built one too? Feel free to send me a photo, and I add it to the gallery.

Share this post

322 Comments

Danny · 31/03/2026 at 9:35

Hallo Edgar.
Ich habe eine Wortuhr auf Basis deiner tollen Anleitung nachgebaut und schon viele Komplimente für diese Uhr von meinen Gästen erhalten. Viele Dank dafür.

Nun hatte ich letzten Samstag wiederum Gäste die etwas länger geblieben sind nach Mitternacht ist uns aufgefallen, dass die Uhr schon vor 3 Uhr Nachts auf Sommerzeit umgestellt hatte.

Ich habe am Sonntag etwas im Arduino Code rumgegraben und habe und denke gesehen zu haben, dass die Sommerzeit Umstellung nur auf das Datum geht und der Umschaltzeitpunkt (zB. im Frühjahr von 3 Uhr auf 2 Uhr) nicht berücksichtigt wird. Da ich aber nicht der Programmierexperte bin, bin ich mir jedoch nicht ganz sicher.
Wie siehst Du das?

Schöne Grüsse
Danny

    Techniccontroller · 04/04/2026 at 12:10

    Hallo Danny,

    vielen Dank für deinen Kommentar. Du hast Recht, ich habe die Sommerzeit-Berechnung nur basierend auf dem Datum gemacht und die Uhrzeit nicht berücksichtigt. Ich habe das nun in der neuen Version v1.1.6 des Codes angepasst.

    Viele Grüße
    Edgar

Jörg · 26/02/2026 at 16:29

Hallo Edgar,

du hast einen Branch “static_background_pattern” bereitgestellt.

Wenn man nun die Zeilen in den “main”, “hour_animation” oder “hour_animation_frame_light” manuell einfügt, hat man die Funktion, dass die entsprechenden Buchstaben dauerhaft leuchten.

Ist es möglich in dem Webserver Interface einen zusätzlichen Schalter zum Ein- und Auschalten der statischen Buchstaben zu integrieren?

Wenn man nun den Code (die zusätzlichen Programmzeilen) entsrechend erweitet für die Branches “main”, “hour_animation” oder “hour_animation_frame_light”, könnte man die Funktionen parallel nutzen und entsprechend einzeln unabhängig voneinander aus- oder einschalten.

Bei dem Nightmode ist natürlich alles dunkel.

Die Idee ist ungenutzte Buchstaben als abschaltbare Initialen zu benutzen.

Danke Dir im Voraus.

Beste Grüße
Jörg

    Techniccontroller · 28/02/2026 at 18:50

    Hallo Jörg,

    ja, so ein Schalter im Webinterface für das Background-Pattern ist praktisch und relativ leicht zu integrieren. Ich habe das jetzt mal auf dem Branch “static_background_pattern” gemacht. In diesem Commit siehst du die Änderungen: https://github.com/techniccontroller/wordclock_esp8266/commit/1acb54abe2138c7d3daa8ac790b6273b3e9348d4

    Man kann das theoretisch auch in anderen Branches einbauen, aber ich selbst würde erstmal die verschiedenen Feature-Branches getrennt lassen und nicht miteinander mischen. Falls du willst, kann ich aber einen neuen Branch mit einer Kombination erstellen.

    Vielen Grüße
    Edgar

      Jörg · 01/03/2026 at 10:08

      Hallo Edgar,

      das wäre natürlich super, wenn Du in den beiden Branches “hour_animation” und “hour_animation_frame_light” dieses Feature einbringen würdest.

      Welche Zeile in welcher Datei beinhaltet denn den Schalter im Webinterface? Dann könnte ich den Schalter einfach bei Nichtbedarf rauslöschen.

      Allerdings baue ich nur noch personalisierte Wordclocks mit “hour_animation” und das wäre dann ein zusätzliches nettes Gimmick, wenn man seine Initialen ein- und auschalten könnte.

      Geht aus der Beschreibung hervor welche Zeilen in welchen Dateien geändert werden müssen?

      Danke im Voraus und einen schönen Sonntag.

      Viele Grüße
      Jörg

Jörg · 08/02/2026 at 11:58

Hallo Edgar,
ich hoffe, dass es Dir gut geht.
Eine kurze Frage. Du hast damals den Branch hour_animation und hour_animation_frame_light für mich erstellt.
Ich werde jetzt die mittlerweile elfte Uhr für einen Freund bauen. Sind diese Branches noch aktuell mit all den nachträglichen Verbesserungen wie zum Beispiel “Die Verbesserung nach Unterbrechung des WLANs, dass die Uhr sich wieder selbst aktualisiert” und die danach gekommen sind.

Danke im Voraus.
Beste Grüße Jörg

    Techniccontroller · 08/02/2026 at 21:01

    Hallo Jörg,

    danke für deinen Kommentar. Ich habe im letzten halben Jahr auf dem Main Branch keine großen Änderungen vorgenommen. Die wichtigen Verbesserungen, die du auch schon erwähnt hast, sind in hour_animation und hour_animation_frame_light bereits enthalten.

    Ich habe allerdings gerade noch die kleinen Änderungen vom Main-Branch in deine Branches eingefügt, jetzt sind sie vollständig aktuell mit dem Main-Branch.

    Viele Grüße
    Edgar

Thomas · 01/02/2026 at 11:41

Hallöchen mal wieder nach langer Zeit. Beim Lesen des vorherigen Post‘s ist mir nochmal eine Frage in den Sinn gekommen, die ich schon seit Monaten mal klären wollte. Besteht die Möglichkeit (und wenn wie) gezielt definierte LED‘s „tot“ zu stellen. Ich hatte bereits eine Wortuhr mal gebaut, bei der ich nicht geschnitten habe, sondern die LED’s um die Ecken geknickt habe. Einfach umzusetzen war, dass die Wörter weiterhin korrekt angezeigt wurden. Ich hatte hier einfach die unbenutzten LED‘s in den Ecken mit „XXX“ definiert. Dumm ist allerdings, dass man dann Tetris etc. nicht mehr spielen kann. Die Eck-LED‘s sind ja nach wie vor im System vorhanden. Es wäre also prima, wenn sie in irgend einer Weise rausgeschmissen (deaktiviert) werden könnten.
Beste Grüße
Thomas
@Edgar was ist eigentlich aus deiner Bildergalerie der Uhren geworden? 🙂

    Techniccontroller · 01/02/2026 at 19:13

    Hallo Thomas,

    das mit den LEDs ‘tot’ stellen ist etwas tricky, weil ich die Adafruit_NeoMatrix im Code als Basis verwende. So wie ich dich verstehe, sind immer abwechselnd links und rechts 3 zusätzliche LEDs verbaut, welche nicht leuchten sollen. Da es mal links und mal rechts ist, kann man nicht einfach 3 zusätzliche Spalten hinzufügen.

    Falls es eine gerade Anzahl zusätzlicher LEDs (z.B. 4) wäre, könnte man diese virtuell auf zwei Zeilen aufteilen und dann links und rechts zwei zusätzliche Spalten definieren, man müsste dann nur am Anfang auch noch 2 zusätzliche LEDs nutzen. Das könnte mit relativ wenig Codeaufwand gemacht werden. Die flexiblere Alternative wäre als Basis im Code ein Adafruit_NeoPixel Objekt zu verwenden und die Klasse ledmatrix.cpp entsprechend anzupassen und deaktivierte LEDs zu überspringen, aber das ist etwas umfangreicher umzusetzen.

    PS: Danke für den Hinweis mit der Galerie, der Task ist auf meiner Todo nach unten gerutscht, ich habe Sie gerade oben im Post hinzugeführt, vielen Dank für deine Bilder.

    Viele Grüße
    Edgar

Vincent · 31/01/2026 at 12:28

Hallo Team,

als erstes muss ich sagen klasse Projekt, es ist wirklich toll was ihr hier alles macht.
Da ich selber ein Anfänger im Programmieren bin, habe ich zu dem ganzen Projekt noch einige Fragen:

1. Wie kann ich die LED-Matrix spiegeln? Ich habe bereits eine andere Wortuhr gebaut bevor ich diese Version entdeckt habe, würde aber gerne euren Code verwenden, da die zusätzlichen Funktionen und die Bedienoberfläche wirklich toll sind. Die Matrix ist aber von der Ansteuerungsreihenfolge spiegelverkehrt in X-Richtung, dementsprechend ist die Anzeige ebenfalls gespiegelt. Ich habe bereits versucht einfach die Werte in den einzelnen Programmen die die Breite der Matrix angeben zu negieren, allerdings lässt sich der Code aufgrund der negativen Werte nicht kompilieren.
Ich denke das die Anpassung des Codes dafür weniger aufwendig ist, als das komplette Neuverlöten der Matrix.

2. Die 4 LEDs zur Minutenanzeige scheinen aktuell in der normalen Wortanzeige nicht zu funktionieren, in der Anzeige der Digitaluhr sind sie aber aktiv (Verkabelung funktioniert also). Das kann aber auch evtl. mit der Steuerungsrichtung der Matrix zusammenhängen. Falls nicht, habt ihr hier eine Idee woran das liegen kann?
Da ich die LEDs aber gerne einzeln in jeweils eine Ecke meiner Uhr platzieren möchte, ist auch die Frage, wie ich diese LEDs nur in der normalen Wortuhr aktiv halten kann, in den anderen Funktionen aber deaktiviere?
Reicht es dafür, in den Subprogrammen (Pong, Tetris, Snake) die Anzahl der Reihen von 11 auf 10 herabzusetzen und wenn ja, wie kann ich die Digitalanzeige entsprechend anpassen da diese ja kein eigenes Programmfile hat?

3. Aktuell gibt es ja die Möglichkeit, die Beleuchtung einfarbig zu halten oder einen durchlaufenden Farbwechsel zu aktivieren. Kann man zusätzlich auch noch eine Funktion integrieren, bei der nur die einzelnen Wörter (aber nicht die einzelnen Buchstaben) unterschiedliche Farben haben?
Außerdem wär es auch toll, bei der Digitaluhr die einzelnen angezeigten Zahlen farblich voneinander abheben zu können.

4. Da ich von anderen Projekten noch DS3231 Echtzeituhr-Module übrig habe, würde ich gerne diese ebenfalls in der Uhr verbauen um so bei einem Neustart ohne Netzwerk trotzdem die richtige Uhrzeit anzeigen zu können. Könnt ihr mir hier helfen das Modul in den Code zu integrieren?

Vielen Dank im Voraus.

Liebe Grüße
Vincent

    Techniccontroller · 31/01/2026 at 19:59

    Hallo Vincent,

    vielen Dank für deinen Kommentar und deine Fragen:

    1. Das sollte tatsächlich einfach anzupassen sein: Suche in der Datei wordclock_esp8266.ino nach der Zeile “Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(….”. Dort kannst du definieren, wo dein LED-Streifen ZIGZAG-Muster startet, z.B. in der NEO_MATRIX_TOP + NEO_MATRIX_RIGHT Ecke. Da kannst du mal versuchen, die Werte entsprechend deiner Verkabelung anzupassen.

    2. Die vier LEDs der Minutenanzeigen sind in einer virtuellen letzten Zeile der Matrix untergebracht, sie leuchten auch nur im Wortuhr-Modus; in allen anderen Modi sind sie aus. Je nachdem, ob deine echte letzte Zeile links oder rechts endet, sind die vier LEDs eben am Ende oder am Anfang der Zeile. In meinem Originalcode stehen die LEDs am Ende. Falls die LEDs bei dir so nicht leuchten, dann kannst du mal die folgende Zeile in ledmatrix.cpp von

      (*neomatrix).drawPixel(WIDTH - (1+i), HEIGHT, color24to16bit(filteredColor)); 

    zu

     (*neomatrix).drawPixel(i,  HEIGHT, color24to16bit(filteredColor)); 

    ändern.

    3. Um einzelne Wörter in verschiedenen Farben darzustellen könntest du in wordclockfunctions.ino in der Funktion showStringOnClock() fest definierte Farben für das 1., 2. , 3…. Wort definieren und diese entsprechend nutzen. Am einfachsten kannst das machen in dem du diese Zeile nach “positionOfWord = …” einfügst.

      color = LEDMatrix::Wheel((uint16_t(positionOfWord) * 256 / (WIDTH*HEIGHT))); 

    Diese überschreibt immer die Farbe welche genutzt wird um die Uhrzeit an zuzeigen. Um das über das Webinterface einstellbar zu machen, braucht man ein paar mehr Änderungen, kann ich gerne machen, dazu aber nochmal direkt auf mich per mail zukommen (Mail steht im Impressum).
    Für die Zahlen im Digitaluhr-Modus kannst du die Farben relativ einfach in der Funktion showDigitalClock() zwischen den einzelnen Aufrufen von printNumber() wie gewünscht anpassen.

    4. Das ist etwas aufwändiger. Die Integration eines RTC-Moduls ist möglich; ich habe das in meiner ersten Version der Wortuhr (https://techniccontroller.com/word-clock-with-arduino-and-neopixel/) bereits gemacht. Der Code dort kann als Referenz dienen; ich würde es direkt in der Klasse NTPClientPlus mit einbauen, da ich dieses Objekt recht häufig in meinem Code nutze, um die Uhrzeit abzufragen. Die Änderungen würden sich somit zum großen Teil auf diese Klasse beschränken. Auch wenn hier mehr Support/Details nötig sind, gerne melden.

    Ich hoffe, ich konnte deine Fragen beantworten.

    Viele Grüße
    Edgar

Add a Comment

Your email address will not be published. Required fields are marked *