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

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

Add a Comment

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