Skip to the content
PCBKitNew board
4 layers70 × 50 mmTimekeeper, the printed circuit board in 3D

A custom ESP32-based clock platform driving WS2812B/NeoPixel LED displays. Firmware and PCB are display-agnostic, supporting any addressable LED clock with minimal adjustments. The reference implementation drives a 4-digit Lixie tube display, combining modern IoT hardware with classic nixie-style aesthetics.

Size
70 × 50 mm
Copper layers
4
Thickness
4.69 mm
Parts
57
Nets
88
Pads
232
Tracks, vias
373, 159
Pours
3
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
16 Mar 2026
Updated
16 Mar 2026

Overview

Timekeeper is an open-source printed circuit board by liam-tirpitz, from the liam-tirpitz/TickTock repository on GitHub. It is a 4-layer board of 70 × 50 mm with 57 parts on 88 nets, routed with 373 tracks and 159 vias.

It is built around the CH340C, ESP32-WROOM-32 and NEO-M8M, with the AP2112K-3.3, DS3232MZ+ and TPD2EUSB30ADRT among its other parts. Its parts include 19 resistors, 11 capacitors, 7 ICs, 6 connectors and 5 diodes. It belongs with the lEDs and displays boards and the ESP32 boards of this library.

Main components

9

README

README.md

TickTock — ESP32 LED Clock Platform

A custom ESP32-based clock platform for WS2812B-driven LED clocks. The firmware and PCB are designed to be display-agnostic: any clock that accepts a stream of addressable LEDs (WS2812B/NeoPixel) can be driven with minor adjustments to the display layer. This repository's reference implementation drives a 4-digit Lixie tube display.

Time is sourced from a 3-tier fallback chain: GPS → NTP → RTC, ensuring accurate time even without network or satellite coverage. The display integrates with Home Assistant via MQTT.

Features

  • GPS time sync via u-blox NEO-6M over I2C (DDC)
  • NTP fallback over WiFi
  • DS3231M RTC as offline fallback (battery-backed)
  • Home Assistant integration: on/off, RGB color, brightness, display effects

Adapting to a Different Display

The display logic is isolated in MqttDisplay.h/cpp and main.cpp. To drive a different WS2812B-based clock (e.g. a 7-segment LED display, a nixie-style digit ring, or a custom matrix):

  1. Replace or modify the Lixie calls in MqttDisplay.cpp and main.cpp with your own FastLED or display-library code.
  2. Adjust LIXIE_PIN and LIXIE_DIGIT_COUNT in config.defaults.h to match your LED count and data pin.
  3. The TimeManager class, configuration system, and MQTT integration require no changes.

Repository Structure

text
Protject_Tick_Tock/
├── software/
│   ├── TickTock2/          # Active PlatformIO firmware (start here)
├── hardware/
│   └── timekeeper/         # KiCad V3 mainboard schematic & PCB layout

Hardware

The PCB provides power, programming, and I2C routing for the core timekeeping components. The display connector exposes a single WS2812B data line and can be wired to any compatible LED clock display.

ComponentPartInterfaceAddress
MCUESP32-WROOM-32——
GPSu-blox NEO-6MI2C / DDC0x42
RTCDS3231MI2C0x68
DisplayWS2812B (any)Single-wire (GPIO 17)—
I2C bus—SDA=GPIO21, SCL=GPIO22—

The custom PCB design (V3) is in hardware/timekeeper/. Open timekeeper.kicad_pro in KiCad 7+.


Firmware

The active firmware lives in software/TickTock2/ and is built with PlatformIO.

Dependencies

Managed automatically by PlatformIO:

  • mikalhart/TinyGPSPlus — GPS NMEA parsing
  • makuna/RTC — DS3231M driver
  • knolleary/PubSubClient — MQTT
  • bblanchon/ArduinoJson — MQTT payload encoding

Bundled in lib/:

  • FastLED — WS2812B LED driver
  • Lixie — Lixie display abstraction (reference implementation; replace for other displays)

Configuration

All settings have defaults in src/config.defaults.h. To override with your own credentials and settings, create src/config.local.h (gitignored):

cpp
// src/config.local.h
#pragma once

#undef  WIFI_SSID
#define WIFI_SSID "your_network"

#undef  WIFI_PASS
#define WIFI_PASS "your_password"

// Optional: MQTT credentials
#undef  MQTT_HOST
#define MQTT_HOST "homeassistant.local"
#undef  MQTT_USER
#define MQTT_USER "mqtt_user"
#undef  MQTT_PASS
#define MQTT_PASS "mqtt_password"

// Timezone — POSIX TZ string
// Full list: https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
#undef  TIMEZONE_POSIX
#define TIMEZONE_POSIX "CET-1CEST,M3.5.0,M10.5.0/3"

An annotated example with all available options is in src/config.local.h.example.

Build & Flash

bash
cd software/TickTock2

# Build
pio run

# Upload via USB
pio run --target upload

# Open serial monitor (115200 baud)
pio device monitor

Time Source Fallback

The TimeManager class selects the best available time source at runtime:

text
Priority:  GPS  >  NTP  >  RTC  >  None
  1. GPS — polled every 5 s over I2C. Used when a valid fix is available.
  2. NTP — synced on startup via WiFi. Used when GPS is unavailable.
  3. RTC — loaded at boot, written back every hour from GPS or NTP. Used when offline.

Time is stored and transmitted in UTC everywhere; the timezone is applied only at display time.


Home Assistant Integration

The display registers itself as an MQTT light via Home Assistant discovery.

MQTT TopicDirectionContent
homeassistant/light/ticktock/configpublishHA discovery payload (JSON)
ticktock/light/statepublishCurrent state (JSON)
ticktock/light/setsubscribeCommands (JSON)

Supported commands:

FieldValues
stateON / OFF
brightness0 – 255
color{"r": 255, "g": 100, "b": 0}
effectSOLID, NIXIE, RAINBOW

Serial Output

While running, the firmware prints the current time and active source once per second:

text
[TimeManager] 2025-03-15 14:32:01 UTC  source=GPS

Enable verbose GPS polling output by setting #define GPS_DEBUG 1 in config.local.h.

Parts

57
QtyValueFootprintReferences
510KResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR4, R7, R12, R13, R17
4100nCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC1, C2, C3, C4
3LEDDiode_SMD:D_0805_2012Metric_Pad1.15x1.40mm_HandSolderD1, D2, D5
210uCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC6, C8
21KResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR14, R15
21uCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC5, C11
23.3kResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR5, R6
2330Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR8, R9
25.1KResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR10, R11
2BC817Package_TO_SOT_SMD:SOT-23Q2, Q3
10Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR16
110Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR3
1100Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR18
11000uCapacitor_THT:CP_Radial_D8.0mm_P3.50mmC9
1100KResistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR1
110nCapacitor_SMD:C_0805_2012Metric_Pad1.18x1.45mm_HandSolderC10
127nInductor_SMD:L_0402_1005Metric_Pad0.77x0.64mm_HandSolderL1
127uNFM31PC276B0J3L:NFM31HK103R1H3LC7
1300Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR2
168Resistor_SMD:R_0805_2012Metric_Pad1.20x1.40mm_HandSolderR19
1AP2112K-3.3Package_TO_SOT_SMD:SOT-23-5U1
1BSS138Package_TO_SOT_SMD:SOT-23Q1
1Battery_CellBattery:BatteryHolder_Keystone_1058_1x2032BT1
1CH340CPackage_SO:SOIC-16_3.9x9.9mm_P1.27mmU4
1Conn_01x02TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-2-3.5-H_1x02_P3.50mm_HorizontalJ1
1Conn_01x02Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ2
1Conn_01x03Connector_JST:JST_PH_B3B-PH-K_1x03_P2.00mm_VerticalJ5
1Conn_01x08Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_VerticalJ3
1Conn_CoaxialConnector_Coaxial:U.FL_Hirose_U.FL-R-SMT-1_VerticalJ4
1DS3232MPackage_SO:SOIC-8_3.9x4.9mm_P1.27mmU5
1D_TVSDiode_SMD:D_SOD-923D3
1D_ZenerDiode_SMD:D_SOD-323D4
1ESP32-WROOM-32RF_Module:ESP32-WROOM-32U3
1LOGOLOGOG***
1NEO-M8MRF_GPS:ublox_NEOU2
1TPD2EUSB30APackage_TO_SOT_SMD:Texas_DRT-3U7
1TVS0500DRVPackage_SON:WSON-6-1EP_2x2mm_P0.65mm_EP1x1.6mmU6
1USB_C_Receptacle_USB2.0Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12J6

The 54 most common of 57 parts.

Questions

How big is the Timekeeper PCB?

It measures 70 × 50 mm and has 4 copper layers, 4.69 mm thick.

What parts does the Timekeeper use?

57 parts, built around the CH340C, ESP32-WROOM-32, NEO-M8M and AP2112K-3.3. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Timekeeper KiCad files?

From the liam-tirpitz/TickTock repository on GitHub, at the commit this page was made from: the board is hardware/timekeeper/timekeeper.kicad_pcb and its schematic hardware/timekeeper/ESP32.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Timekeeper design in my own project?

Its repository states no licence, so its author keeps all rights: ask liam-tirpitz before reusing the design.

Similar boards

  • 2 layers69 × 69 mmCooling Pump Board, the printed circuit board in 3D

    Cooling Pump Board

    byui-formula-hybrid/legacy-Cooling-Pump-Board

    BYUI Cooling pump CAN control board

    37 parts
  • 2 layers112 × 79 mmMacropad, the printed circuit board in 3D

    Macropad

    dbozec/macropad

    Custom wireless macropad

    94 parts1
  • 2 layers45 × 172 mmPh portable refrigerator v2 hw, the printed circuit board in 3D

    Ph portable refrigerator v2 hw

    Blackcastus/ESP32_A7670

    To make it easy for you to get started with GitLab, here's a list of recommended next steps.

    188 parts
  • 4 layers129 × 79.8 mmRc car, the printed circuit board in 3D

    Rc car

    alaotach/rc-car

    Quixie is a small autonomous RC delivery car. The custom PCB handles motor control and sensor expansion; the firmware manages navigation, telemetry, and the locking cargo bay.

    86 parts2
  • 2 layers62.5 × 44 mmAduio device [roject, the printed circuit board in 3D

    Aduio device [roject

    Harshad-vali/esp32-stereo-audio-recorder

    ESP32-WROOM-32 based stereo audio recorder with dual I2S MEMS microphones, RTC timestamping, and microSD logging. KiCad hardware design + manufacturing files.

    49 parts
  • 2 layers175 × 85 mmControl pcb, the printed circuit board in 3D

    Control pcb

    ViKozh/ctrl.energy

    ESPHome-based node for energy monitoring with additional functionality

    113 partsMIT
  • 2 layers50 × 80 mmCoco Seal hardware, the printed circuit board in 3D

    Coco Seal hardware

    ToyotaKosen-Procon2026-Free002/Coco_Seal_Kicad

    Strapping pins に割り当てられているため、2, 8, 9 はちょっと使いづらい

    47 parts