Arduino-compatible development platform whose primary function is a clock

Public Chat
Similar projects worth following
MakeTime is a clock that uses a ring of 24 RGB LEDs to display time. Hours and minutes are displayed using different colors. As it uses just 24 LEDs, its granularity is 2.5 minutes. The time can be set using its single button, located in the center of the clock face.

MakeTime is also an Arduino-compatible development platform, and is designed with hacking in mind. In addition to the addressable LEDs, the button and the DS3231 RTC, you can access many of the Arduino pins on an optional expansion header.

Time - it is our most precious resource. We invest some of it everytime we take a decision: to meet friends, to cook, to spend time with our loved ones, to work late, to watch a movie or to go for a run. And yet unlike our savings account it sometimes feels like the more of it we spend, the more of it we have. We MakeTime.

MakeTime can be simple: it shows you the time. Much like on an analog clock you read the time on a ring, with colours showing hours and minutes. Its 24 LEDs dynamically adapt to the surrounding light level, being perfectly visible in direct sunlight while staying discreet in the dark. Since it only uses 24 LEDs its resolution for showing minutes is decreased to 2.5 minutes, making it easier to read time at a glance and giving you more time to focus in a world surrounded by blinky lights competing for your attention. MakeTime is preloaded with many colour themes to make it your own.

User Interface

All interactions with MakeTime happen through the single button on the clock face. Three actions are recognized:

 - click: (less than 1 second)

 - press (more than 1 second, less than 10 seconds)
 - factory defaults (more than 10 seconds)

To set the time you press the button and then you can click to advance the hour. Pressing the button again allows you to set the minutes, as in the picture below. The picture shows the setting for 10:14.

Pressing the button again in the minutes menu allows you to change colour themes. All these menus have timeouts of 5 seconds during which if no action is taken you get back to the normal clock face, with your settings confirmed.

Arduino compatibility

MakeTime can be complex: it is an Arduino-compatible development platform that you can hack to implement as much functionality as you need. Your freedom to hack and expand is not limited to software, though. The available schematics and the expansion header that can be populated on the PCB allows you to add sensors, communication and actuators to your heart's desire. There are two versions of the 3D model for the back, one of which provides access to the expansion header for prototyping. Project updates show different design ideas with sample code for teaching MakeTime new tricks.

You will need to program the Arduino bootloader for the ATmega328P before connecting via USB to the Arduino environment. Use the following fuse bits:

 - Extended: 0xFC

 - High: 0xDA

 - Low: 0xFF


MakeTime has a custom PCB that is Arduino-compatible, i.e. it uses the ATmega328P and a CH340 USB-UART bridge. Timekeeping is done by a battery backed-up DS3231, while the time is shown using WS2812 addressable LEDs. There's also a buzzer and an LDR that allows brightness to be lowered in low-lighting conditions. The orange "blue wire" was fixed in the latest revision of the PCB.


The case is designed in FreeCAD and can easily be 3D printed. I used 2 M3x5 screws for fixing the PCB to the case and 4 M3x8 screws for the back of the case.

Design files

The complete hardware project with schematic, PCB, BOM and all that is available on EasyEDA. Most of the components are on the front side because JLCPCB only allows assembly of components on one side. Thus you can order the PCBs there and have them mostly populated when they arrive.

PCB files, firmware and case sources can be found on Git.

Timelapse video

  • 1 × CR2032-BS-6-1 battery holder
  • 1 × SFN-12055PA6.5 Buzzer
  • 1 × U-D-M5DD-W-1 Micro-USB socket
  • 1 × MF-NSMF035X-2 Fuses and Accessories / PTC Resettable Fuses
  • 30 × 100nF 0603

View all 22 components

  • Breadboard prototype

    mihai.cuciuc4 days ago 0 comments

    Don't feel like committing to getting PCBs made and then soldering a handful of SMD components? How about trying it out on a breadboard first? After all, this is how it all started.

    You'll need:

     - 1x Arduino Nano

     - 1x DS3231 RTC module

     - 1x Addressable LED ring with 24 LEDs

     - 2x 10 kOhm resistors

     - 1x Pushbutton

     - 1x Light dependent resistor (LDR)

     - Breadboard, wires, soldering iron (for the LED ring as it doesn't come with anything connected to the pads)

    Use the firmware from GitHub

    Wiring diagram and a picture of what you can expect to get:

  • Adding sensors: Temperature and Humidity

    mihai.cuciuc7 days ago 0 comments

    On the back of the PCB there is an expansion header that can be populated to add functionality. Adding an SHT31 allows MakeTime to measure temperature and humidity.

    The display is divided into 3 sections.

     - On the left, the temperature is shown on 10 LEDs. The first LED turns on above 16 degrees Celsius and the last one above 34 degrees Celsius.

     - On the right, humidity is shown with 10% granularity.

     - At the top a single LED turns Green/Yellow/Red to indicate comfort level, loosely based on the information in this article

    Arduino sketch

    #include <Adafruit_NeoPixel.h>
    #include <Wire.h>
    #include "Adafruit_SHT31.h"
    #define LED_PIN    9
    #define LED_COUNT 24
    Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
    Adafruit_SHT31 sht31 = Adafruit_SHT31();
    void setup()
      if (! sht31.begin(0x44))   // Set to 0x45 for alternate i2c addr
        strip.setPixelColor(12, 0x00800000);;
        while (1) delay(1);
    void loop()
      float t = sht31.readTemperature();
      float h = sht31.readHumidity();
      uint32_t color;
      uint8_t r, b, i;
      if (! isnan(t))
        r = round((t - 15) / 2);
      } else { 
        r = 0;
      if (! isnan(h))
        b = round(h / 10);
      } else { 
        b = 0;
      // Draw temperature
      for (i = 0; i < 10; i++)
        color = 0x00040404;
        if (r > i) color += 0x00200000;
        strip.setPixelColor(i + 13, color);
      // Draw humidity
      for (i = 0; i < 10; i++)
        color = 0x00040404;
        if (b > i) color += 0x00000020;
        strip.setPixelColor(11 - i, color);
      // Comfort level:
      // T in [20 - 26 deg] and RH in [30 - 70 %] - Green
      // T in [19 - 27 deg] and RH in [30 - 70 %] - Yellow
      // T in [20 - 26 deg] and RH in [20 - 80 %] - Yellow
      // else - Red
      color = 0;
      if (t >= 20 && t <= 26 && h >= 30 && h <= 70) color = 0x00002000;
      else if (t >= 19 && t <= 27 && h >= 30 && h <= 70) color = 0x00202000;
      else if (t >= 20 && t <= 26 && h >= 20 && h <= 80) color = 0x00202000;
      else color = 0x00200000;
      strip.setPixelColor(0, color);

  • Updated PCBs

    mihai.cuciuc10/02/2021 at 11:54 0 comments

    Fixed missing 100nF cap on MCU reset line. This is needed for programming the chip from the Arduino IDE and was the reason there was an orange wire on the original PCBs.

    Added footprints for 2 additional buttons on the back.

  • MakeTime as instrument display

    mihai.cuciuc09/25/2021 at 09:21 0 comments

    You can use MakeTime as an indicator for your PC's performance. Or for anything else, for that matter. Here's an example of it being used as a CPU load monitor

    or you can use more than one to make an instrument cluster

    MakeTime is simply listening on the serial port for what it should be displaying and a python script sends the stats.

    Arduino sketch

    #include <Adafruit_NeoPixel.h>
    #define LED_PIN    9
    #define LED_COUNT 24
    Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
    void setup()
    void loop()
      String s;
      int r, g, b, i;
      uint32_t color;
      s = Serial.readString();
      if (s != "")
        sscanf(s.c_str(), "%d %d %d", &r, &g, &b);
        for (i = 0; i < 19; i++)
          color = 0x00101010;
          if (r > i) color += 0x600000;
          if (g > i) color += 0x006000;
          if (b > i) color += 0x000060;    
          strip.setPixelColor((i + 15) % 24, color);

    Python script for CPU load monitor

    import serial
    import psutil
    serialPort = serial.Serial("COM6", 115200, xonxoff=False, rtscts=False, dsrdtr=False)
    while (1):
        cpu_percent = psutil.cpu_percent(interval=0.2)
        str = "%d 0 0" % int(cpu_percent*19 / 100.0)
        bstr = bytearray(str)
        print cpu_percent, bstr

View all 4 project logs

Enjoy this project?



Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates