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.

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


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


  1. Material for the word clock with WiFi
  2. Step-by-Step instructions: The hardware
  3. Look at the heart: The software

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) (*)
  • ESP8266 NodeMCU V3 (*),
  • USB power supply 5V/3A (*),
  • cardboard 50x50cm,
  • white backing paper,
  • 470 Ohm resistor,
  • 1000uF capacitor,
  • push button (*),
  • micro USB socket (*),
  • micro USB cable (*),
  • some cables

Additionally, some special tools are needed:

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

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 instead of cutting out each letter individually from the foil with a knife as I did with the first clock. To laser the foil you need a vector graphic of the foil. This can be done best with the free program Inkscape.

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:

schematic of wordclock 2.0
Schematic of Wordclock 2.0

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


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


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.


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);


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 ( 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


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.


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


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.


This file is an unchanged takeover from 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


#define HEIGHT 10

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

#define Y_MAX 11


#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));


(*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).

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

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

Share this post


Robert · 16/09/2023 at 16:57

Hello great Edgar, how are you?
Everything OK?
I’m making another wordclock for a relative, all I had to do was show it to someone and now everyone wants it (it makes me cry 🙂 )
I’m doing this with the name of the person who will have it (Carina), so that it always stays lit.
I did this, what I want to know is if it is possible to illuminate individual LEDs with another color, because it would be nice if the hours are for example blue and the name in yellow.
A sincere greeting

    Techniccontroller · 16/09/2023 at 23:49

    Hi Robert,
    thank you for your comment. I am doing great.

    Your requested change is very easy. If you want some letters to light up in a different color, you can add a few lines of code. I created a new branch on GitHub for that: static_led_background_pattern

    Here, you can see the changes. Just adjust the coordinates of the letters you want to light up and the color:…static_led_background_pattern

    Best regards

      Robert · 17/09/2023 at 9:09

      I made the change, the result is beautiful! Thank you very much Edgard, as always you are a very helpful person

Alex · 04/09/2023 at 13:12

Hallo Edgar,
Sehr gelungenes Projekt. Vielen Dank fürs Teilen!
Gibt es auch eine Möglichkeit einen RGBW Sripe zu nutzen? Wie z.B. einen SK6812 Stripe. So könnte man die Uhrzeit auch in reinem Weiß anzeigen lassen.
Schon im Voraus vielen Dank für Deine Bemühungen.
MFG Alex

    Techniccontroller · 04/09/2023 at 23:04

    Hallo Alex,
    danke für dein Kommentar. Ja, solange die LEDs auch mit der Adafruit-Library angesteuert werden können, dann sollte es funktionieren (ist bei den SK6812 meines Wissens nach möglich). Ich habe vor ein paar Wochen eine Version mit RGBW für eine ähnliche Anfrage erstellt. Ich hab jetzt mal einen separaten Branch auf GitHub erstellt, wo der aktuelle Softwarestand nur eben mit RGBW Leds implementiert ist:

    Der Code sollte mit RGBW LEDs funktionieren, allerdings kann ich es bei mir nicht testen und muss man noch die Befehle in der index.html anpassen, damit der WHITE-Kanal auch genutzt wird.

    Also beispielsweise folgendes

    onclick="sendCommand('./cmd?led=255-255-255-0')" class="buttonClass" style="background:rgb(255,255,255);" rel="nofollow ugc"


    onclick="sendCommand('./cmd?led=0-0-0-255')" class="buttonClass" style="background:rgb(255,255,255);" rel="nofollow ugc"


    Gerne Bescheid geben ob es funktioniert.

Alessandro · 10/07/2023 at 7:42

Hi Edgar, I wanted to ask you if the power supply was external (through a dedicated power supply for the LEDs) is it still necessary to install resistor and capacitor? Thank you and good day

Johnny B · 06/07/2023 at 14:53

Hi Edgar!

Ich melde mich nochmal mit einem kleinen Problem 🙁
Habe nun eine 2te Uhr gebaut, nachdem die erste super funktioniert (Lichtsensor muss ich noch etwas feintunen).
Bei dieser habe ich diesmal keine extra Sensoren verbaut.
Sonst ist alles ident zur ersten Uhr – leider passiert folgendes:
Ich stecke die Uhr an (über USB-C Breakout Board wie deine Abbildungen verbunden), sie bootet, LED Selbsttest fährt mit gelber Farbe alle LEDs von links oben nach unten ab, dann blinkt in grün eine Form auf, dann leuchten GANZ KURZ die richtigen Reihen für die aktuelle Uhrzeit auf und gehen sofort wieder aus.

Hast du eine Idee, was da nicht funktioniert? Habe alle Lötstellen nochmal überprüft, das passt alles. Einzig und allein den Kondensator habe ich nicht verbaut (bei der 1. aber auch nicht und die funktioniert super…)

Danke für deine Hilfe!

    Techniccontroller · 06/07/2023 at 15:19

    Hi Johnny,
    freut mich das du direkt eine zweite Uhr gebaut hast 🙂

    Ich denke der Fehler liegt in den nicht richtig initialisierten Uhrzeiten für den Nightmode.
    Das kannst du einfach lösen indem du die Uhrzeiten über die Weboberfläche der Uhr (http://wordclock.local/) noch korrekt setzt.
    Leider prüfe ich beim allerersten Start der Uhr überhaupt nicht ob die Werte im EEPROM für die Uhrzeit realistisch sind.
    Ich werde in Zukunft da nochmal einen Fix dafür entwickeln, aber aktuell muss man diesen Workaround machen.

    Viele Grüße

Alessandro · 03/07/2023 at 23:25

Hi, your project is really cool. I need to know some info for a couple of changes that I need to make. I would like to add leds that illuminate a name to make it personalized and therefore know how to add them so that they are always illuminated in sync with the same color as the time. Secondly, I wanted to know if there is the possibility of having white as a separate color because my strip is rgbw and it would be perfect if the white were from the dedicated chip. I am impractical in programming but if you are able to help me by paying you of course I would be grateful. Thanks Alessandro

robert · 03/06/2023 at 9:32

Hi Edgar, I did an update and it fixed everything…as always thanks a lot for your excellent work

robert · 01/06/2023 at 9:36

hi Edgar how are you?, The last watch I made, sometimes (I think due to Wi-Fi signal drops), I can’t access the app even though I have set a fixed IP. when I try to connect with wordclockap, the usual page doesn’t open but it asks me for the password as if it were a normal Wi-Fi…but I don’t know which password to put…what could it be?

    Techniccontroller · 02/06/2023 at 9:35

    Hello Robert,
    do you have the latest software on the clock?
    I did last month some modifications which lets the clock perform a automatic restart when it lost the Wifi-Connection for more than 5 minutes.

    There should be no password required for the wordclockap.
    I am not sure what the problem is, you mentioned that it happens sometimes, how does it usually heal, hard restart via power cycle?
    If you like you can open an issue on GitHub, and also attach some pictures/videos.


      Bene · 02/06/2023 at 10:02

      hello Edgar, can you repost the part of the code that restarts the clock here?

      I have also made some changes myself and would therefore only like to exchange the individual lines and not the entire code.

      robert · 02/06/2023 at 15:00

      I don’t quite understand how sometimes it fixes itself, I restart it many times and randomly it recognizes the ip it was connected to and everything settles down, but this is happening more and more often. Now I try to do the update you did. Thank you

      robert · 02/06/2023 at 15:01

      roberto · 02/06/2023 ore 15:00
      Non capisco bene come a volte si aggiusti da solo, lo riavvio tante volte e casualmente riconosce l’ip a cui era connesso e tutto si sistema, ma questo succede sempre più spesso. Ora provo a fare l’aggiornamento che hai fatto. Grazie

Norbert · 27/05/2023 at 15:42

Hallo Edgar
Vielen Dank für die Veröffentlichung dieses genialen Projekts. Perfekt dokumentiert. Ich konnte auch als Arduino Neuling einige Anpassungen machen (z.B. das Speichern der eingestellten Farbe im EEPROM).

Leider habe ich mich nicht an die Anleitung für die Anordnung der LED-Streifen gehalten. Ich habe alle 11 Streifen Datenflussmässig von links nach rechts angebracht und die Verdrahtung des Datensignals jeweils vom rechten Rand zum linken Rand der nächsten Reihe gemacht. Nun zeigt es mir in jeder zweiten Zeile die “Worte” nicht korrekt an.

Leider finde ich nicht heraus, wie ich diesen Baufehler mit der Software korrigieren kann. Hast Du mir einen Tip dazu?

Beste Grüsse aus der Schweiz

    Techniccontroller · 27/05/2023 at 22:09

    Hallo Norbert,
    danke für deinen Kommentar.
    Das ist kein Problem, du musst nur NEO_MATRIX_ZIGZAC in Zeile 153 in wordclock_esp8266.ino durch NEO_MATRIX_PROGRESSIVE austauschen:


    Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(WIDTH, HEIGHT+1, NEOPIXELPIN,
      NEO_GRB            + NEO_KHZ800);


    Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(WIDTH, HEIGHT+1, NEOPIXELPIN,
      NEO_GRB            + NEO_KHZ800);

    (Siehe auch:

    Zudem musst du vermutlich für die Minuten-LEDs noch die Zeile 203 in ledmatrix.cpp von

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


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



      Norbert Bürge · 30/05/2023 at 22:09

      Hallo Edgar

      Die von Dir beschriebenen Modifikationen haben den erwarteten Erfolg gebracht. Meine “swiss-german” WordClock funktioniert nun perfekt.

      Vielen Dank für Deinen Support.
      Beste Grüsse

Johnny B. · 26/05/2023 at 16:43

Hi Edgar!
Vielen Dank für dein tolles Projekt, und dass du es zur Verfügung stellst!
Ich habe aus geschmacklichen Gründen die 4 LEDs für die Minuten weg gelassen, leider komm ich nicht dahinter, ob ich im Code einfach Zeilen raus löschen kann, oder noch mehr dahinter steckt.

Falls du das Projekt noch weiter ausbauen möchtest, hier eine Idee:
(Ich habe schon einen Temperatur&Luftfeuchtigkeitssensor für ein anderes WortUhr-Projekt gekauft, welches nicht so einfach anzupassen ist wie deines)
Ein Modus, in dem jede Stunde im “Digitaluhr-Modus” für einige Sekunden die Außen- oder Innentemperatur+Luftfeuchtigkeit angezeigt wird (entweder über einen Sensor oder über APIs von Wetterwebsites).
LG, Johnny

    Techniccontroller · 26/05/2023 at 21:31

    Hallo Johnny,
    danke für dein Kommentar. Im Prinzip muss du nichts löschen, wenn du die LED nicht angeschlossen hast, laufen die Signale für die letzten vier LEDs einfach ins Leere. Wenn die Signale für die vier LEDs nicht gesendet werden sollen, dann kannst du die Zeilen 201 bis 206 in ledmatrix.cpp entfernen.

    Deine Idee werde ich als mögliches Featureupdate auf GitHub hinzufügen. Eventuell kann ich das in naher Zukunft integrieren. Wenn du schon einen Code dazu hast, gerne melden.

    Vielen Dank

      Johnny · 30/05/2023 at 23:35

      Ahoj Edgar,
      danke, dass du dir das genannte Feature tatsächlich ins Git mitgenommen hast. 🙂
      Ich versuche zur Zeit, einen BME280 und einen BH170 anzuschließen. Diese hängen ja beide an den zwei I²C Pins, weswegen ich noch herausfinden muss, ob ich ohne weiteres darauf zugreiffen kann, oder ich mich mit genauen Adressen herumschlagen muss.
      Bezüglich des otafunctions.ino habe ich noch eine Frage: werden hier nur solche Sachen wie Treiber aktuallisiert, oder muss ich Angst haben, dass Updates aus deinem Git meine geänderten Code-Zeilen überschreiben? 😀

      LG Johnny

        Techniccontroller · 31/05/2023 at 20:34

        Hallo Johnny,
        ich würde vorschlagen, die Sensoren zunächst separat in Betrieb zu nehmen. Wenn die beiden Sensoren zusammen funktionieren, kannst du den Code der Sensoren (setup und loop) in den Code der Wortuhr einfügen. Die loop() Funktion der Wortuhr läuft die meiste Zeit ganz normal, nur zu bestimmten Zeitpunkten wird die Uhrzeit abrufen/angezeigt und andere Funktionen ausgeführt. Du kannst den Code für die Sensoren also einfach an das Ende der loop() hinzufügen.

        Die Datei otafunctions.ino beinhaltet nur die normalen Arduino OTA Funktionen, damit man den Code aus der Arduino IDE auch über WLAN und nicht nur über das USB-Kabel auf den ESP8266 laden kann. Da wird nichts automatisch aktualisiert, oder ähnliches. Das funktioniert alles nur lokal in deinem Netzwerk.


          Johnny · 31/05/2023 at 21:13

          Hi Edgar,

          vielen lieben Dank für deine schnellen und ausführlichen Antworten!
          Hab beide Sensoren einbinden können, sie liefern auch Daten, laufen beide einwandfrei. Die Daten vom Lichtsensor werden (rein theoretisch) schon mit in die aktive Helligkeitsanpassung eingebunden.
          Den Code (ist zwar kein Hexenwerk) kann ich dir morgen ins Git posten. 🙂

          In meinem Wahn hab ich allerdings die LEDs nicht wie du oben links beginnend angebracht, sondern oben rechts, was dazu führt, dass alle Felder spiegelverkehrt angesprochen werden. Kennst du dafür eine schnelle, einfache Lösung?
          Außerdem scheint mein LED Streifen (WS2812 , über Pin D4 angeschlossen) nur auf die Befehle aus dem Webinterface zu reagieren, wenn ich die Stromzufuhr zum LED Streifen unterbreche und wieder aktiviere. Und hier und da sind manchmal einige LEDs in anderer Farbe als der Rest. Bzw. kann ich gar keine anderen Modi aktivieren, als Uhr. Wenn du mir nur einen Hinweis geben könntest, womit das zu Tun haben kann, wäre ich schon sehr dankbar!

          LG, Johnny

          Techniccontroller · 31/05/2023 at 22:09

          Hallo Johnny,
          Das Problem mit dem Beginn der LEDs ist einfach gefixt. Einfach bei der Definition der Adafruit_NeoMatrix (Zeile 151) den Wert NEO_MATRIX_LEFT durch NEO_MATRIX_RIGHT ersetzen und noch für die Minuten-LEDs die Zeile 203 in ledmatrix.cpp von

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


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


          Bei dem anderen Problem wäre wichtig zu wissen, ob das erst seit dem Hinzufügen der Sensoren auftritt. Es könnte nämlich sein, dass der Code für die Sensoren die sehr präzise (zeitlich) Ansteuerung der LEDs aus der Ruhe bringt (Stichwort: interrupts, kann ein sehr komplexes Problem sein).
          Wenn das auch mit meinen originalen Code auftritt würde ich die elektrische Schaltung auf versteckte Kapazitäten oder Spannungsabfälle durch schlechte Verbindungen prüfen.


Christoph · 16/05/2023 at 17:35

Hallo Edgar,
Super Projekt. Vielen Dank noch mal. Ich habe die Uhr schon nachgebaut, und diese funktioniert eigentlich ganz gut.
Das einzige was mich etwas stutzig macht, ist dass die Uhr immer wieder neu startet.
In der Regel geht es mal 3 Stunden gut, dann manchmal 1 stunde aber manchmal halt auch nur 20 Minuten.
Als ResetGrund gibt der Nodemcu dann immer “Hardware Watchdog” aus. Kannst du mir da irgendwie weiterhelfen, woran das liegen kann. Ich habe schon versucht die Leistung zu begrenzen, habe einen Elko zur Versorgung mit angeschlossen und auch den Widerstand.
Vielen Dank schon mal und bis dann.

    Techniccontroller · 16/05/2023 at 23:16

    Hallo Christoph,
    das ist tatsächlich seltsam, mir ist das selbst nicht aufgefallen.
    Da du dazu meinst, das es der Hardware Watchdog ist, wäre noch interessant zu wissen, was die letzten Ausgaben auf dem Seriellen Monitor sind bevor der Reset auftritt.
    Es könnte am Memory liegen. Ich werden in den nächsten Tagen mal schauen ob ich den Code noch etwas Memory-sparender abändern kann.

    Mit den folgenden Befehlen kannst du jetzt schonmal den verfügbaren Heap-Speicher ermitteln: ESP.getFreeHeap() / ESP.getHeapFragmentation() / ESP.getMaxFreeBlockSize()
    Es wäre sicher hilfreich das mal über Seriellen Monitor auszugeben zu lassen und zu beobachten (beispielsweise zusammen mit dem Heartbeat Signal).


      Habi · 17/05/2023 at 12:38

      Hallo Edgar,

      erst mal vielen Dank für das super Projekt.
      Ich habe die Uhr mit einer Spiegelfront nachgebaut. Diese hängt nun gut einen Monat bei mir im Büro und jeder der kommt ist begeistert.
      Leider habe ich auch das Problem, dass die Uhr unregelmäßig selbst einen Resett durchführt. Mal nach ein paar Stunden, mal nach mehreren Tagen. Bemerken tue ich es weil die Farbe der Anzeige wieder auf dem Startwert “gelb” ist.
      Die Schaltung habe ich allerdings nicht über einen Widerstand sondern über einen Pegelwandler aufgebaut.
      Für evtl. Tips wäre ich Dankbar.

      Grüße Habi

        Techniccontroller · 21/05/2023 at 21:21

        Hallo Habi,
        ich hab die letzten Wochen nochmal am Code gearbeitet. Der aktuelle Code auf GitHub fällt bei einem Neustart nicht wieder auf die Startfarbe zurück und hat auch noch ein paar weitere Verbesserungen dabei, welche einen stabileren Betrieb ermöglichen sollte.
        Ich würde mal probieren den aktualisierten Code auf die Uhr zu flashen und schauen ob das stabiler läuft.
        Wenn es immer noch Neustarts auftreten, gerne nochmal melden. Ich untersuche die Stabilität der Uhr aktuell parallel mittels Langzeittest, zur Zeit sind bei mir noch keine Auffälligkeiten aufgetreten.


    Christoph · 18/05/2023 at 21:39

    Hallo Edgar,
    ich hab dasa Heartbeatsignal jetzt noch mal angepasst und direkt bevor der Nodemcu neu startet sind folgende Daten zum Heap-Speicher ausgegeben worden:
    FreeHeap: 37.34 KB HeapFragmentation: 7 % MaxFreeBlockSize : 34.99 KB
    Vielleicht nützt das ja was.
    Vielen Dank schon mal im Voraus und noch einen schönen Tag.

Patrick · 15/05/2023 at 9:59

Hallo Edgar,

zunächst mal, ein sehr geiles Projekt, vielen Dank dafür.
Ich habe bereits so eine Uhr und würde aber gerne die Software mal erneuern da es doch immer wieder Probleme gibt.
Wie kann ich denn deine Software auf meine Frontplatte anpassen?
Muss das im Arduino Code gemacht werden oder kann das über die Weboberfläche erledigt werden?


    Techniccontroller · 15/05/2023 at 21:59

    Hallo Patrick,

    danke für dein Kommentar.
    Du musst ein paar Kleinigkeiten im Arduino-Code (wordclockfunction.ino) anpassen.
    Ich hab oben im Kapitel “FAQ – Customization” die nötigen Änderungen beschrieben.
    Vermutliche musst du nur den clockStringGerman ändern, weil die Sprache bei dir bereits Deutsch ist.


Matthias · 15/05/2023 at 7:37

Hallo Edgar,
vielen Dank für die schnelle Rückmeldung.
Mit den geänderten Einstellungen in der IDE (Tools -> Flashsize: 4MB (FS: 2MB)) funktioniert es.
Danke dafür und viele Grüße

Benedikt · 30/04/2023 at 22:13

Ich habe die Uhr auch erfolgreich nachgebaut . Allerdings mit einer 500x500x3mm großen Stahlplatte in die ich die Buchstaben gelasert habe.

Leider habe ich aber 2 Probleme mit der Software:
1-2 Mal am Tag hört die Uhr auf zu leuchten und nur noch die Minuten LEDs leuchten blau. Abhilfe schafft nur ein Neustart.
Zudem verstellt sich ab und zu die Uhrzeit um eine Stunde. Das kommt seit der Umstellung auf die Sommerzeit.

Ich habe den Glättungskondensator und den Widerstand nicht eingebaut. Ist das vielleicht das Problem?

Vielleicht kannst du mir ja weiterhelfen!
Viele Grüße und danke für das Tolle Projekt

    Techniccontroller · 30/04/2023 at 23:27

    Hallo Benedikt,
    ich kann dir nicht direkt sagen woran das liegen könnte. Es sollte nicht mit der Sommerzeit zusammenhängen, die hat damit eigentlich nichts zu tun, ich addiere einfach eine Stunde im Sommer.

    Ich sehe es eher kritisch dass der ESP vermutlich hinter der Stahlplatte sehr schlechten WLAN-Empfang hat.
    Auch der fehlende Kondensator könnte dazu führen, dass die Spannung beim Umschalten der LEDs kurz einbricht und somit das WLAN-Module des ESP stört, eventuell sogar einen Neustart triggert. Die blauen LEDs bedeuten, dass der ESP sich nach einem Neustart nicht mehr mit dem WLAN-Netzwerk verbinden kann und in den Konfigurationsmodus mit dem WifiManager wechselt.
    Ich würde empfehlen zumindest den Kondensator einzubauen.

    Vielleicht ist es auch sinnvoll mal die WLAN-Empfangsqualität zu messen.
    Das geht mit folgendem Befehl:



Chuck H · 23/04/2023 at 22:20

First of all…great project…I’m in the process of building and testing right now…everything is done except for getting the letters cut for the front display…

In testing, I have run into two hopefully minor issues that need to be resolved…
1) After the initial startup of the clock, the wifi was configured and the clock was restarted…the Serial monitor shows that it connected to my network with a good IP…the issue now is that I am unable to connect to the clock with my browser…the IP does not ping either…I’ve tried restarting the clock a couple of times and the logs indicate it connects to wifi and also gets to the NTP server for the time…just will not let me connect with the browser…any ideas??
2) The clock shows that it connects to the NTP server in the logs…the issue is that the time displayed in the logs as well as on the clock is showing as GMT and not my local time zone…is there a quick fix for this???

    Techniccontroller · 23/04/2023 at 23:18

    Hi Chuck,
    thank you for your comment.

    You can change the timezone in line 183 in wordclock_esp8266.ino. The “1” means +1 hour for CET timezone.

    NTPClientPlus ntp = NTPClientPlus(NTPUDP, "", 1, true);

    For the connection issue, I can not give you any advice.
    Are you entering the full address in the browser?
    e.g. or http://wordclock.local/fs.html

    I usually have no problems connecting the clock, but I had projects in the past where there were some issues with the connection to some specific routers. Maybe search online if some issues with your specific Wifi-Router and ESP8266 are known.


      Chuck H · 24/04/2023 at 15:33

      Hi Edgar…thanks for the quick reply…I will look at the time zone piece and get that corrected for my time zone…as far as the connection issue, I’ve been attempting to use the http://192.168…address in the browser…I’ve been just getting a timeout error…I thought maybe I had a issue with bad data saved so I wiped the flash and now I may have bricked the ESP8266…Today, I’ll be reflashing it to current firmware and re-adding the bootloader…hopefully that corrects the issue with the wifi access and I can add the web files to it

        Chuck H · 24/04/2023 at 17:20

        Re-flashing the ESP8266 fixed my issues with the web access…site has been set up and is working great…I adjusted the time zone offset and now time is good as well…thanks for the help…

        One update you might want to consider would be an option to reset the time zone offset from the web interface instead of having to make a code change and then upload the code again…seems like a fairly easy change and it would make the clock a little more user friendly for the future…just my thoughts…

        Thanks again for a really great project…

Matthias · 04/04/2023 at 12:12

Hallo Edgar,

ich habe schon länger eine ähnliche Uhr und wollte deine Software ausprobieren, leider funktioniert die Uhr bei mir nicht.

Habe ein anderes Layout, nur 10 Zeilen und alle Dateien Anhand deiner Anleitung angepasst.

Das Webinterface geht und reagiert auch laut Seriellem Monitor.

Nach einem Reset leuchten kurz nacheinander alle Leds , dann kurz darauf mehrere undefinierbar, und dann im Anschluss wird die korrekte Uhrzeit kurz angezeigt und dann gehen alle Leds aus.

Auch in den anderen Modis keine Anzeige.

Hast du evtl. eine Idee wo das Problem sein könnte?

Viele Grüße

    Techniccontroller · 05/04/2023 at 12:08

    Hallo Matthias,
    anhand deiner Beschreibung könnte es sein, dass die Uhr in den Nightmode wechselt. Es kann sein, dass der Arduino beim ersten Startup inkonsistente Daten aus dem EEPROM ließt. Versuche mal die Uhrzeiten für den Nightmode über das Webinterface neu zu schreiben (also über Datums-Picker auswählen und auf ‘Save’ klicken).

    Ich hoffe das hilft. Leider habe ich dafür noch keine richtige Lösung gefunden, wie die Uhr checken kann ob Unsinn im EEPROM steht.


Kerem · 02/04/2023 at 13:32

Hallo Techniccontroller
Genial was du hier geschaffen hast. Ich habe die Uhr nachgebaut und es funktioniert einwandfrei.
Nun möchte ich die Uhr an ein anderes WLAN anbinden. Wie komme ich mit der Uhr wieder in den Modus wo diese ein eigenes WLAN aufbaut um die Konfiguration zu starten?

    Techniccontroller · 02/04/2023 at 15:12

    Hi Kerem,
    danke für deinen Kommentar.
    Ich habe keine spezielle Resetmöglichkeit der Wifi-Konfiguration eingebaut.
    Daher ist es vermutlich am einfachsten die Wortuhr an einem Ort zu starten, wo sie keines der bekannten Wifi-Netzwerke erreicht.
    Dadurch wird automatisch wieder der eigene AccessPoint “WordclockAP” erstellt und man kann ein neues Netzwerk konfigurieren.

Lars · 21/03/2023 at 20:52

Hallo Edgar,
Vielen Dank für die Ausführliche Beschreibung.
Ich bin noch ganz neu in der Programmierwelt und wollte mal nachfragen ob du mir sagen kanns wo ich die Farben umprogramieren kann? Das Weiß finde ich noch sehr Blau.


    Techniccontroller · 21/03/2023 at 23:28

    Hallo Lars,
    danke für dein Kommentar.
    Ich vermute du meinst die Farben, welche über das Webinterface eingestellt werden können. Die Farbwerte werden direkt bei einem Klick auf einen der Kacheln gesendet.

    Die Farben können in Zeile 325 bis 336 in data/index.html geänderte werden. In jeder Zeile werden zwei Farbwerte (RGB) definiert.
    – der Farbwert hinter “/cmd?led=” definiert die Farbe der LEDs
    – der Farbwert hinter “background:rgb(” definiert die Farbe der Kachel im Webinterface.

    In deinen Fall könntest du in Zeile 331 die “./cmd?led=255-255-255” in “./cmd?led=255-255-200” ändern um den Blauanteil zu verringern.


      Lars · 22/03/2023 at 22:02

      Vielen Dank für die Rückmeldung aber leider reagiert weder das Led-Band noch die Kachel auf Änderungen. Auch bei einer Umstellung auf 255,255,0 bleibt diFarbe der Led sowie der Kachel blau weiss und wird nicht gelb.
      Muss ich dass sonst noch irgendwo validieren?

      Danke im voraus!!

        Techniccontroller · 22/03/2023 at 23:26

        Du kannst validieren ob der richtige Farbcode vom Webinterface an der Uhr ankommt indem du die Ausgaben auf dem seriellen Monitor beobachtest.
        Sobald auf eine Kachel gedrückt wird, sollte im seriellen Monitor der entsprechende Farbcode ausgegeben werden und die LEDs ihre Farbe ändern.

        Außerdem kannst du prüfen, welcher Befehl hinter jeder Kachel steckt, wenn du das Webinterface am Computer aufrufst.
        Wenn du mit der Maus über die Kachel fährst sollte der Befehle (z.B. unten links angezeigt werden.
        Der darin gezeigte Farbcode wird an die LEDs weitergegeben.


          Lars · 20/04/2023 at 22:01


          Vielen Vielen Dank für die Rückmeldung und bitte Entschuldige die weiter Belästigung aber ich bin noch Anfänger auf dem Gebiet und verstehe deine Antwort nicht ganz.
          Wie kann ich die Rückmeldung im Serial Monitor angezeigt bekommen? Ich nutze die Arduino ide 2.0.4 und wenn ich dort den Serial Monitor anmache kann ich doch nur Befehle senden und bekomme keine Rückmeldung oder?
          Auch mein Webinterface zeigt mir leider nichts an wenn ich mit der Maus drüber fahre. Woran könnte das liegen?

          vielen vielen Dank im Voraus.



          Techniccontroller · 20/04/2023 at 22:29

          Hallo Lars,
          Der Serielle Monitor zeigt (bei angeschlossenem ESP) auch einfach kontinuierlich Ausgaben der Uhr an. Falls bei dir nichts angezeigt wird, bitte prüfen ob die Baudrate auf 115200 steht (im dropdown).

          Aber zu deinem eigentliches Problem. Hast du die geänderte index.html auch auf den ESP wieder hochgeladen (unter http://fs.html, erst alte Datei löschen und dann neue Datei hochladen)? Ich habe es bei mir gerade erfolgreich ausprobiert.


          Lars · 20/04/2023 at 23:05

          Super Danke klappt jetzt alles!!



Serz · 20/03/2023 at 13:26

My compliments! Very nice clock. I’m going to try this too. My question to you is why haven’t you build in a lightsensor, like in your first version of this clock? In the night you want it to be less bright I guess. And in the winter it is sooner dark than in the summer. Or did you have a software solution for that? Is it possible to add a light sensor to the esp8266? If so, can you give me tips?

Kind regards,


    Techniccontroller · 20/03/2023 at 22:40

    Hello Serz,
    thank you for your comment. I removed the light sensor because of two reasons. First I did not see much benefit in having a light sensor. I personally never change the brightness of my Wordclock 2.0. Secondly, I simply did not have a light sensor when building the clock 🙂

    No, I dont have a software solution for adjusting the brightness automatically. I can control the brightness only via web interface.

    The ESP8266 NodeMCU has one analog input (A0: 0V to 3.3V), so you can add the light sensor of my first wordclock to this version (Connect it to pin A0).

    In the code you would then need to disable the setting of the brightness in lines 403 and 792 of wordclock_esp8266.ino:

    // Read brightness setting from EEPROM
    //  brightness = readIntEEPROM(ADR_BRIGHTNESS);
    //  logger.logString("Brightness: " + String(brightness));
    //  ledmatrix.setBrightness(brightness);
    // ledmatrix.setBrightness(brightness);

    and add the following code at the beginning of the loop() function:

      // get light value from light sensor
      int valLight = analogRead(A0);
      // calc led brightness from light value
      if (valLight < LOWER_LIGHT_THRSH){
        brightness = 100;
      else if (valLight > UPPER_LIGHT_THRSH){
        brightness = 20;
        brightness = 80-((valLight-LOWER_LIGHT_THRSH)*1.0/(UPPER_LIGHT_THRSH-LOWER_LIGHT_THRSH))*80 + 20;
      logger.logString("Light: " + String(valLight));
      logger.logString("Brightness: " + String(brightness));

    You must define and adjust the threshold values according to your light sensor values:

    #define UPPER_LIGHT_THRSH 930   // upper threshold for lightsensor (above this value brightness is always 20%)
    #define LOWER_LIGHT_THRSH 800   // lower threshold for lightsensor (below this value brightness is always 100%)

    Hope that helps you integrating a light sensor in version 2.0.


      Serz · 22/03/2023 at 11:04

      Thank you for your clear and quick answer Edgar! I’m so inspired. I’m going to order/buy the material and going to give it a try the couple of weeks (months?).Again, thanx for your response. So appreciated.



        Serz · 12/04/2023 at 14:47

        Hi Edgar,

        I built the clock (11×10). Was a very fun project. Even the lightsensor works, thanks to your advise.

        However, I have 1 small problem with the minute indicators. The minutes indicator lights from right to left, instead of left to right. So when it is past1 minute for example, the right led will light up and not the left led. I suspect this is because I have one row less than your model. I connected the LEDs zig-zag and started connecting at the same place as you. Can you give mee advise how to solve this problem?
        Thanks in advance .



          Techniccontroller · 12/04/2023 at 21:05

          Great to hear that it works with the light sensor.

          Changing the order in how the minute indicator light up is very easy just replace this line (203 in ledmatrix.cpp)

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


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

          This should do the job.


          Serz · 13/04/2023 at 10:59

          Thanx Edgar! Works great. 🙂

          Serz · 19/04/2023 at 20:02

          I’m sorry to bother you again, but can I ask one more question Edgar?

          The standard LED color is green when the clock starts up. I know I can change the color in de app. But is it also possible to change the standard color to white in the coding of the clock?
          So if the clock is shut of from the power connection and I turn it back on, I would like it to be standard in white, so I don’t have to start up the app. I really would appreciate your advise?


          Techniccontroller · 19/04/2023 at 20:17

          Hello Serz,

          I realized this as well. I just added this feature 30min ago on Github :).
          Please check the latest commit:

          The color will now be saved during a restart of the clock.


          Serz · 20/04/2023 at 9:49

          Thanx again Edgar!!!
          My compliments for your dedication and helpfulness! 🙂

Robert · 15/03/2023 at 16:27

Hi Edgar, I wanted to let you know that the clock works great, to adapt it in Italian I had to compile the code for all 24 hours, because otherwise the “E’ ” and the “L’ ” gave me problems but now everything is solved .
This morning I noticed a bug (at least I think it’s a bug) in the
Wordclockapp, I tried to increase the brightness and clicked on save, it automatically set the start of the night mode to 00:00 but leaving the end mode blank. Suddenly all the LEDs went off (I panicked 🙂 ), Luckily (after having reopened everything and reprogrammed the ESP 🙂 ) I realized that it was enough to set a time for the end
I wanted to say this in case anyone has the same problem

I also take the opportunity to ask you something,
I’m preparing another one which will have 13 rows and 13 columns, in order to also view the individual minutes (twenty-one, twenty-two, etc.) and eliminate the strip with the 4 LEDs, I’ve already compiled the code in wordclockfunctions.ino and it works, I just wanted to know if it’s enough that in the other files I change HIGHT 13 WIDTH 13 or do I have to intervene on something else?
Thank you very much as always and have a nice day

    Techniccontroller · 17/03/2023 at 20:37

    Hello Robert,
    great to hear. I did not experience your bug before, but this is probably related to a not properly initialized EEPROM. Setting both times for the nightmode should definitely fix it.

    For the 13×13 clock, it should be enough to change the definitions of HEIGHT/WIDTH and X_MAX/Y_MAX in the files mentioned in the FAQ above. You may consider using a larger power supply when you want to run all LED together simultaneously.


      Robert · 17/03/2023 at 22:50

      Thanks for the reply Edgar, I also added two lines and two 0’s (both on the height and on the width) on ledmatrix.h…am I wrong?
      “uint32_t targetgrid[HEIGHT][WIDTH] = {{0,0,0,0,0,0,0,0,0,0,0,0,0},”

        Techniccontroller · 17/03/2023 at 23:29

        Yes, this is correct. I forget mentioning that.

          Robert · 18/03/2023 at 0:03

          thank you so much 🙏

Bernd van Lier · 10/03/2023 at 16:56

Hallo Edgar,
kannst du mir einen Dienstleister empfehlen, der die Folie lasert? Ich finde auch keine Angabe, welche Folie es sein sollte.
Vielen Dank im Voraus!

Robert · 07/03/2023 at 22:46

Edgar I want to publicly thank you because you solved many problems for me and you had the patience to listen to me…Thank you very much

Andreas R · 03/03/2023 at 22:55

Hallo Edgar,

vielen Dank für die wahnsinns Anleitung! Plane gerade den Nachbau. Ist es möglich, statt der zweiten Micro-USB direkt einen 5V Anschluss als Stromversorgung auf die Platine zu legen? Würde gerne eine Klinkenbuchse für die Stromversorgung im Rahmen einbauen.
Danke schon mal für die Info!

    Techniccontroller · 03/03/2023 at 23:09

    Hallo Andreas,

    danke für deinen Kommentar.
    Klar, du kannst auch einen anderen 5V Stromanschluss verbauen. Wichtig ist nur, dass der Strom für die LEDs direkt von der Stromversorgung kommt und nicht über den NodeMCU fließt. Den NodeMCU kannst du dann auch direkt über den Pin “Vin” mit den 5V versorgen.


Robert · 27/02/2023 at 17:43

Edgard I humbly apologize but I’m going into a crisis, I state that I am very inexperienced in programming. I’m having this problem: I’m building the clock with 10 lines + the 4 minute leds, I changed the lines of code as you explain by setting the heights to 10, I load the code, I start the clock, the leds light up starting from the first strip above, but then ends in the last minute LED and only that LED stays on in white. From the Arduino monitor it gives me the correct time but no led lights up…I don’t know what to do anymore. I apologize again for wasting your time

    Techniccontroller · 27/02/2023 at 21:34

    Hello Robert, no problem, I sent you an email with some questions. I will try to help you.

Robert · 27/02/2023 at 10:23

Sorry Edgard…it’s still me 🙂 , now the problem is with WorldclockAP. I created the icons folder and uploaded all the icons, but from the app I don’t see them, as if they aren’t there, there is a corrupted image icon, but if I download from the app the icons are present… what can be? Thank you

    Robert · 27/02/2023 at 13:04

    Risolto…avevo sbagliato il nome della cartella 🙁

Robert · 26/02/2023 at 11:32

Forgive me Edgar, I have a problem, in the “secret_esemple.h” file I entered my credentials and renamed the file to “secret.h” , but when I go to compile the sketch it gives me the error “secrets.h: No such file or directories”.
Where am I wrong?

    Techniccontroller · 26/02/2023 at 12:04

    Hello Robert,

    did you renamed the “example_secrets.h” to “secrets.h” or “secret.h”? Please note the additional “s” in the filename. I think this is your issue.


      Robert · 26/02/2023 at 17:01

      Thanks for the quick reply Edgar, no apparently the location of the files was incorrect, now everything is fine. A thousand thanks

Robert · 14/02/2023 at 19:49

Hi Edgar, first of all congratulations for the project, I’m trying to replicate it exactly like yours because I want to make a gift to a relative of mine who lives in Germany.
I have a question, I don’t quite understand the connections to the led strips, in particular the yellow wire, which I see running from the ESP to connect to the last strip at the top.
Why doesn’t it enter from the first strip?.
Forgive my question, but I’m a beginner and I don’t want to get it wrong.
Thank you for your attention and congratulations again


    Techniccontroller · 14/02/2023 at 23:26

    Hello Robert,
    thank you for your comment.
    I am not sure if I understand your question correctly, I start with the data wire (yellow) on the first strip (that on at the top of the clock). The ESP sits on the bottom of the clock, so therefore I need to go with the yellow wire all the way up to the first row.

    I will shortly describe the LED wiring:
    All LEDs are connected in one long chain. So it is a design choice where to start. I started in the top left corner and wrote the program accordingly. I would recommend staying with this way of connecting the LEDs. So start in the top left corner and go zic-zac down to the last row. This zic-zac is only important for the data line (yellow cable), the power lines (red and blue cable) can be routed differently, there is no special direction required.

    Hope that answers your question.
    Feel free to write again, if you have another one.


      Robert · 15/02/2023 at 18:35

      Hi Edgar, yes that’s exactly what I wanted to know. Thank you, you are professional and also very kind too!


Christoph · 01/02/2023 at 23:28

Auch ich finde es sehr beeindruckend, was du da so geschafft hast. Ich nutze die Funktion mit fest eingestelltem WLAN in der secrets-Datei.
Ist es aber auch möglich die IP fest zuzuteilen?
Wenn ja, wie? Hier bin ich noch nicht so gut und hab es leider irgendwie nicht kapiert, wie ich das machen kann.
Vielen Dank schon mal und noch einen schönen Abend.

Tom · 30/12/2022 at 16:11

Hello Edgar, Thank you very much to share this wonderful project.
My clock are 10 height en 11 width. string started down left en go’s up and down from left to right.
I changed the height en width in Wordklock_esp8266 an ledmatrix.h.
when i reset or upload the program the leds start glow from down left, up and down to right up the the leds dimmed and start glowing on more locations then leds change to the time (i think) en the it dimmed.
if i press one of the 6 modes on webserver noting changed the leds still dimmed. do you know what i have to changed to see the leds glow? Thank you very much.

    Techniccontroller · 30/12/2022 at 20:07

    Hello Tom,
    Thank you for your comment.

    If you have a different order of the LED ZigZag, you need to change first the definition of the Adafruit_NeoMatrix (line 148 in wordclock_esp8266.ino) according to your led wiring:
    As I understand you have vertical lines of LEDs starting in the left bottom corner and ending at the right top corner. So your definition of the matrix should be like that:


    Due to your different LED setup, one more line in the code needs to be adjusted a little bit. I added for the four minutes indication LEDs one additional row to my matrix (see HEIGHT+1 in line 148). As you are using columns you need to add one additional col in the definition (remove the +1 from HEIGHT and add it to WIDTH). This additional column is not actually a physical column in your matrix but consists only of the four minutes indication LEDs. To consider this row to col swap, you need to change line 203 in ledmatrix.cpp from:

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


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

    I hope this explanation helps you to get the clock running.
    If I misunderstand your setup please let me know, e.g. send a photo of your setup via mail (


      Tom · 01/01/2023 at 21:12

      Hi Edgar,
      Thank you very much for the solution it works.
      The only problem I have now is the digital clock I miss the bottom line but I can live with that.
      I had my clock lasered on plywood. It looks good but glass also looks nice to me. There will probably be a 2nd clock.
      Keep up the good work and thanks again.

        Tom · 01/01/2023 at 22:10

        Hello Edgar, The lowest row are not only in the digital clock a problem but also in tetris.
        in tetris you can’t see row 11 so you have to remember the location where the holes are.
        I think you can better miss the top row instead of the bottom row.
        Is that a simple program change?
        Thank you in advance

        Best regards Tom

          Techniccontroller · 01/01/2023 at 22:38

          Hi Tom,
          you are right. With one row less the digital clock is not really possible anymore (I can not reduce the number size).

          For tetris I realized, that I have one more define statement in tetris.h :).
          I think when you change this HEIGHT definition from 11 to 10 (line 53 in tetris.h) then the tetris should work fine again.

          (same holds for pong.h and snake.h: change Y_MAX from 11 to 10)


          Tom · 02/01/2023 at 18:52

          Hello Edgar, Everything is working fine now. I like your way of programming, very nice. I put my string in Dutch en makes some changes in wordclockfunction. I changed the minutes backwards and everything works. Thank you very much.

          I have an idea for word-clock 3.0 (or 2.1). You can use the matrix as scrolling board.
          It would be nice if you can add birthdays and special dates to scroll text or animation on the date. Maybe with a countdown just before 12 o clock .

          Best regards an best wishes for 2023,

Simon · 17/12/2022 at 21:51

Hallo Edgar,
Vielen Dank für das beeindruckende Tutorial. Ich habe die Uhr mit kleinen Änderung nachgebaut um dem Original näher zu kommen. Die Minuten-LEDs sind, wie beim Original, in den Ecken platziert. Dadurch sitzen diese an Position 1,13,102,114 (von insgesamt 114) LEDs – Die Uhr ist 10 Reihen hoch, 11 Reihen breit. Ist es möglich im Code die Position der Minuten LEDs festzulegen?
Danke schonmal im Voraus!

Viele Grüße

    Techniccontroller · 17/12/2022 at 23:25

    Hallo Simon,

    danke für dein Kommentar.
    Puh, das ist etwas schwierig. Theoretisch ist es natürlich möglich den Code umzuschreiben um die Minuten-LEDs an deinen genannten Stellen einzubinden. Allerdings ist das seeehr aufwendig und der Code wird deutlich unübersichtlicher (würde ich nur empfehlen wenn du wirklich sehr fit im Programmieren bist).

    Stattdessen würde ich dir empfehlen die vier Minuten-LEDs wie bei mir ans Ende der LED-Reihe anzuhängen (mit jeweils längeren Kabeln dazwischen). Das mach das alles sehr viel einfachen. Glaub mir das kurze umlöten ist wesentlich schneller als, das umschreiben des Codes.

    Dass du eine Reihe weniger hast ist kein Problem. Du musst nur
    – die “#define HEIGHT 11” in der ledmatix.h und wordclock_esp8266.ino in “#define HEIGHT 10” ändern und
    – den “clockStringGerman” in der wordclockfunctions.ino entprechend deinem Layout anpassen.
    Dann sollte der Code mir deiner Uhr funktionieren.

    Ich hoffe ich konnte dir weiterhelfen. Falls du noch weitere Fragen hast, gerne nochmal melden.

      Simon · 17/12/2022 at 23:51

      Danke für die schnelle Antwort! Dann löte ich lieber die 4 LEDs um.
      Vg Simon

      Simon · 18/12/2022 at 21:55

      Hi Edgar,
      noch eine Frage:
      Ich habe die Minuten LEDs nun ans Ende gelötet. Jedoch beginnt meine “Matrix”, bedingt durch meine Konstruktion, unten rechts. Durch das Ändern auf NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT funktioniert das Grid, aber die oberste Zeile fehlt. Vermutlich wegen der extra Zeile für die Minuten LEDs, richtig? Siehst du eine Möglichkeit das zu ändern? Oder sollte ich besser den Fräser in die Hand nehmen und meine Konstruktion entsprechend anzupassen?
      Danke für eine kurze Info!

      Viele Grüße

        Techniccontroller · 18/12/2022 at 22:25

        Hallo Simon,
        das lässt sich relativ einfach im Code beheben, Man muss nur eine kleine Transformation der LED-Koordinaten vornehmen kurz bevor man sie an die LED-Matrix rausschreibt. Dies passiert nur an zwei Stellen im Code:
        – die Zeile “(*neomatrix).drawPixel(s, z, color24to16bit(filteredColor)); ” in ledmatrix.cpp muss in “(*neomatrix).drawPixel(s, z+1, color24to16bit(filteredColor)); ” geändert werden (das schiebt die Uhrdarstellung ein Zeile nach unten, da in der deiner ersten Zeile die Minuten-LEDs sind.)
        – die Zeile “(*neomatrix).drawPixel(WIDTH – (1+i), HEIGHT, color24to16bit(filteredColor));” in ledmatrix.cpp muss in “(*neomatrix).drawPixel(WIDTH – (1+i), 0, color24to16bit(filteredColor));” geändert werden.

        Dann sollte es mit deiner LED-Anordnung funktionieren. (Zumindest wenn meine Annahme richtig ist: die rechte untere LED ist die erste LED in der Reihe und die Minuten-LEDs sind ganz am Schluss oben rechts nach der 110en LED angeschlossen).

        Falls es nicht passt, müsstest du noch etwas weiter mit diesen beiden Zeilen rumprobieren. Das ist schwierig aus der Ferne einzuschätzen.


André Rinas · 12/12/2022 at 16:09

Hi Edgar. Thanks for All of your help. I finished my Wordclock and made a tutorials too.

I have changed some things
1. The whole Webinterface with settings and design
2. Added purist Mode, so that the String “Es ist” is only shown at full and half hour.You can enable and disable this in the web app.
3. The default LED Color to white
4. Changing 10 vor and 10 nach Halb to zwanzig nach and 20 vor.

Rainer · 11/12/2022 at 23:20

Hallo Edgar, erstmal vielen Dank für deine Mühe und Arbeit! Ich bin begeistert! Ich habe die Uhr mit deiner Anleitung nachgebaut und soweit hat alles geklappt. Nur wenn ich die html Seite aufmache und den Modus Wechsel oder die Farbe, dann führt der Controller das zwar aus, ich lande dann aber auf einer leeren Seite und muss den Zurück Button im Browser nutzen um wieder auf die Oberfläche zu kommen. Ist das Problem bekannt oder gibt es vllt eine Lösung?
Viele Grüße

    Techniccontroller · 12/12/2022 at 17:27

    Hallo Rainer,
    danke für deinen Kommentar. Dein beschriebenes Verhalten ist tatsächlich ein kleiner Fehler der hauptsächlich Nutzern mit iPhones auffällt (ich habe keine iPhone, deshalb ist es mit bei der Entwicklung nicht aufgefallen).

    Ich habe den Fehler in der index.html behoben, die Änderungen sind auf GitHub verfügbar:

    Hintergrund zu Fehler:
    Der HTML-Code des Webservers ist aufgrund der iterativen Entwicklung ein wenig inkonsistent 😊.
    Der alte Teil des Codes (Farb-/Moduswechsel) verwendet das href-Attribut, um einen Befehl an die Uhr zu senden. Der neuere Teil des Codes verwendet ein richtiges onclick-Event, um eine http-Anfrage über JavaScript zu stellen.
    Letztere ist die bessere Implementierung und sollte auf allen Geräten funktionieren.
    Ich habe im Code nun alle href=”cmd?…..” durch onclick=”sendCommand(‘./cmd?….’)” ersetzt.


Winner · 25/11/2022 at 18:10

Hi, Amazing WordClock, But can you add LDR to control the brightness?

    Techniccontroller · 28/11/2022 at 13:50

    Hi Winner,
    thank you for your comment. I decided to not include an LDR for controlling the brightness in this project, as I can control the brightness via the web interface if needed (I actually never change the brightness in practice so far).

    But of course, it is possible to add an LDR to the project. The NodeMCU ESP8266 has one(!) analog input pin (A0) with a voltage range between 0V and 3.3V. So there you can attach an LDR similar to my first Wordclock project (

    The changes in the code will then include the removal of the brightness control via webserver and the addition of the LDR control like in my first Wordclock project. You can implement this by yourself (copy pasting code snippets from Wordclock 1.0), but as these two control possibilities are not easy to combine I will not include it in the current project.

    I hope this answers your question.

AnRi · 11/11/2022 at 10:00

Hi Edgar. I have all the stuff I needed, but I am confused of the wiring. You say you solder the datalines in zic-zac. This is clear to me, but I don’t get why you solder all 5+ and gnd together? Isn’t that a short circuit if power and ground came from left and right? And where does you power start? From the buttom where the nodemcu is to the top? Because I only see the yellow cable going all the way on the side. Best regards and thank you for your help.

AnRi · 26/10/2022 at 8:40

Hey, can you tell me, where do you laser cut your foil and which picture frame you use? Is it an ikea ribba or somethink like this? And can you tell me, for what you use the capacitor? I am from germany too. Maybe you can answer me in german. Thanks!

    Techniccontroller · 26/10/2022 at 12:57

    I have ordered my foil here: (Product: Folienplots)

    Yes, I think I used an IKEA Ribba 50x50cm frame. (But it was 2nd hand, so I am not completely sure)

    The capacitor is recommended by the manufacturer of the NeoPixel LEDs to prevent “glitching” due to abrupt changes in brightness (find more information here)


      AnRi · 03/11/2022 at 16:16

      Hey thanks for your answer. Did you choose 2 colors and mirror your svg to glue it on the backside or do you just upload your svg to the page? Would be great to hear from you. BR André

        Techniccontroller · 03/11/2022 at 22:40

        Hi André,
        I uploaded a not mirrored pdf export of the foil drawing. The letters were white and the rest black. (See also the instructions above:

        And I chose a single color (black) in the ordering process.

          Matthias · 12/05/2023 at 22:55

          Hallo Edgar,
          tolles Projekt, welches ich gern nachbauen will.
          Ich habe mir zuerst einmal den esp8266 besorgt und leider ein Problem beim Laden der Daten. Im LittleFS wird mir als maximaler Speicherplatz nur 64kB angezeigt. Eigentlich sollten das 4MB sein oder (wird jedenfalls in den Daten bei az-delivery so angegeben). Hast Du eine Idee dazu?
          Vielen Dank, Matthias

          Techniccontroller · 13/05/2023 at 11:58

          Hallo Matthias,
          ich bin mir nicht sicher wo dir die 64kB angezeigt werden. Aber vielleicht liegt es daran, dass du in der Arduino IDE unter Tools->FlashSize eine Partitionierungsschema ohne Filesystem (FS) ausgewählt hast.
          Ich würde empfehlen mal kurz das folgenden Tutorial durchzugehen um zu checken, ob das LittleFS richtig funktioniert:


Leave a Reply

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