Introduction: The Light Clock (IoT)

Picture of The Light Clock (IoT)

Welcome to The Light Clock, part art-piece, part timepiece, it's a modern take on the classic analogue clock. Where a traditional clock face uses hands to tell the time, The Light Clock turns your whole wall into a timepiece through a striking display of coloured light. You have the power to choose from millions of colours, allowing you to perfectly complement your existing décor, or simply to match your mood.

NEW!! We're offering pre-orders of "The Light Clock Kit" Which contains all the electronics and LEDs required to build the light clock with no breadboard or soldering. Make the body, add power and you're done!

We've also just had a successful kickstarter campaign and if you don't want to build your own you can now pre-order the clock here!

Step 1: How to Tell the Time on the Light Clock?

Picture of How to Tell the Time on the Light Clock?

To create the hour and minute hands, The Light Clock projects light in two different colours. At first glance this might seem complicated, but very quickly you’ll notice that you can read it with ease.

In this example we’ve used yellow light as the hour hand, and blue light as the minute hand. Comparing each Light Clock with the corresponding traditional displays, you can see how each colour comes to an edge where a hand would normally be. Click for an animated example.

Step 2: Parts and Tools

Picture of Parts and Tools

What you need is a

· Power Drill

Bigger tools required (shapeways is a good alternative if you don’t have these tools)

· 3D printer

· Laser cutter

Parts required:

· NodeMCU-12E

· Breadboard

· Jumper leads

· 144strip of Neopixel LEDs

· 3.3v to 5v logic level converter

· 5V 4A power supply (LEDs use looooots of power)

Step 3: Build the Breadboard

Picture of Build the Breadboard

To get started we will build the board. We need to link the

NodeMCU12E to the NeoPixels, but because the pixels are 5V and the NodeMCU12E is 3.3v output on its pins, we will require a logic level converter. We need to connect 3.3v and GND to the logic level converter on one side, and 5V and GND to the logic level converter on the other side. Afterwards we can take an output from pin D2, put it on an input to the logic level converter and to the Neopixel input line.

We need to add a 1000uF 6.3V+ capacitor to the 5V power so that the inrush current won’t damage the NeoPixels. This isn’t crucial, but don’t come crying to me if you blow up your pixel strip if you didn’t have them :P

Wire 3 should be unplugged for now. We will plug it in later when we want to power the board off our DC jack instead of USB.

Step 4: Installing the Board to Arduino IDE

Picture of Installing the Board to Arduino IDE

For this part you’ll need the Arduino 1.6.5 IDE (or higher).

The IDE for the ESP8266 is pretty new, so you’ll probably
need to install it. Open up File->Preferences and, under “additional boards manager”, simply add

Now hit OK and go to “Tools->Board->Board Manager” and
select “type: contributed”, after which the ESP8266 board should show up.

Hit “Install” and go make a cup of coffee, this can take quite
some time. :)

Step 5: Uploading the Code

Picture of Uploading the Code

Once the board is installed you should be able to select the

correct board under Tools-> Board: NodeMCU 1.0 (ESP-12E Module). Of course, if you’ve bought a different version of the board, then select that particular one from the list.

You don’t program the ESP8266 like a normal Arduino chip. You’re actually over-writing the entire firmware on the chip. To do this you have to put it into boot loader mode.

Plug the board in, so that you should see the little blue LED light up. Then, hold down the “flash button” and briefly press the “Reset” button while still holding flash. This will put the unit in bootloader mode so you can then upload your code to it, which you can find on GitHub.

I have made a couple of modifications to some of the libraries which you can find here and here

Disclaimer: due to the fact that I’m am engineer in my everyday job, not a programmer, the code might miss a thing or two. If you notice anything which can be improved, please link back to me and let me know. :)

So, in order to upload it, unzip the file and open it in Arduino. Note: make sure you hit the right arrow, as the screenshot shows:

If the code doesn’t upload properly, go ahead and check whether all the required libraries are installed. There are quite a few of them! If you need help installing them, you can find it here.

Step 6: Give It a Shape

Picture of Give It a Shape

OK, so you have a long strand of LEDS connected to a

micro-processor. It might be pretty, but it sure isn’t a clock yet! For that you’ll have to build a body.

I’ve uploaded a 3D print to thingiverse which you can download. You may have to cut it into several sections in order to print, in case you’re using a smaller 3D printer.

Print this off. You have a little notch for the LEDs to poke through - put the wires here and make sure that you wind the LEDs around the clock CLOCKWISE, otherwise you’ll have to learn how to tell time backwards! :P

NeoPixels should come with backing tape, but if not, a bit of hot glue or bluetac can be used to keep them in place.

Mount our breadboard on the top of the donut like in the photo (which is from a different prototype, but it should do).

Step 7: Add the Face

Picture of Add the Face

To add the face to the clock you will need a laser cut acrylic sheet and an "attractive" face. I use anodized metal, but you could use more acrylic, cardboard, canvas, wood. Whatever you like :)

Cut a 300mm disc of acrylic, cut a 182mm circle out of the center, then drill a 5mm hole out of the center of that.

Glue the 182mm circle to the 3d part we printed earlier (the design in the photos is a square, sorry I have a lot of different prototypes)

Place the 300mm disc around the cutout section.

Bolt the "attractive" face (should be 260mm with 5mm hole in it) to the part to hold the whole thing together. I use "Chicago Post Screws" you can find them on ebay.

Step 8: Add Power

Picture of Add Power

Screw in your DC jack into the hole in the centre and plug the wires into the breadboard on the 5V side:

Step 9: Testing, Testing!

Picture of Testing, Testing!

All you have to do now is to boot up the unit and test it. Make sure it’s plugged into the computer to the 5V power. Open up Arduino and click on the COM Port (highlighted yellow in the first image).

You should get a stream of data as the clock boots up with the default settings (second image).

The settings assume that you are in Australia, but don’t worry we can
change that.

Step 10: Connecting to Your WiFi

Picture of Connecting to Your WiFi

Now we have to set up the clock to be able to connect to your wifi network. You’ll need your phone for this.

First connect to “The Light Clock” wifi network. Because this network isn’t connected to the internet phones can sometimes take a little bit to do this. Just stick with it, you’ll get connected.

Then open your internet browser (Safari, Chrome, Firefox) and type “” into the address bar (where you’d normally type

Select the wifi network you want your clock to connect to, type the password associated and hit “Submit”. Don’t get scared if the screen displayed is not exactly the same as the one shown in the picture above, functionalities are still the same.

Next, you’ll be taken to the time-zone menu, similar to the screenshot below. You can set your time-zone for anywhere in the world and the clock will keep perfect network time.

Whoo-hoo! High-five for a fully functional light clock built by yourself! Now just bear with me for a little longer, this is where we get to the fun part!

Step 11: Customising the Colours

Picture of Customising the Colours

The whole colour spectrum is at your disposal, you just have

to make your pic! The light clock can display millions of colours, so you can customize it to fit any décor. Here’s how.

Special step for PC: To find the clock on your network, we use a service called mDNS. This works natively on all Apple products (Macs, iPhones, iPads), but you need to install a little helper if you use a PC. Once this is installed you can move to the next step: finding your light clock.

Open your browser and type in thelightclock.local/ (make sure you DON’T type www first and make sure you DO type the “/” at the end).

You will now end up in the main menu, where you can change
the colours by clicking on the hour or minute colour. Hitting the “Update the light clock” button will make your clock on the wall apply the new colour scheme you just chose.

Step 12: Other Settings

Picture of Other Settings

If you hit the "Settings" button down the bottom you'll find a host of other things you can play with. Would you like a seconds hand? Should the clock dim itself at night? Would you like little markings to help you tell where there hours are? All of this and more are customisable in the settings menu

Step 13: You're Done!

Thanks for reading and watching :) If you like this clock and want to support us on Kickstarter that would be awesome. If you built your own and want to let me know how it went that would be awesome too!


StéphaneG5 (author)2018-01-09

Thanks for this ! It's Awesome.
I have a compilation error. I don't understand :-/
My setup : Arduino 1.6.13, Board used : esp8266 V 2.4.0

In file included from /Users/stephanegueulette/Documents/Arduino/libraries/NTP-master/ntp.cpp:13:0:

/Users/stephanegueulette/Documents/Arduino/libraries/NTP-master/ntp.h:38:25: error: 'SECS_PER_HOUR' was not declared in this scope

time_t _syncInterval = SECS_PER_HOUR;


/Users/stephanegueulette/Documents/Arduino/libraries/NTP-master/ntp.cpp: In member function 'time_t NTP::getNtpTime()':

/Users/stephanegueulette/Documents/Arduino/libraries/NTP-master/ntp.cpp:54:53: error: 'SECS_PER_HOUR' was not declared in this scope

return secsSince1970 + (time_t)(totalOffset * SECS_PER_HOUR) ;


exit status 1

Do you have an idea please ?
Thanks a lot.


chrismelba (author)StéphaneG52018-01-09

Try using this library for NTP

Swansong (author)2017-10-13

This is beautiful! I love the idea to use ambient light to show the time, very creative. :)

SalilG2 (author)2017-09-11

Hi Chris,

I loved this idea and was about at it for couple of days. Done with the connections and the code. Its working just as you intended it to. Just the clock face is pending.

I was wondering if we can make this code work with the Blynk app. Or else just add the code for rainbow/glitter/confetti patterns. To show off to the friends ;).


Salil G

chrismelba (author)SalilG22017-09-11

The code is all open source so you can add anything you want! If you do, please make a pull request so that I can add it to the main code-base :)

RaD0 (author)2017-06-02

Hi Sir! Amazing project! But really need your help. Your midday start from the first pixel. But my clock have some wires. I want to move midday to the middle of the strip. So Then my wires will be down.

LorenzB5 (author)2017-05-16

hi there,

first of all, great job, great project.

i just wanted to build my second one, but i ran in some problems

i use an 60dots led strip, which is working correctly.

as it only has 60 led´s i changed that from 120 to 60 in the code and reupload it.

but now, only every second led is flashing for the seconds

after 30 seconds the second pixel dissapears and appears again after 30 secs

so i think, the code is still calculating with 120 pixels

did you ever ran into sth like this ?



bliu2 (author)2017-05-13

Really wish there was a way to use standard RGB strips with "R, G, B, PWR" inputs haha. Can't afford the expensive neopixel strips :(

Ds45 (author)2016-07-15

that is possible if we use power boost so this clock can use some battery ?

chrismelba (author)Ds452016-10-25

You can try. The clock draws about 10W at full brightness, though as low as 2 or 3 on lower brightness settings. You could get a big battery and give it a shot.

MikeG250 (author)2016-10-23

Not sure I understand what the 3.3v to 5v logic level converter is doing as it works fine without it, or is it just strictly used if your running of usb power?

chrismelba (author)MikeG2502016-10-23

Hmm, it's meant to be in there if you're powering the LED strip from 5v power, as in theory the signal should be the same voltage as the power source. If you're powering the LEDs off 3.3v, or if it's just working anyways, then I guess it's not needed! I've never tried without using it to be honest.

MikeG250 (author)chrismelba2016-10-24

from the diagram I cant tell it looks like you have 5 volts going into it and 3volts from the MCU on the other side, not sure what it does really at that point. I thought at first it was supplying the the 5 volts to the leds if you where running of strickly usb.

chrismelba (author)MikeG2502016-10-25

Yeah, it takes a 3.3v signal and converts it to a 5v signal for the ws2812bs to read. At least that's the theory

amancaja made it! (author)2016-07-14

Amazing project! I made it. Thanks to share it!

RoelS2 made it! (author)2016-06-20

Such a cool project i just had to make it!
To make it even nicer i would like to integrate this into my home automation running OpenHAB. I've found the http strings to change colour templates, but i was wondering if you could give some insight in how to change settings using https requests etc

NikeshP4 (author)RoelS22016-07-08

Just gotta say, that class casing looks friggen awesome!

RoelS2 (author)RoelS22016-06-20

Or even better... implement MQTT pubsub library to support changing settings (e.g. turn clock on/off) using MQTT topics

chrismelba (author)RoelS22016-06-20

I do mean to make a readme for home integration, and I'd LOVE to add MQTT support, but I just don't have time right now. If you code some, it'd be awesome if you made a pull request :)

Off the top of my head here are some of the values, all changed with GET commands to the main page:

timezone between -12 and +12
hour marks 0, 1 or 2 for various settings
sleep hour of sleep time (0-23)
sleepmin minutes of sleep time (0-59)
showseconds 0 or 1
webMode debugging
wake hour of wake time (0-23)
wakemin minutes of wake time (0-59)
brightness current brightness (between 0 and 255)
DSTtime DST or not (0 or 1)
clockname for mdsn responder (string)
sleeptype int between 0 and 4 (dim, dots, moon, disabled)
dawnbreak 0 or 1 for on or off
pixelCount 0 to 255 to allow for different length LED strings
maxBrightness 0 to 255 to allow for USB power vs mains power

RoelS2 (author)chrismelba2016-06-20

Thanks a lot!

I managed to integrate the on/off feature for the light clock into OpenHAB using the HTTP GET method in combination with a Black colour scheme.

Colour scheme 1 = black for minutes and hours

Openhab triggers the following Http command for on and off



Will continue to work on this and also take a look at MQTT implementation.


chrismelba (author)RoelS22016-06-20

That's a great way to code around it :) I should really add an "off/on" function if I start to work on integration for IoT.

Keen to see what else you come up with :)

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

finally got around to making it. i didn't have the funds to order the 3d print so I decided to make the shell out of some wood (and gave me a reason to buy a small rotor for future use).

also, it makes my room look like Drake's hotline bling music video haha. i definitely want to go through the code and pick it apart.

chrismelba (author)NikeshP2016-05-25

Very awesome! I'm glad you like it.

I'm still trying to add new features to the code, so if you want to make any pull requests, please feel free :)

wcmiller5 (author)2016-05-20

This is a Great project. I have been looking at the Neopixels and this would be a great way to start with something practical for my wife's sake.

I downloaded you code and after I removed the two Websocket includes I got an error on the NTPh reference. Can you indicate what library you used. There are lots of libraries out there and it would be best for me to use the same one you used in this build.

In fact, it might be best to include either references to all your libraries.

Thanks in advance for your help

JoséM313 (author)2016-05-19

This one is to connect to the arduino i have the Freeduino Uno. i Don´t know the wire that is for data in the neopixels

JoséM313 (author)2016-05-18

Hello i have a 120strip of neopixel and instead of the NodeMCU12E i have ESP8266 Wifi 3.3v logic level. can you help my in some way ? im making a project to finish my high school and if i dind finish this I will lose all my 3 years of school. sorry to bother

chrismelba (author)JoséM3132016-05-18

What part are you having trouble with?

JoséM313 (author)chrismelba2016-05-18

I cant understand how they work. sorry. I need this to finish high school

chrismelba (author)JoséM3132016-05-18

You are going to have to start following the instructions and tell me which step you get stuck at. If you can't follow any of the instructions then it may be that this project is too difficult for you, and you will have to choose a different one.

Looking at your photos you don't have a NodeMCU 12-e, you have an earlier revision. You'll have to get either a serial-usb interpreter, or get a proper NodeMCU 12-E

chrismelba (author)2016-04-11

This is why I should make a proper project :( Sorry, just comment out the websocket libraries, I'm playing with them, but they're not needed at the moment.

If you remove those libraries up the top then hopefully it will finally work?

trdb (author)chrismelba2016-05-06

Hi Chris, can you please show me a path where I can search ?


trdb (author)chrismelba2016-04-13

If I remove the two lines of WebSocket libraries I got a new error


from lightclockwifi.ino:26:

lightclockwifi.ino: In function 'void dawn()':
..\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\2.1.0-rc2\cores\esp8266/Arduino.h:254:18: error: expected unqualified-id before '(' token
#define max(a,b) ((a)>(b)?(a):(b))

lightclockwifi.ino:1582:19: note: in expansion of macro 'max'
Erreur lors de la compilation.

chrismelba (author)trdb2016-04-13

Hmm that's an exciting new error.

You could try deleting everything in the "dawn" sub. It's something I'm testing for the next update, so won't impact your clock running.

Are you using a french compiler? I wonder if that is making the difference?

trdb (author)chrismelba2016-04-14

exciting ? for you maybe but not for me, haha

Sorry but i don't understand what you mean by "deleting everything in the "dawn" sub"

I'm using Arduino IDE 1.6.5, I think the "french part" are just messages, because I'm using a French Win 8 edition

trdb (author)2016-04-07

First of all thank you for this extra tutorial, I wanted for a long time to reproduce this beautiful idea
I have a little problem after the uploading the sketch and I think I know the source of the problem, I'm usinga a NodeMCU v3 purchased from aliexpress

I got this :

ets Jan 8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 1264, room 16
tail 0
chksum 0x42
csum 0x42
reading settings from EEPROM
clockname: thelightclock
latitude: 0.00
longitude: 0.00
timezonevalue: 10
timezone: -6.00
randommode: 0
hourmarks: 0
sleep: 22
sleepmin: 0
showseconds: 1
DSTauto: 0
webMode: 0
wake: 7
wakemin: 0
brightness: 255
DST (true/false): 0
Hour of Death: 10
minuteofdeath: 10
nightmode 0

Exception (28):
epc1=0x40105a51 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000044 depc=0x00000000

ctx: cont
sp: 3fff2650 end: 3fff2a50 offset: 01a0

3fff27f0: feefeffe feefeffe feefeffe feefeffe
3fff2800: feefeffe feefeffe 40252b20 40105b4d
3fff2810: 000003fe 00001000 00000484 feefeffe
3fff2820: 00000484 40105b7a 000003fe feefeffe
3fff2830: 4022f431 3fff2860 0000001c 003ff000
3fff2840: 40105e4a 4022f519 3fff3af0 000003ff
3fff2850: 000003fd 3fff2900 3fff3af0 000003fd
3fff2860: ffffff01 55aa55aa 00000009 0000001c
3fff2870: 0000001c 00000010 00000068 000003ff
3fff2880: 4022f908 3fff3af0 3fff3af0 000000ff
3fff2890: 00000001 3fff2920 4022fa63 00000008
3fff28a0: 3fff3af0 000000ff 3fff2900 00000000
3fff28b0: 3fff3bb0 3fff2961 00000001 4022faf0
3fff28c0: 3fff2900 3fff3af0 3fff1510 3fff1a20
3fff28d0: 3fff2920 3fff9e28 3fff3af0 3fff1510
3fff28e0: 4022fb2c 3fff2aa0 00000000 4000050c
3fff28f0: 40207318 00000030 0000001e ffffffff
3fff2900: 40106d00 0000002f 3fff3398 00000004
3fff2910: 53082725 00000000 00000000 60000308
3fff2920: 00000000 00000040 00000063 3fff0ae0
3fff2930: 00000031 00000014 3fff1a20 00000030
3fff2940: 00000020 0000000a 3fff2aa0 00000027
3fff2950: 4022f18a 00000001 00000000 3fff1510
3fff2960: 40206ef3 00000001 3ffe9c11 4020e70c
3fff2970: 3fff2aa0 00000000 3fff2aa0 40204f96
3fff2980: 3fffdad0 00000007 3fff2aa0 4020da75
3fff2990: 3ffe9c10 00000000 3fff2aa0 4020da75
3fff29a0: 3ffe92ac 0000007c 00000031 40106e07
3fff29b0: 008a8100 3fff0ae0 0000007c 3fff1a20
3fff29c0: 3fff0a44 00000000 3fff2aa0 402052c4
3fff29d0: 00000014 00000000 3fff0ae0 402039a5
3fff29e0: 008a8100 00000014 00000031 40106e07
3fff29f0: 00000014 3fff0a50 00000065 3fff1a20
3fff2a00: 3fffdad0 00000000 3fff1930 4020599d
3fff2a10: feefeffe feefeffe feefeffe feefeffe
3fff2a20: feefeffe feefeffe feefeffe feefeffe
3fff2a30: feefeffe feefeffe 3fff1a18 4020ce88
3fff2a40: feefeffe feefeffe 3fff1a30 40100114

chrismelba (author)trdb2016-04-10

Can you log in to the clock over WiFi? Or does it crash before you even get that far? Perhaps try the latest build on github?

trdb (author)chrismelba2016-04-11

I've tried the latest build, and I think there is some extra libs included, after installing WebSocketClient, I've got this error :

arduino-1.6.5\libraries\ArduinoWebsocketClient-master/WebSocketClient.h:31:22: fatal error: Ethernet.h: No such file or directory
#include <Ethernet.h>

Ethernet.h comes with default arduino libs, right ? what's wrong ?

trdb (author)chrismelba2016-04-11

Hi, thx for the quick replay

No I can't log to the clock, no new wifi station displayed, the debug message is displayed in loop

Ok, i'll try the latest build

wenkofeng made it! (author)2016-04-06

I made it. Tkanks! I modify led to 60 pcs. (ws2812 60 led)

chrismelba (author)wenkofeng2016-04-06

Very cool! Thanks so much for posting a picture too!

JoséM88 (author)2016-04-06

hi sorry to bother im doing this project to my final exam in school but I have ESP8266 wifi 3.3 Logic level. I dont have the NodeMCU-12E can you help my in any way ? plz i need this to finish my school and i have about a mouth to do it.

chrismelba (author)JoséM882016-04-06

What ESP8266 chip do you have? These instructions should work for most chips, as long as you have a logic level shifter.

You may have to reprogram your ESP8266 with a usb-serial programmer instead of directly over USB.

IliaS2 made it! (author)2016-04-01

Nice project! Thanks to share it!

wenkofeng made it! (author)2016-03-31

Thinks! i made one, but led only buy 15pcs........

chrismelba (author)wenkofeng2016-03-31

Still looks sort of cool :)

Max_Pof (author)2015-12-05

I'm very decide to realize his project, I have my NodeMCU-12E now. The code is verify without error (by the way with is not true with Arduino 1.6.6 but anyway).

If I download the code on the board, all is down, I can enter in AP mode:

But when I valide the network, the board reboot:

I try to download again all library, but nothing is better...

I try all I can, but I really dont see the origin of the problem...

NikeshP (author)Max_Pof2015-12-07

You might need to clear your EEPROM. I was having similar issues when i reuploaded and didn't clear it.

The clear sketch should be under File>examples>EEPROM>EEPROM clear.

try uploading that (remember to hold 'FLASH' and press 'RESET' first), then once that's uploaded, hold flash/press reset again and reupload the wificlock sketch.

chrismelba (author)NikeshP2015-12-07

That's really good to know NikeshP. I might be able to wipe the EEPROM on first boot. I will try.

Max_Pof (author)chrismelba2015-12-19


So, I try to clear EEPROM (changing the memory size in the code to fit with the 4M of the nodeMCU) but sadly I still have the same error....

Meanwhile, is there any possibilities to force the APmode? (allow me to not go through the network setup page). I try to change the webMode variable but it's not effective

About This Instructable




More by chrismelba:The Light Clock MiniThe Light Clock (IoT)
Add instructable to: