Introduction: Personalised Word Clock

Picture of Personalised Word Clock

Build a unique personalised gift that’s cool and reflects the character of the recipient.

What’s different about this Word Clock is that it is small enough to sit on a bedside desk, displays the recipients name and has personalised messages that appear at different times ie. Happy Birthday, Carpe Diem, Good Morning or whatever you choose.

Great for people of all ages who enjoy something a little unique.

Please note: This a variation of the traditional word clock design. Credit must be given to the guys who came up with the original design. In particular these two instructables provided inspiration for this project

Step 1: Gather Materials

Picture of Gather Materials

The most important component for this project is a good enclosure. Most department stores will have a variety of low cost clocks that would be suitable. Look for funky looking clocks that have a glass front with a depth of at least 4cm.

Ideally you are looking for something that is a "shadow box" style enclosure which has a front aperture of at least 13cm x 13cm. The enclosure also needs to be able to be easily dismantled and the internal clock removed.

The electronic components are included in the list above. I tried to minimise the number of the components so went for an Arduino Mega to drive the LED array directly. See the circuit section for further details.

Step 2: Build Arduino Shield

Picture of Build Arduino Shield

Arduino Shields are boards that can be plugged on top of the Arduino PCB extending its capabilities.

Building this simple shield enables you to connect the Arduino to the LED array, buttons, RTC and other components without having to solder directly to the board.

Cut the header pins to size and push into the Arduino board in the correct position as per the Circuit Diagram.

Then push the header pins into the shield to position the pins in the correct holes as per the picture above. Once you are sure they are in position solder the pins into the shield.

Remove the shield from the Arduino Board and Solder the 100 ohm resisters as per the circuit diagram and be careful to ensure that you have enough clearance when its plugged into the Arduino.

Step 3: Build the LED Display Board

Picture of Build the LED Display Board

1. Cardboard Cutout

The Word Clock display is made up of an array of 13x13 LEDs that are mounted on a cardboard cutout that fits snuggly into the front of the Clock Case. It is best to use cardboard because it wont melt when you are soldering wires to the LEDs and its easy to work with.

Use the dimensions of the aperture of the Clock case to trace out the required shape and cut out a piece of 3-4mm thick cardboard.

2. LED Grid

Use the enclosed template file to create 11cm x11cm grid to position the LEDs on the display board. Enclosed is a template that can be modified and printed out then glued onto the cardboard.

I used a free version of a draw program called LibreOffice Draw that you can download from here. LibreOffice The files can be modifed and resized using this tool. You can use the export feature to get different formats.

3. Mount the LEDs

In the example I used high intensity white surface mounted LEDs that I cut from a 3v LED strip. My advice is just use high intensity 3v Strip LEDs as they are easier to mount and don't require as much soldering.

(I recently did try 5mm LEDs and had a high LED failure rate and a lot of frustration with soldering so went back to strip LEDs)

The key point is that you join the Anode (+ve) side of each LED in each vertical column together on one side of the cardboard. Then pass the Cathode (-ve) through to the other side of the cardboard through a hole and join each row together on that side.

What you end up with is 13 Anode strips on the LED side vertically and 13 Cathode strips on the other side horizontally.

These are then connected to the Arduino Shield from the previous step as per the circuit diagram.

4. Test the LEDs

I recommend at this point testing all of the LEDs to ensure that there are no faulty devices/connections. To test use a 5v-9v DC power source and place a 2.2K ohm resister in line with the positive supply. Its important to do this to protect the LED from over current and burn out.

Connect the negative terminal to the LED Cathode and the positive terminal via the resister to the LED Anode of to test out. (Note ensure the Arduino Board is not connected when you do this). Make sure all the LEDs function and operate at the same brightness.

Step 4: Build the Arduino Circuit

Picture of Build the Arduino Circuit

1. Overview

I tried to avoid the complexity and time required to have to put LED drivers in the circuit so for this reason have used an Arduino Mega to drive a 13x13 array of LEDs. The Arduino circuit and code reads the RTC time and then draws the display by turning on one LED at a time. It does this by addressing each LED systematically using X,Y coordinates. The LEDs are protected by 100 Ohm resistors and being that they are only activated individually this means the current is limited.

2. Planning

Position the components and carefully plan the mounting of the Arduino PCB, the Shield, Buttons and RTC PCB.

Ensure that the Arduino Board can be accessed externally for programming purposes as well as the external power socket. Do this by ensuring the Arduino power socket and serial port are close to the case edge. Th Arduino PCB will also require a screw fixing so that the power can be plugged in an removed without the Arduino PCB moving around.

3. Connecting up the components

Use hookup wire to connect the Arduino PCB, the Shield, Button PCB and RTC PCB as per the diagram. Play particular attention to the wires and position of the components to ensure they are fit snuggly and securely in the case.

Step 5: Test the Unit

Picture of Test the Unit

Download Arduino IDE version 1.06 on your desktop machine
There are two additional libraries that need to be installed before setting the time and testing

(i) Arduino time library - see attached zip file

(ii) DS1307RTC library - see attached zip file

1. Set the time in the RTC

I used the following instructable code to set the current time on the RTC pcb.

2. Test the LED Array

Download the file"TechKiwi WC LED Array test.txt" and load to test the LED Array. When running each row of LEDs should light from top to bottom of the Clock.

3. Test Clock Functions without Dimmer and Time Set Buttons

Download the file"TechKiwi WC V5.7 TEST 2 code.txt" " and load to test the basic Word Clock functionality. When running the time should display however dimmer and time set functions do not work.

4. Final Test the Clock

Download the standard code provided on this page "TechKiwi WC Arduino Code.txt" and download into the Arduino. Once loaded the clock should be functioning with LEDs lit with the dimmer and time set functions working.

UPDATE: Ive included a new version of code that provides a nice animated effect, where the clock re-draws the text slowly every minute. Try it out and let me know what you think

Step 6: Build the Front Display

Picture of Build the Front Display

1. Build the Baffles

Measure the distance between the LED display board and the case glass. Cut 30 strips of A4 Black cardboard to the dimension of that distance.

2. Cut slots into the Baffles

Stack the strips of cardboard into a flat bundle and use tape to hold them together firmly.

Carefully mark the distance between each square on the top of the bundle. When marked correctly there should be 14 marks with the distance between them aligning to the LED panel.

Using a Band Saw or a Junior Hacksaw cut into the bundle 50% of the way through the mark as per the diagram.

3. Assemble the Baffles

Carefully dismantle the bundle and systematically assemble the Baffles as per the pictures. Trim the width of the baffles to fit into the box and ensure there is enough clearance on all sides. For the name TEXT cells remove the baffles as per the picture to ensure that they are not visible when illuminated behind the name TEXT.

4. Glue the Baffles onto tracing paper

The baffles are glued directly onto an A4 sheet of tracing paper over a stencil. Use five minute two part epoxy glue. Smear on baffle edges and hold in place over tracing paper until glue dries. This ensures the baffles are rigid and ensures that there is no light escaping between each cell when a LED lights.

5. Assemble the Word Clock Display

Using the template provided modify the text as required and get three black transparencies printed to the correct size. Get them printed in reverse so that when pushed against the glass the toner side is facing away from the glass. This gives a deeper black on the front display. I went to a local print shop and had this done in one of their colour laser printers which cost less than $4. My advice is to get about 9 copies in case you damage or make mistakes when cutting.

Cut the three sheets to fit the front panel of the box. trim the second and third layer progressively smaller so you can tape them down on top of each other once they are perfectly aligned.

Ensure you leave two sides open so that you can slide a square of tracing paper between the first and second layer of the transparencies.

Finally take the tracing paper that is glued to the baffles and trim to fit on top of the transparencies.

Carefully align the baffles on top of the transparencies tape into position making sure all letters have no obstructions or overlap. Hold up to the light to double check any issues and shake out any loose material.


Step 7: Final Testing

Picture of Final Testing

1. Set the custom birthday date

Use the Arduino tools to edit the provided code and change the date for the Birthday to align to the recipient or owner of the clock.

2. Test the clock transitions

You can use the tool mentioned previously to change the RTC date/time to check that all transitions occur.

Step 8: Adding an Alarm

Picture of Adding an Alarm

There have been a number of requests to add an Alarm to the word clock. I have produced a new circuit and new code to accommodate this if you would like to build this version. The Alarm Time is saved once set and will not be impacted by power cuts. i.e Clock will remember Alarm time set if power is restored. The Alarm is produced by a Piezo Speaker.

1. Additional Parts

The additional parts required are

  • 1 x Black Push Button for time/alarm set
  • 1 x 10k Ohm pullup resistor
  • 1 x Piezo Speaker

2. Time Set Operation

By pushing the Time Set Button once the clock will briefly display "TIME SET" mode and allow the increment and decrement of time using the plus and minus buttons. AM or PM is indicated in this mode by the word "MORNING" showing in this mode for AM.

To exit this mode,once the time is set, push the Time Set button once more.

3. Alarm Set Operation
Enter the Alarm Set Mode by pushing plus and minus buttons concurrently. This mode is indicated by "AL" text showing on the clock. To change the Alarm Time, use the plus and minus buttons.

In this mode if the Alarm is Armed when the word "SET" will show on the clock as well as the Alarm Time.

The Alarm can be Armed or Dis-armed in this mode. This is done by holding down the plus and minus buttons concurrently. When dis-armed the word "SET" will not show on the clock.

AM or PM is indicated in this mode by the word "MORNING" showing in this mode for AM.

To exit the Alarm Set Mode press the Black Set Button.

4. Disabling Alarm when it sounds
This can be done by pushing any of the three push buttons.


luigel (author)2017-02-21

I really want to make this clock, but I have a questions for you.
-Where I can buy the LED Strip used in this project?
-Where I can buy the Clock frame?
-For printing the Grid, I will use the cardboard for printing?
Thank you.

TechKiwiGadgets (author)luigel2017-02-22


You can get led strip through Amazon or a local provider. The Case was from a department store or dollar store. You have to shop around for this see the recommended dimensoins in instructions.

Cardboard baffles is what I used so you just need cardboard and a sharp knife. Hope this helps.

luigel (author)TechKiwiGadgets2017-02-22

Noted. Thank you so much for answering my questions. It will really help me in doing this word clock. Cheers.

Arduineer (author)2017-01-04

Which LEDs did you use dear, 5050?

Hi I use 3528 White LED Strip that is not waterproof

Thank you for the answer. To be honest i am really confused about how you can control/address this LEDs like they were WS2812b LEDs. İ dont see any transistor/mosfet. Or is it the Arduino Mega which make it possible to control all LEDs individually although they were connected together?

punisher_1211 (author)2016-07-11

Thanks for the tutorial its really inspiring. Everythings works great but i have dissatisfaction about brightness of the leds. When i change the column and row numbers with each others, all leds turn on and so bright. But when i change back it to normal form leds brightness decreases. can i set the brightness from the code ? i tried it from the dimmer value but didnt work.

Its likely that the type of LDR and light conditions are creating the issue by introducing a too long delay between rfreshing the LEDs. To prove you can comment out the automated dimmer function in the code and manually adjust the code to see if this is the issue. This is a 2 step process

Step 1 - Comment out this section of the code


// Check the ambient light and adjust LED brightness to suit
LDR = analogRead(A7);

if (LDR <= 100) {
dimmer = 1; // Take LDR output and use as basis for dimming display
else {
dimmer = LDR/4; // Take LDR output and use as basis for dimming display


Step 2 - Manuallly set the dimmer variable here in the code and reload to play around with brightness


int dimmer = 10;


Let me know how get on

punisher_1211 made it! (author)TechKiwiGadgets2016-07-14

?Thank you for your reply. i did what you said and brightness increase :) but still lower than the situation that when all leds turned on.

i set the int dimmer as 600. after the 600 value leds starts to flick.

and i set the LDR dimming code as dimmer = LDR/1.5. looks same with the int dimmer = 600 value.

Here is my word clock under the light and at darkness :) and you can see the brightness difference that i mentioned.

By the way. Nice work!! Ilike the colours.

Yes can you can change the brightness in the code

Sasa_D made it! (author)2016-09-08

Thanks for posting this really cool instructable. I made it myself. The first issue was I couldn't find a proper clock box in the local market. So I designed a box and got it done using laser cut acrylic. The woffel was also made by laser cutting a box board. this way it was way faster and accurate.(.dxf files are posted below). And also I used conventional leds because strip leds are too expensive and hard to find locally. I used a 9v battery through Vin. The clock worked perfectly and surpricingly the total cost was under $40. I gave it to my girlfriend for her birthday and she liked it a lot. Thank you again for inspiring me.

TechKiwiGadgets (author)Sasa_D2016-09-09

Nice work. Well done.I like the case you have made. Thanks for sharing the DX files.Brilliant!!

Engineer925 made it! (author)2016-05-25

This is a great project and since I have a couple Mega 2560's just hanging around...

I'm making a couple of these in a 9" x 9" frame for different people and want to get the proper date/time for the Happy Birthday to work properly. It did work the first time out, but having to keep pushing the button to finally get it to the correct time was taking a long time and didn't know what date was really set. So I looked up the correct UNIX time for today and put it in the "settime" line but it still didn't set the rtc. In order to set the time correctly, you must move the two lines of code with the UNIX date down into the statement as below.





Serial.println("RTC has set the system time");


It works great then.

Once getting the current UNIX time/date code and putting it in both places, go down a few lines to the "void loop() {" and remove the // from the from the "hmdmDisplay();" call and then compile the program. Open the serial monitor and check your time and date. Uncheck the scroll box at the bottom of the screen.

You can enhance you display by adding lines to the "void hmdmDisplay(){" routine.

I changed the lines to read: Serial.print("Time: ");



Serial.print("Day: ");


Serial.print("Month: ");


Serial.print("Year: ");


Serial.println(" ");

This makes the serial monitor easier to read and you can verify the actual date and time that was uploaded.

Once you have confirmed the correct date and time, your clock may be flashing pretty wildly. That's because of the serial monitor continually updating. To stop this, just remark out the "hmdmDisplay" call that you unremarked previously, and recompile the program.

Engineer925 (author)Engineer9252016-05-25

This is the actual change I made, I messed up a little in my original comment, sorry.

// Temp test routine

void hmdmDisplay(){

// display hmdm on monitor

Serial.print("Time: ");




Serial.print("Day: ");


Serial.print("Month: ");


Serial.print("Year: ");


Serial.println(" ");

thanks brilliant work

nice work well done!!!

luigir72 (author)2016-03-08

Hi Techkiwi i finish test, it's ok. I have change language in italian, and part program. Now Made A4.

TechKiwiGadgets (author)luigir722016-03-08

awesome work, well done!!

luigir72 (author)2016-03-04

It'ok i connected the push button and the led turn on same the time. Thanks

TechKiwiGadgets (author)luigir722016-03-05

Good news

luigir72 (author)2016-03-03

On display led i have all led on. when i test array it's ok. Sorry for much problem.

TechKiwiGadgets (author)luigir722016-03-04

If the Time Set Push Buttons are not connected then all LEDs will appear as on. This may be a cause.

Try loading the test code in section 5.4 above using the link below

Send me a message on the results.

luigir72 (author)2016-03-02

I have correct time on seriale monitor when load the sketch from link. After when load the code with libraries, in serial monitor i have only this: RTC HAS SET SYSTEM. No have time day and Hours.

TechKiwiGadgets (author)luigir722016-03-03

Under normal operation on startup the message "RTC has set the system time" will display on the Serial Monitor.

What is displaying on the LED Clock LED panel?

luigir72 (author)2016-03-02

Hi TeachKiwi where installed the libraries additional. The libraries is the same insidie the code. I don't undstand. Sorry thanhs

TechKiwiGadgets (author)luigir722016-03-02

when you load the time set sketch from this link

can you video the results and send me a link so I can view

luigir72 (author)2016-03-01

Dear TechKiwi congratulations!! I have problem with the serial monitor. I have only RTC has set time system. I haven't the time and hour. the rtc is ok because when i load the rtcset i have the hours and day and years. Please i need the you

TechKiwiGadgets (author)luigir722016-03-02


Make sure the two additional libraries that need to be installed before setting the time and testing

(i) Arduino time library

(ii) DS1307RTC library

Let me know if that helps

mirws (author)2016-01-23

can we used atmega328 with additional circuit to create led matrix? pls ur suggestion

TechKiwiGadgets (author)mirws2016-01-27

You could if you added other driver chips. I tried to keep it simple to assemble so went with the Mega to avoid this.

Mrnstr (author)2015-01-23

hello techkiwi,

This is amazing and I am inspired to make this my first arduino project!

Could you please answer a few questions for me?

1) why does your project only require 13 resisters? Other word clocks have a resister for each led.

2) based on your pictures, did you end up making two clocks (one with the 7 x 9 pcb and another with the 3 x 5 pcb)? Can you explain why you did it this way?

3) could this set up be easily modified to incorporate rgb LEDs?

Thanks !

TechKiwiGadgets (author)Mrnstr2015-01-24

hi sure no problems

1. There is only one resiter because each LED is turned on and then off sequentially when drawing the display. Therefore the current is limited whichever LED in the array is used.

2. Yes ive made a number of clocks and the preferred option is the larger shield as it covers all of the pins used on the Arduino. The smaller version was the prototype.

3. Yes it could be modified to RGB leds however I prefer the simplicity of one color so havnt gone with that. I am working on two other enhancements (alarm and mobile integration)

tmkibon (author)TechKiwiGadgets2016-01-10

Hello TechKiwi.

just out of curioustity, how did the project for word clock integrated with alarm and mobile integration went? did ever finish it? Please share it, I would love to know how it works

Thank you alot

TechKiwiGadgets (author)tmkibon2016-01-10

Sure thing. I produced code and have one running. Will post in a few days.

tmkibon (author)TechKiwiGadgets2016-01-10

Thanks alot. Looking forward to it.

Mrnstr (author)TechKiwiGadgets2015-01-25

thank you for the reply.

I'll be looking forward to your updates!

ZakMcKracken (author)2015-12-09


maybe you can help me... I don't have any Idea which LED Strip I should buy, there just too many possibilities :(

Can you recomment some strip?

Which one you have bought?

Thank you!

Kind regards,


DavidE38 (author)2015-09-14

Hi! ... I'm having an issue with the LED array.

When i run the " TechKiwi WC Array LED test" all my LED remains ON, except one row which turns off sequentially.

When i run the " TEST 2 V5.7 WC TechKiwi code" or the " TechKiwi WC Arduino Code" all the LEDs remains ON without interruption.

I'm not sure what could be the problem.

TechKiwiGadgets (author)DavidE382015-09-15


It sounds like the polarity of the LED array have been reversed. Please check the circuit carefully. If this is the case then rewire. If its very difficult to rectify physically in the enclosure we could alternatively rewrite the code to fix the polarity issue.

Send me a message and let me know if you need more help :)

cvet1 (author)TechKiwiGadgets2015-10-04

Hi, It's a great project! I managed to have the grid physically, but when testing the code I have the same problem as DavidE38. It seems to me that the text doesn't match the schematic of the grid. The text states that the cathodes are connected in the column, while the schem shows it the other way around...

So, I have a polarity issue. Do you have a quick tip what to change to have it working? If not, I will for sure dig into it, as I won't give up now :)

Thanks for this great project!

TechKiwiGadgets (author)cvet12015-10-04

Ok thanks I'll change the text. In the meantime will look at some code changes to help out

DavidE38 (author)2015-08-24

Hi. I have a question about this part of the code:

RTC.set(1408248800); // set the RTC to Aug 25 2014 9:00 am

I wonder if the RTC.set format goes like this: (yymmddhhmm).

yy= year

mm= month

dd= day

hh= hour

mm= minute

Thank you.

TechKiwiGadgets (author)DavidE382015-08-25


My understanding is that this number is actually Binary Coded Decimal and not a decimal number. See this link for an explanation

Hope this helps.

DavidE38 (author)TechKiwiGadgets2015-08-25

Thank you! It was very useful.

I manage to set the date and time before uploading your code, with the following "little project": (Tested with Aduino Mega + DS1307 RTC)

#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
const int DS1307 = 0x68; // Address of DS1307 see data sheets
const char* days[] =
{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
const char* months[] =
{"January", "February", "March", "April", "May", "June", "July", "August","September", "October", "November", "December"};
// Initializes all values:
byte Second = 0;
byte Minute = 0;
byte Hour = 0;
byte Weekday = 0;
byte Monthday = 0;
byte Month = 0;
byte Year = 0;
void setup() {
//Initialize RTC
// while (!Serial) ; // wait until Arduino Serial Monitor opens
setSyncInterval(60); // sync the time every 60 seconds (1 minutes)
byte decToBcd(byte val) {
return ((val/10*16) + (val%10));
byte bcdToDec(byte val) {
return ((val/16*10) + (val%16));
// This set of codes is allows input of data
void setTime() {
Year = 15; //"Please enter the current year, 00-99. - "
Month = 8; //"Please enter the current month, 1-12. - "
Monthday = 25; //"Please enter the current day of the month, 1-31. - "
Weekday = 3; //"Please enter the current day of the week, 1-7." "1 Sun | 2 Mon | 3 Tues | 4 Weds | 5 Thu | 6 Fri | 7 Sat - "
Hour = 22; //"Please enter the current hour in 24hr format, 0-23. - "
Minute = 22; //"Please enter the current minute, 0-59. - "
Second = 30; //"Please enter the current seconds, 0-59. - "
Serial.println("The data has been entered.");
// The following codes transmits the data to the RTC
// Ends transmission of data
void loop() {
tmElements_t tm;
if ( {
Serial.print("Ok, Time = ");
Serial.print(", Date (D/M/Y) = ");
} else {
if (RTC.chipPresent()) {
Serial.println("The DS1307 is stopped. Please run the SetTime");
Serial.println("example to initialize the time and begin running.");
} else {
Serial.println("DS1307 read error! Please check the circuitry.");
void print2digits(int number) {
if (number >= 0 && number < 10) {

Thank you again.

TechKiwiGadgets (author)DavidE382015-08-26

nice work :)

LoknathS (author)2015-08-20

can arduino mega sink all current from LEDs without getting damaged,,,help me with this

TechKiwiGadgets (author)LoknathS2015-08-20

The LEDs I used are 3v are protected by 100 Ohm resistors and being that they are only activated individually and not all at once by row or column which means the current is limited.

I have had no issues over the past 8 months of use.

Hope this helps.

LoknathS (author)TechKiwiGadgets2015-08-20

Thank You,,,,:)

TechKiwiGadgets (author)2015-07-30

another birthday...

About This Instructable




Bio: Crazy about technology and the possibilities it can bring. I love the challenge of building unique things. My goal is to make technology fun, relevant ... More »
More by TechKiwiGadgets:Eco Friendly Metal Detector - ArduinoRetro Pac-Man ClockInteractive LED Shoes - Arduino
Add instructable to: