Introduction: Retirement Clock / Count Up/Dn Clock

I had a few of these 8x8 LED dot-matrix displays in the drawer and was thinking about what to do with them. Inspired by other instructables, I got the idea to build a count down/up display to count down to a future date/time and if the target time passed, count up from it. I made this now my retirement clock sitting on the shelf.

The idea to put it into a bottle was more of an accident while thinking about a casing. Others put ships into a bottle, why not a clock?

I also wanted to make the clock obey daylight saving time and of course remember the settings and time when being unplugged. I am powering the clock via USB which makes it reprogrammable if you'd like to do something different or just add features to the code. The code is pretty simple and could also use a lot of optimizing. I did not take good care about RAM consumption I have to admit. If I got the time and motivation, I'll come back to it.


1. Arduino Nano

2. RTC (I used the common DS3231 which also has an EEPROM)

3. 12x 8x8 dot matrix module. (I had the quad modules which are easier to line up)

4. LDR to adjust the display brightness

5. Resistor 10 kOhm

6. Capacitor 5x 100 uF suppressing spikes from the display

7. To increase the contrast of the 8x8 modules, I used the dark tinted "Window Film". The Display shows the LEDs as white dots if not lit. The window film turns it a shiny black look.

Step 1: Connect the Components

I used three of the quad displays to assemble the display. To show a date with slashes and time with colons, we need space for 8 characters. Using the typical 5x7 font, we'd need six 8x8 blocks per row. I cut one of the quad blocks in half and arranged these as two rows by six blocks as shown in the breadboard schematic.

Step 2: 3D Printed Parts

To hold the two rows of the display and position these in the bottle I printed round distance rings for the display frame. I added the files I used below. To be able printing these without support, they are split in parts. The screenshot is showing the two rings glued to the display frame. The bottle neck cover is housing the three buttons to switch between display modes and setting current time and target time. The bottle neck cover I printed in TPU allowing to slide the USB cable into the cover without cutting off the connectors and tie it down with a few windings of wire. I forgot to mention that I used an 1.5 L wine bottle which I cut at the very bottom. All parts to be printed are fitting on a 20x20 cm (8x8 in) printer bed.

Step 3: The Code

The Arduino code is using a few commonly used libraries.







There are a few lines in the INO file which may need changing:

Line 38: #define HARDWARE_TYPE MD_MAX72XX::FC16_HW <-- depends on the 8x8 module and its orientation

instead of FC16_HW it could one of:





The code is using the settings for US Central time and needs adjusting for other time zones:

Line 53/54:

TimeChangeRule myDST = {"CDT", Second, Sun, Mar, 2, -300} ; // Daylight Time UTC-5
TimeChangeRule mySTD = {"CST", First, Sun, Nov, 2, -360}; // Standard time UTC -6

This is easy to adjust. The name CST/CDT is just to have a reference. I do not display the three-letter-abbreviation, so it does not matter. The next parameters are referring to which day in the month the switch is happening. The adjustment is in minutes, so locations using +/- 30 minutes adjustments will work as well.

The RTC is running internally on UTC-Time allowing the timezone library to work as intended. You may wonder why the code is referencing the older DS1307 chip contrary to the clock chip I used, but this does not matter. The library is working fine with either chip. The DS1307 has the tendency to drift off more than the DS3132. the DS3132 is the preferred clock. For those who'd like to add internet time, an ESP8266 will do the job pretty easily. This could make the RTC obsolete. If you're making these changes, use the Arduino EEPROM to store the target time, I used the RTC EEPROM to do so.

Step 4: Operation and Settings

There are three buttons

1. Menu / settings

2. Up

3. Down

The menu button allows cycling through the three display typess: Current time, Target time, Delta Time. The Delta time is showing the number of days, HH/MM/SS between the current time and target time. It will show t- and counting down if the target is in the future or t+ and counting up if the target is in the past.

To adjust the current or target time, select the current time or target time display. To change the time, hold the menu button for 2 seconds and release which will bring you into the setting mode. The neighboring "/" or ":" will turn into "<" or ">" to indicate which digit you're adjusting. Use the up/down buttons to adjust the individual hh/mm/ss and mm/dd/yy. I did not add a setting to switch between mm/dd/yy and dd/mm/yy, this needs changing in the code or maybe someone is willing to add this feature.

You will notice that if you step the minutes over 59 or below 00, the hour display will adjust as well. the same is true for seconds, hours and days changing the next higher value if crossing below 0 or above the max for this digit. I did this to avoid programming the various limits of individual months and if February is needing 29 days in a leap year. Adjusting the time is actually done in epoch-time, seconds since Jan-1-1970.

I added a simple video to show the counting. I wanted to make these like a turning wheel display. If you like to adjust the duration of the change, line 69 in the INO gives you a few options to speed up or slow down the change. 120ms would make the digits scroll slow enough as it would be a continuously running wheel.

I hope you enjoyed this instructable.

Patrick Geschwindner

Clocks Contest

Participated in the
Clocks Contest