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:

* 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

  1. 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.
  2. 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.
Cut out letters from the adhesive foil
  1. To avoid reflections, it is recommended to paint the back panel with spray paint.
Painted backboard
  1. 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.
LED strip on the backboard
  1. 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.
The black cardboard grid structure
  1. 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.
Schematic of the word clock
Back panel with electronics
techniccontroller / think_wordclock

Arduino source code for the Wordclock on GitHub

  1. 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).
  2. 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.
Grid structure inside the picture frame
  1. 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.
The word clock at day
The word clock at night

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.

Share this post

137 Comments

Nicole · 23/10/2025 at 20:27

Hallo Zusammen,

ich bin durch Zufall auf diese Seite gekommen.
Finde die Uhr totat interessant.
Würde mir gerne eine Uhr mit DCF77 Modul und Lichtmodul nachbauen.

Leider habe ich keine Ahnung von dem was hier über die Programmierung geschrieben wird.
Löten und den Aufbau etc denke ich, ist kein Problem da der Schaltplan sehr übersichtlich ist.
Habe mir schon das ein oder andere hier aus dem Netz nachgebaut.
Dort gab es aber immer einen fertigen Hex File.

Wenn es einen fertigen Hex File gäbe, den ich mit z.B. NodeMCU PY-Flasher auf das Board flashen kann, wäre mir sehr viel weiter geholfen.

Wäre an dieser Stelle jemand vllt. so freundlich einen Hex File für mich zu erstellen?

Viele Grüße
Nicole

David · 22/08/2025 at 13:02

Hallo Edgar,
Erstmal danke dass sie solche tollen Projekte öffentlich zugänglich verfügbar machen.

Ich habe die Uhr soweit fertig gebaut.

Ich habe das Problem, dass der Arduino nach einem Neustart immer schreibt dass er No Signal hat.

Auch dauert die Signalprüfung maximal 4 Sekunden obwohl doch im Programm 10 Sekunden eingestellt sind. Leider holt er sich dann au

Einzig und allein kurz nachdem ich das Programm neu aufgespiele wartet er tatsächlich 10 Sekunden und dann zeigt er Signal 99 Good. Dann bekommt er auch nach kurzer Zeit Die korrekte Uhrzeit.

Jedoch nach trennen der USB Verbindung und Anschluss an externe Spannungsversorgung bekommt er leider nie die korrekte Uhrzeit.

Vielleicht haben Sie ja die zündende Idee.

Gruß
David

    Techniccontroller · 22/08/2025 at 16:33

    Hallo David,

    Vielen Dank für deinen Kommentar.
    Aus deiner Problembeschreibung kann ich mir vorstellen, dass auf der Signalleitung des DCF77 eine hochfrequente Störung anliegt, sobald du die Externe Stromversorgung verwendest. Dann dauert auch der Signalqualitätstest nicht so lange weil die hochfrequenten Störsignale die Messung abbricht.

    Zur Lösung des Problems würde ich einmal prüfen ob alle Komponenten mit dem gleichen GND verbunden sind (zum Beispiel mit einem Multimeter den Durchgang zwischen allen GND Verbindungen checken). Außerdem mal ein anderes Netzteil als Stromversorgung verwenden, vielleicht gibt es da ein Problem.

    Gerne nochmal melden, falls das Problem weiterhin auftritt.

    Viele Grüße
    Edgar

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

Add a Comment

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