Introduction: Thermochromic Clock

About: I am a physicist, part time maker and electronics enthusiast. My projects revolve mainly around daily-use items, toys and decoration with a focus on unconventional mechanisms and high standard of design.

If you have seen my other projects you know that I like clocks. So after building the thermochromic temperature and humidity display it was only natural to make a clock version.

This clock works by using a thermochromic foil based on liquid crystals that changes color with temperature. The foil is attached to a PCB with SMD resistors as heating segments.

At first, I tried to build a clock that was based on PCB heaters similar to my thermochromic temperature & humidity display. However, as the dimensions of the segments became smaller and therefore although their resistance, it was challenging to find proper drive electronics for so many channels that can supply enough current. Then the idea came to me to use SMD resistors instead.


  • custom heater PCB (see my GitHub for Gerber and BoM)
  • custom driver PCB (see my GitHub for Gerber and BoM)
  • housing made from laser-cut acrylic (see my GitHub for dxf files)
  • Thermochromic Adhesive Sheet, 150x150 mm, 30-35°C (SFXC)
  • 4x M3x26mm bolts
  • 4x M2x6mm bolts
  • 4x 2.6mm long PCB spacer (3D-printed, see my GitHub for stl file)

Step 1: PCB Design

The PCBs were designed in KiCAD. There is one PCB for the heating segments and another PCB for the drive electronics. Both PCBs are connected using standard 2.54mm pin headers. I added a little bit of a twist to the design by having the hours and minutes arranged vertically and slightly offset to each other. I found these 2512 SMD resistors which are perfect as heating segments as they are very thin and can handle 1W. To drive the segments I chose the popular TPIC6B595 8-bit power logic shift register which can provide 150mA per channel (500mA total). The heating resistor value was chosen as 33Ohm, limiting the current to 150mA for a 5V power supply. The brains of the circuit is an ESP8266 dev board (Wemos D1 mini). This allows synchronizing the time via NTP using the onboard WiFi. Although the TPIC6B595 is only specified for 5V logic it also works with 3.3V from the ESP8266. Everything is powered through an USB-C plug.

The Gerber files and BoM can be found on my GitHub. I ordered my PCBs from PCBWay because you can choose a black solder mask that l wanted to have for the heater PCB.

Step 2: CAD Design

The enclosure is made from laser-cut acrylic and was designed in Fusion360. It uses alternating layers of black and transparent 3mm thick acrylic sheets stacked on top of each other. I wanted to have round edges so the alternatives would have been to bend the acrylic or use living hinges. I decided on the stacked layers and made the transparent layers a bit smaller to make the enclosure look like the fins of a heatsink. The layers are held together by M3 bolts and the driver PCB is attached to the bottom using M2 bolts.

The dxf files for the enclosure can be found on my GitHub. I ordered them from

Note: in the CAD model the top and bottom plate are both 5mm thick. This allows using standard 30mm length M3 bolts instead of the 26mm bolts I used.

Step 3: Assemble Heater PCB

I first soldered the SMD resistors using solder paste and a hot air soldering iron. Then the PCB headers were soldered. After that, I glued a 3D-printed frame to the PCB which matches the thickness of the SMD resistors. Finally, the self-adhesive thermochromic foil was added on top.

Step 4: Assemble Driver PCB

The driver PCB also contains a few SMD components such as resistors, decoupling capacitors and the USB-C plug. The rest are all handsolder friendly thru-hole components. The TPIC6B595 were attached using 20-pin DIL sockets while the Wemos board was directly soldered to the PCB.

Step 5: Upload Code

The code was written using the Arduino IDE. It connects to your WiFi and synchronizes time from an NTP server. You have to specify your WiFi SSD and password, NTP server, and timezone at the beginning of the code.

The segments are heated with a software-implemented PWM signal to limit the heating power and current consumption. You can play around with the duty cycle and heating time to optimize the color-changing effect of the foil.

The code can be found on my GitHub.

Step 6: Assemble Enclosure

At first, I had to thread the M2 and M3 holes into the bottom plate of the enclosure. Then the driver PCB was attached to the bottom plate using 3D-printed spacers and M2 bolts. Finally, the enclosure was stacked together and fixed with M3 bolts. The top late needs to be added after the PCB heater was attached.

Step 7: Closing Remarks

In my previous thermochromic temperature and humidity display the color change was limited to the segments, however, here the heat tends to spread out and causes the foil to change color almost all over. This is partially because I am heating the segments longer in order to have the digits visible for a longer time. In the end, I think it makes for a nice effect having the digits surrounded by a blur of colors.

The enclosure design needs a little bit of improvement. Some of the holes are very close to the edge and the hole diameter of the threaded holes turned out a bit too large. In addition, the opening for the USB-C plug is too small for some USB-C cables.

I am thinking about a watch version using even smaller SMD resistors and a thermochromic display using a matrix of diodes is also in preparation.

Colors of the Rainbow Contest

Participated in the
Colors of the Rainbow Contest