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 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 with the LED strips and the real-time clock (RTC) module. It doesn’t matter if you use a hole board or solder the cables directly. As an add-on, you can add the radio clock receiver module DCF77 and/or the light sensor module for automatic brightness control, but this is not absolutely necessary. The RTC module with its battery always keeps the current time. But without using the 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 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 connect it to an analogue input (A6) of the Arduino.

Have fun rebuilding it.

Share this post

96 Comments

Stefan · 03/07/2023 at 21:02

Moin Edgar,

am Wochenende bin ich auf dein großartiges Projekt aufmerksam geworden und habe heute bereits mit dem Löten begonnen. Dies leider ohne vorher nachzuschauen, ob der Arduino Source Code noch online ist. Auf Github konnte ich ihn leider nicht finden. Nur die zusätzlich benötigen Bibliotheken, die ich bereits installiert habe. Wäre dir deshalb sehr dankbar, wenn du ihn noch einmal hochladen könntest.

Viele Grüße
Stefan

    Techniccontroller · 04/07/2023 at 7:22

    Hallo Stefan,
    danke für deinen Kommentar.
    Der komplette Sourcecode ist nachwievor auf GitHub verfügbar.
    Der Arduino Sourcecode ist im Ordner “wordclock_german” in dem GitHub-Repo:
    https://github.com/techniccontroller/think_wordclock

    Viele Grüße
    Edgar

      Stefan · 04/07/2023 at 16:31

      Moin Edgar,

      danke für die schnelle Rückmeldung. Das Löten fällt mir leicht, im Programmieren bin ich aber noch ein absoluter Anfänger und brauche bestimmt noch einmal deine Hilfe.

      Viele Grüße
      Stefan

Manuel · 29/04/2023 at 11:18

Hallo Edgar,

auch von mir vielen Dank für diese tolle Seite und Deine Bemühungen Dein Wissen weiter zu geben. Mich hast Du begeistert und ich habe viel gelernt. Ich habe die Wortuhr bisher ohne DCF und LDR gebaut, weil mir die Teile fehlten und ich mögliche Fehlerquellen ausschließen wollte. Die Uhr läuft jetzt und ich habe 4 Fragen, die ich mir bisher nicht beantworten konnte:
1. Durch die Batterie im RTC, sollte die Uhrzeit doch auch “weiterlaufen”, wenn die Uhr mal ein paar Stunden nicht angeschlossen ist oder? Nach einer stromlosen Nacht ging sie aber 1 Stunde vor….gibt es dafür eine simple Erklärung?
2. Kann ich in dem Code eingeben, das die Uhr von z.B. 23 Uhr bis 5 Uhr einfach aus geht? (Energiekosten und so ;o))

Ich möchte jetzt auch das DCF und LDR anschließen und dazu sind meine zwei anderen Fragen:
3. Hast Du ein 3,3 V DCF angeschlossen? Es ist nämlich gar nicht so einfach eins für 5V zu bekommen oder dann über die Reduktion der Spannung gehen zu müssen. Ich habe jetzt einen Spannungsregler besorgt. Ist das nötig?

4. Ich habe ein LDR gekauft und in Deinem Programm gesehen, dass der analoge Ausgang auf PIN A6 soll. Mein LDR hat aber ein “Schaltsignalausgang” und einen “Analogen-Signalausgang” welcher ist der für A6 und was mache ich mit dem anderen? Leider taucht das LDR nicht in Deinem Schaltplan auf, deshalb vielleicht die etwas dumme Frage.

Ich bedanke mich bereits jetzt für Deine Unterstützung und kann gar nicht oft genug sagen, wie sehr ich dich für diese geile Seite feiere. Bitte mach weiter so!

    Techniccontroller · 29/04/2023 at 22:42

    Hallo Manuel,
    danke für deinen Kommentar und deine Fragen.

    1. Ja genau die RTC sollte dafür sorgen, dass die Uhrzeit weiterläuft auch wenn die Uhr stromlos ist. Ich hatte das Verhalten bei mir nicht gesehen, du könntest aber mal über den Seriellen Monitor prüfen ob es wirklich genau eine Stunde ist (und das Datum zumindest stimmt), sieht dann eher irgendwie nach einen Zeitzonen oder Sommerzeitproblem aus. Beim Flashen wird die Uhrzeit ja auf die Uhrzeit des Rechners gesetzt.

    2. Ja, das ist genau die Funktion “nightmode” und kann über folgende Konstanten im Code eingestellt werden. Die LED gehen in diesem Beispiel um 22Uhr aus und um 6Uhr wieder an.

    #define NIGHTMODE_START 22      // start hour of nightmode (22 <=> 22:00)
    #define NIGHTMODE_END 6         // end hour of nightmode (6 <=> 6:00)
    

    3. Jetzt wo du mich darauf hinweist kann ich es gar nicht sagen, ob ich eine 5V Variante des DCF verbaut habe, oder der Schaltplan oben falsch ist und ich VCC vom DCF an den 3.3V Pin des Arduino Nano angeschlossen habe. Das 3.3V Signal des DCF kann in der Regel auch vom Arduino mit einem 5V GPIO gelesen werden (nicht schön, aber sollte funktionieren auch ohne Logic-Level Shifter)

    4. Von dem LDR gibt es verschiedene Varianten, die manchmal etwas verwirrend sind. Da sich die Wortuhr-Helligkeit kontinuierlich an die Umgebung anpassen soll benötigt man hier einen LDR mit analogen Ausgang. Dein LDR hat sowohl einen digitalen (Schaltsignalausgang) als auch einen analogen Signalausgang. Letztere muss an den analogen Input-PIN A6 angeschlossen werden. Der Schaltsignalausgang kannst du einfach nicht verbinden / offen lassen. Ich werde gleich noch den Schaltplan mit dem LDR ergänzen.

    VG
    Edgar

Kerem · 07/03/2023 at 21:56

Hallo Edgar

Vielen Dank für das tolle Projekt! Ich habe die Uhr zusammen mit meinem Sohn nachgebaut mit meinen Kenntnissen als Mechatroniker. Beim Programmieren enden jedoch meine Fähigkeiten.
Ich habe alles wie beschrieben aufgebaut und alle Bibliotheken und Programm von Dir von Github benutzt. Mittels Neopixel Testprogramm konnte auch jede einzelne LED angesteuert werden.
Wenn ich die Uhr nun mit Deinem Code starte, dann initialisiert sie wie sie soll. Danach leuchten aber alle 114 LED permanent.
Gemäss seriellem Monitor stimmt aber die Uhrzeit, das DCF-Signal kommt an, und das angezeigte Grid passt auch.

Nun bin ich mit meinem Latein am Ende. Deshalb frage ich nun ob Du eine Idee hast, woran das liegen könnte?
ps. ich habe RBGW LEDs verbaut und dies an deinem Code auch angepasst, ansonsten keinerlei Änderungen vorgenommen.

Liebe Grüsse aus der Schweiz
Kerem

    Techniccontroller · 07/03/2023 at 22:50

    Hallo Kerem,

    danke für dein Kommentar.
    Spontan fällt mir keine Idee ein, was nicht stimmen könnte. Ich selbst habe noch nicht mit RGBW LEDs gearbeitet, aber eigentlich sollte die Adafruit Library das ordentlich machen (Deine Änderungen sollten sich auf Zeile 59 beschränken, oder? NEO_GRB -> NEO_RGBW).

    In welcher Farbe leuchten denn die LEDs? Kannst du die Farben durchschalten (kurz nacheinander EIN/AUS schalten)? Ändert sich dann etwas?

    VG
    Edgar

      Kerem · 08/03/2023 at 21:09

      Guten Abend Edgar

      Warum auch immer, als ich heute die Uhr nochmals angeschlossen habe, hat sie funktioniert. Nun leuchten die LEDs rot, im Serial Output wird auch ColorID=1 ausgegeben. Wie funktioniert der Farbwechsel? Ist es richtig, dass immer nur eine Farbe angezeigt wird und diese dann nach einer gewissen Zeit wechselt? Oder sollten die LEDs “regenbogenfarbig” sein?

      Vielen Dank für Deine schnelle Antwort gestern und einen schönen Abend noch!
      Lg, Kerem

        Techniccontroller · 08/03/2023 at 23:45

        Hallo Kerem,

        die Farbe ändert sich wenn die Worduhr innerhalb von 10 Sekunden ausgeschalten und wieder eingeschalten wird. Es gibt sieben Farbmodi, wobei Mode 0 (ColorID = 0) einen Regenbogen mit weißer Uhrzeit zeigt.

        Ansonsten bleibt die Farbe auch zwischen Neustarts konstant.

        VG
        Edgar

Yess · 24/02/2023 at 11:37

Hallo 🙂

Ich habe die Uhr ebenfalls gebaut und bin heilfroh, dass sie geht 😉

Jetzt aber zu meiner Frage:
Ich möchte die Wörter hinter einem dünnen Furnier verstecken, sodass man die Uhr an sich nicht sieht, erst wenn die Buchstaben leuchten. Leider sind nicht alle Farben dafür geeigent. Wo kann ich die Farbe ändern (z.B. nur grün, weiß) bzw die Helligkeit dauerhaft (bis auf den Nachtmodus) bei 100% haben?

Vielen Dank im Voraus

Viele Grüße
Yess

    Techniccontroller · 25/02/2023 at 12:21

    Hallo Yess,

    Danke für dein Kommentar.

    Ich habe die verschiedenen Farben in dem Array colors[] (Zeile 61) definiert.
    Falls du die Anzahl der Farben ändern möchtest kannst du dieses Array ändern. Aber bitte aufpassen, ich habe den Code auf GitHub gerade aktualisiert, damit diese Änderungen am colors Array keine Probleme im Rest des Codes hervorrufen. Also bitte nochmal deinen Code mit der aktuellsten Version auf GitHub abgleichen (wenn du in GitHub auf History klickst siehst du die Änderungen):

    https://github.com/techniccontroller/think_wordclock/commits/main/wordclock_german/wordclock_german.ino

    Um die Helligkeit immer auf 100% zu setzen muss du die Zeile 191

    matrix.setBrightness(brightness*2);
    

    durch

    matrix.setBrightness(255);
    

    ersetzen.

    VG
    Edgar

      Yess · 16/12/2023 at 15:10

      Hallo Edgar,

      vielen, vielen Dank für die ganzen Tipps.
      Jetzt war ja vor einer Weile Zeitumstellung und meine Uhr geht jetzt die Stunde vor. Ich habe nur ein RTC verbaut. Kann ich die Zeit irgendwie ändern, indem ich nur ein neues Programm hochlade? Bzw wenn ich irgendwo Zeit -1 eingebe?

      Wenn ich einfach das Programm neu hochlade, dann ändert sich leider nichts an der Zeit.

      Oder kann ich irgendwie das ganze RTC löchen und neu bespielen? Ich komme extrem schlecht an die verbauten Teile und möchte meine Uhr ungern jedes halbe Jahr aufmachen müssen, um die Batterie der RTC zu wechseln.

      Liebe Grüße
      Yess

        Techniccontroller · 17/12/2023 at 18:35

        Hallo Yess,
        du kannst mit einem kleinen Workaround die Uhr zwingen die Uhrzeit deines Computers im RTC zu speichern. Dazu musst du den Code in der Zeile 162 von

        if (rtc.lostPower() || DateTime(F(__DATE__), F(__TIME__)) > rtc.now()) {
        

        nach

        if(true){
        

        ändern und einmal flashen. Danach wieder die Änderungen rückgängig machen und nochmal auf den Arduino flashen. Dadurch sollte nun die Uhrzeit deines Computer auf der Uhr angezeigt werden.

        Gerne nochmal melden, wenn es nicht geklappt.

        Viele Grüße
        Edgar

          Yess · 18/12/2023 at 21:38

          Hallo Edgar,

          vielen Dank für deine schnelle Hilfe.
          Es klappt. Bin mega happy 🙂

          Yess · 20/12/2023 at 22:15

          Hallo Edgar,
          ich nehme es zurück. Es geht immer ne Zeit und dann bleibt die Uhr stehen….

          Hast du eine Idee, an was es liegen könnte? Habe es jetzt schon mehrfach versucht.

          danke und liebe Grüße

          Techniccontroller · 22/12/2023 at 16:33

          Hallo Yess,

          spontan kann ich dir nicht sagen voran das liegen kann.
          Könntest du mal die Ausgabe des Seriellen Monitors aufzeichnen (in Textdatei kopieren) wenn die Uhr hängen bleibt und mir per Mail senden (siehe Impressum).
          Dann kann ich mal genauer draufschauen, vielleicht fällt mir dann etwas auf.

          Viele Grüße
          Edgar

Mertl · 05/01/2023 at 11:56

Hallo Edgar,
vielen Dank für das tolle Projekt!
Ich werde es als 50x50cm Variante mit 30LED/m umsetzen, quasi als Mischung Deiner beiden Varianten.

Kann die Software auch die (süddeutsche) Variante “Dreiviertel” statt “Viertel vor”?
Das hier gezeigte Layout könnte es ja im Gegensatz zur 2.0 Version.
Hattest Du einen speziellen Grund das dort zu ändern?

Zum LDR:
Ist der Typ beliebig?
Verschaltung mit entsprechendem Vorwiderstand?

Grüße
Mertl

    Techniccontroller · 05/01/2023 at 21:23

    Hallo Mertl,
    Danke für dein Kommentar.
    Ja klar, man kann in diesem Layout hier auch “dreiviertel” statt “viertel vor” anzeigen lassen. Dazu müssen einfach folgenden Zeile (558-571) angepasst werden:
    von:

          //Viertel
          Serial.print("VIERTEL ");
          gridAddPixel(4,2);
          gridAddPixel(5,2);
          gridAddPixel(6,2);
          gridAddPixel(7,2);
          gridAddPixel(8,2);
          gridAddPixel(9,2);
          gridAddPixel(10,2);
          //Vor
          Serial.print("VOR ");
          gridAddPixel(0,3);
          gridAddPixel(1,3);
          gridAddPixel(2,3);
    

    nach:

          //dreiviertel
          Serial.print("DREIVIERTEL ");
          gridAddPixel(0,2);
          gridAddPixel(1,2);
          gridAddPixel(2,2);
          gridAddPixel(3,2);
          gridAddPixel(4,2);
          gridAddPixel(5,2);
          gridAddPixel(6,2);
          gridAddPixel(7,2);
          gridAddPixel(8,2);
          gridAddPixel(9,2);
          gridAddPixel(10,2);
    

    Ich hatte das Layout für die Wordclock 2.0 geändert um mein Name “Techniccontroller” im Layout unterbringen zu können, damit musste ich leider auf die Option des “Dreiviertel” verzichten. Natürlich kann man dieses Layout hier auch für Wordclock 2.0 verwenden und nur eine Zeile mit zufälligen Buchstaben hinzufügen (die 11.Zeile ist für ein paar Funktionen der V2.0 notwendig).

    LDR:
    Im Prinzip ist es egal welches LDR Module man verwendet. Wichtig ist nur das ein analoges (!) Signal zwischen 0-5V an den Arduino gegeben wird. Leider wechseln die Hersteller und Ausführungen der LDR Module regelmäßig, sodass ich dir kein konkretes nennen kann aber wenn man nach “LDR LM393 analog” sucht müsste man was passendes finden.

    VG
    Edgar

      Mertl · 07/01/2023 at 12:47

      Hallo,

      danke für den schnellen Support!

      Die Änderungen für “Viertel x+1” statt “Viertel nach x” hab ich dank des sehr übersichtlichen Codes schon umgesetzt. (Zeile 447 bis 461 entsprechend abändern und in Zeile 640 aus >=20 ein >=15 machen)
      Da hab ich glatt Lust bekommen meine Uralt Programmierkenntnisse aus COMAL Zeiten zu reaktivieren und den Code noch ein wenig zu erweitern.
      ZB eine Umschaltung der Uhrzeitanzeige per zusätzlichem Taster und später evtl noch eine Art Sekundenanzeige bzw dezente Hintergrundbeleuchtung indem ich eine zwölfte LED Reihe im rahmenlosen Aufbau kreisrund darum lege (eine LED pro 5 Minuten). Mal schauen, Ideen hab ich gerade genug…

      Viele Grüße
      Mertl

Add a Comment

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