In this post, I will build a super cool word clock with Arduino and Neopixel LEDs. Such word clocks cost several hundred euros in the trade, but with a little skill, they are also fast self-built. I show you how it works. The electronic base is similar to that of my LED-Matrix.
UPDATE 2022: I built version 2.0 of the Word clock. This time with WiFi and some games to play on it (Pong, Tetris, Snake). Find my blog post about it here.
Material for the word clock
You need the following material for the word clock. Overall they cost less than 100 EURO.
- deep wooden picture frame 24x30cm (or similar size, amazon.de*)
- black adhesive foil (amazon.de*)
- NeoPixel LED Strip with 114x WS2812b LEDs (60LEDs/m) (amazon.de*)
- Arduino Nano V3.0 (amazon.de*)
- Real-Time-Clock Modul DS3231 (amazon.de*)
- power supply 5V/3A (amazon.de*)
- DC power jack 5.5×2.1 (amazon.de*)
- two sheets of black cardboard
- one sheet of white paper
- some cables, one 470 Ohm resistor, one 1000uF capacitor, one small DIP switch, one ON/OFF switch
Optionally you can upgrade the Word Clock with these components:
- DCF77 Receiver Module (amazon.de*)
- LDR light sensor module LM393 (amazon.de*)
- rocker switch as on/off switch (in the power supply lines) (amazon.de*)
- breadboard PCB (amazon.de*)
* 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.
Step-by-Step instructions
- The first step is to stick the adhesive foils onto the glass pane of the picture frame. Tip: Here it helps to spray the glass pane with detergent water first so that the bubbles can be easily pushed out of the foil afterward.
- The most complex task is cutting out the individual letters from the black adhesive foil. The best way to do this is to print out a template with the letters and fix it on the glass pane with adhesive tape. Now the letters can be cut out with a sharp cutter knife.

- To avoid reflections, it is recommended to paint the back panel with spray paint.

- Now you divide the LED strip into 10 strips of 11 LEDs each and glue them in a zigzag pattern on the back of the picture frame. It helps to mark the desired position on the back panel.

- To reduce stray light from the individual LEDs, we now create a grid structure from the black cardboard. To do this, we cut 2 cm wide strips from the cardboard and cut them 11 or 12 times up to the middle. Afterward, the strips can be put together as grids as shown in the picture below.

- Now, it goes to the electronics. We solder the Arduino Nano with the LED strips and the real-time clock (RTC) module, as shown in the image below. Whether you use a hole board or solder the cables directly doesn’t matter. As an add-on, you can add the radio clock receiver module DCF77 and/or the light sensor LM393 module for automatic brightness control, but this is optional. The RTC module with its battery always keeps the current time. However, without using the DCF77 radio receiver, you have to flash the Arduino again when changing the battery of the RTC module.


techniccontroller / think_wordclock
Arduino source code for the Wordclock on GitHub
- The next step is to flash the software to the Arduino. The complete source code can be found here on GitHub. It also describes which additional libraries need to be installed in the Arduino IDE. While connecting to a computer via USB, the small switch (DIP switch) must be turned off (to prevent damage to the Arduino due to the high current drawn by the LEDs).
- So that the letters shine as a whole and not the individual LEDs are visible, we now stick a simple sheet of white paper on the back of the glass plate. Then we fix the grid with hot glue on the glass plate.

- The last step is to insert the glass plate and back panel into the picture frame. You can also add an on/off switch in the picture frame.


You can extend the project as desired: As some of you might have noticed in the pictures above, a built-in light sensor allows automatic adjustment of the brightness of the LEDs to the environment. I placed the light sensor inside the first “K” and connected it to an analog input (A6) of the Arduino.
Have fun rebuilding it.
134 Comments
Mario · 19/02/2025 at 9:14
Hallöchen
Ich beabsichtige eine wordclock zu bauen und habe dabei diese webseite gefunden.
Da arduino für mich neuland ist und mein zu hause die hardware ist, habe ich diesen
code in arduino.ide eingefügt. Jedoch schreit es immer beim compilieren und ich
finde den fehler leider nicht. Die librarys habe ich alle hinzugefügt.
Dies sind die kommentare (fehlermeldungen)
c:\Users\Documents\Arduino\libraries\DCF77\DCF77.cpp: In static member function ‘static void DCF77::finalizeBuffer()’:
c:\Users\Documents\Arduino\libraries\DCF77\DCF77.cpp:160:21: error: ‘now’ was not declared in this scope
filledTimestamp = now();
^~~
c:\Users\Documents\Arduino\libraries\DCF77\DCF77.cpp:160:21: note: suggested alternative: ‘pow’
filledTimestamp = now();
^~~
pow
c:\Users\Documents\Arduino\libraries\DCF77\DCF77.cpp: In static member function ‘static bool DCF77::receivedTimeUpdate()’:
c:\Users\Documents\Arduino\libraries\DCF77\DCF77.cpp:189:46: error: ‘now’ was not declared in this scope
time_t processedTime = latestupdatedTime + (now() – processingTimestamp);
^~~
c:\Users\Documents\Arduino\libraries\DCF77\DCF77.cpp:189:46: note: suggested alternative: ‘pow’
time_t processedTime = latestupdatedTime + (now() – processingTimestamp);
^~~
pow
c:\Users\Documents\Arduino\libraries\DCF77\DCF77.cpp:197:20: error: ‘SECS_PER_MIN’ was not declared in this scope
if(difference < 2*SECS_PER_MIN) {
^~~~~~~~~~~~
c:\Users\Documents\Arduino\libraries\DCF77\DCF77.cpp:197:20: note: suggested alternative: 'WCHAR_MIN'
if(difference < 2*SECS_PER_MIN) {
^~~~~~~~~~~~
WCHAR_MIN
c:\Users\Documents\Arduino\libraries\DCF77\DCF77.cpp:209:25: error: 'SECS_PER_MIN' was not declared in this scope
if(shiftDifference < 2*SECS_PER_MIN) {
^~~~~~~~~~~~
c:\Users\Documents\Arduino\libraries\DCF77\DCF77.cpp:209:25: note: suggested alternative: 'WCHAR_MIN'
if(shiftDifference < 2*SECS_PER_MIN) {
^~~~~~~~~~~~
WCHAR_MIN
c:\Users\Documents\Arduino\libraries\DCF77\DCF77.cpp: In static member function 'static bool DCF77::processBuffer()':
c:\Users\Esther\Documents\Arduino\libraries\DCF77\DCF77.cpp:271:2: error: 'tmElements_t' was not declared in this scope
tmElements_t time;
^~~~~~~~~~~~
c:\Users\Documents\Arduino\libraries\DCF77\DCF77.cpp:284:12: error: request for member 'Second' in 'time', which is of non-class type 'time_t(time_t*) {aka long unsigned int(long unsigned int*)}'
Was mache ich da falsch?
Mario
Techniccontroller · 19/02/2025 at 21:32
Hallo Mario,
ich musste die DCF77 library manuell etwas anpassen. Bitte nutze daher die Libraries aus dem Ordner “libraries” aus meinem Repository und kopiere die in den libraries Ordner der Arduino IDE.
Dann müsste das kompilieren klappen.
Viele Grüße
Edgar
Mario · 21/02/2025 at 11:34
Hallo Edgar
Besten dank für die nachricht.
Im moment mache ich pfadfinder, wer sucht der findet……
In welcher ecke finde ich das geänderte library dcf77?
Besten dank
Mario
Techniccontroller · 21/02/2025 at 12:39
Hallo Mario,
meine Version der Library DCF77 befindet sich hier: https://github.com/techniccontroller/think_wordclock/tree/main/libraries/DCF77
Viele Grüße
Edgar
Mario · 21/02/2025 at 14:40
Hallo Edgar
Besten dank.
In der zwischenzeit binich fündig geworden und es funktionert mit dem
compilieren un übertragen. Rest folgt.
Melde mich, um das ergebniss mit zu teilen.
Bis bald und bis dahin besten dank.
Mario
Mario · 28/02/2025 at 16:18
Hallo Edgar
Ich bin weiter gekommen undes läuft fast alles nur das DCF fuktioniert beim Ardiuno nicht.
Das signal bzw. die daten erscheinen am Pin, jedoch bekomme ich die jnfo “no signal”
??????
Besten dank
Techniccontroller · 28/02/2025 at 19:36
Hallo Mario,
ja der DCF ist sehr tricky, um ihn richtig zum laufen zu kommen muss die Ausrichtung der Antenne gut passen.Es gibt verschiedene Anleitungen online wie es am besten passen soll, z.B. https://www.nebenuhrsteuerung.de/Faq.htm
Die Meldung “NO SIGNAL” bedeutet entweder, dass überhaupt kein signal angekommt, oder das Signal nicht brauchbar ist. Im Idealfall sollte der Signalpegel jede Sekunden wechseln, bei dir scheint der wechsel schneller zu gehen. Vielleicht probierst du erstmal die Antennenausrichtung zu ändern, oder zu prüfen ob etwas anderes zu den Stören führen könnte.
Ich selbst habe einiges an Zeit gebraucht den DCF halbwegs zuverlässig zum laufen zu bekommen.
Viele Grüße
Edgar