Skip to the content
2 layers53.5 × 53.5 mmPomodoro Timer, the printed circuit board in 3D

A fully custom embedded productivity cube featuring a Pomodoro timer, digital clock, virtual pet, productivity tracker, and magnetic charging dock.

Size
53.5 × 53.5 mm
Copper layers
2
Thickness
1.6 mm
Parts
20
Nets
19
Pads
63
Tracks, vias
225, 0
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
25 Jun 2026
Updated
14 Aug 2026

Overview

Pomodoro Timer is an open-source printed circuit board by phampaul07, from the phampaul07/Pomodoro-Cube repository on GitHub, published under the MIT licence. It is a 2-layer board of 53.5 × 53.5 mm with 20 parts on 19 nets, routed with 225 tracks and 0 vias.

It is built around the DS3231S#. Its parts include 8 connectors, 5 capacitors, 2 resistors and 1 switch.

Main components

1

README

README.md

Smart Pomodoro Cube

A fully custom embedded productivity cube featuring a Pomodoro timer, digital clock, virtual pet, productivity tracker, and magnetic charging dock.

CircuitPython • ESP32-C3 • Embedded Systems • CAD • 3D Printing • Analog Electronics • KiCad


README Contents


Overview

The Smart Pomodoro Cube is a handheld productivity device that combines embedded systems, hardware engineering, and industrial design into a compact form factor no larger than a standard Rubik's Cube.

Instead of navigating through menus or using a touchscreen, the cube uses its physical orientation to select timer durations. Once docked onto its custom magnetic charging station, it transforms into an entirely different interface featuring an interactive virtual pet, productivity tracker, and quick-access study tools.

Every major component—including the enclosure, charging dock, firmware, custom KiCad PCB, and user interface—was designed specifically for this project.

The goal was not only to create a useful studying companion, but also to explore embedded systems, custom electronics, CAD, and hardware-software integration while fitting everything inside an extremely limited volume.


Demonstrations

The Pomodoro Cube has two primary modes of operation.


Standalone Cube

Click the thumbnail above to watch the standalone demonstration.

Demonstrated Features

  • Real-time clock
  • Battery percentage
  • Temperature monitoring
  • Cube orientation timer selection
  • Pause / Resume
  • Timer reset
  • Countdown progress bar
  • Portable battery operation

Interactive Charging Dock

Click the thumbnail above to watch the dock demonstration.

Demonstrated Features

  • Magnetic docking
  • Automatic dock detection
  • Charging indicator
  • Clock Mode
  • 15-minute Quick Timer
  • Interactive Tamagotchi Pet
  • Petting animation
  • Productivity Stats

Features

Digital Clock

When idle, the cube functions as a portable desk clock displaying:

  • Current time
  • Battery percentage
  • Temperature
  • Charging status

using an external RTC module and onboard sensors.


Pomodoro Timer

The cube's primary function is a distraction-free Pomodoro timer.

Simply rotate the cube onto one of its faces to instantly choose a timer duration.

Features include:

  • Multiple timer durations
  • Pause / Resume
  • Reset
  • Bar progress visualization
  • Completion notification via beeps
  • Battery-powered portability

Magnetic Charging Dock

One of the biggest design goals was eliminating cables during normal use.

The cube charges magnetically using pogo pins while simultaneously detecting dock states and reading dock button presses.

The charging dock was hand-built using a custom perfboard and soldered circuitry, while the internal electronics of the cube itself are mounted on a custom-designed PCB routed in KiCad.


Dock Modes

Docking the cube unlocks four additional operating modes.

Clock

Displays the standard clock while charging.


Quick Timer

Instantly adds study time in 15-minute increments without rotating the cube.


Tamagotchi

An interactive Tamagotchi-inspired virtual pet.

Features include:

  • Idle animations
  • Random blinking
  • Petting animation
  • Smooth sprite animation
  • Physical interaction using dock buttons

Productivity Statistics

Tracks long-term study habits including:

  • Daily focus time
  • Focus sessions
  • Daily streak
  • Lifetime sessions

Hardware

ComponentPurpose
Seeed Studio XIAO ESP32-C3Main Microcontroller
Custom KiCad PCBMain Board / Cube Electronics
1.28" Round GC9A01 IPS DisplayUser Interface
MPU6050Orientation Detection
RTC ModuleTimekeeping
3.7V LiPo BatteryPortable Power
Magnetic Pogo PinsCharging & Communication
Custom PerfboardDock Electronics

Getting Started

This runs on CircuitPython rather than compiled firmware, so there's no build/flash toolchain — the board mounts as a USB drive and files are copied directly onto it.

  1. Flash the CircuitPython UF2 for the Seeed Studio XIAO ESP32-C3 (hold BOOT while plugging in, drag the .uf2 onto the ESP32C3 drive).
  2. Once it reboots into CircuitPython, it'll appear as a CIRCUITPY drive. Copy the entire firmware/ folder's contents onto it: code.py, animation.py, dock.py, the .bmp sprite assets, and the lib/ folder of vendored Adafruit libraries.
  3. code.py is the entry point — CircuitPython auto-runs it on boot. firmware/legacy/standalone_cube.py is an earlier, dock-less iteration kept for reference only; it isn't used.
  4. The board reloads automatically any time code.py is saved. Thonny (or any serial-capable editor) works well for live editing and viewing the serial console.

Mechanical Design

A major objective of this project was fitting an entire embedded system inside the volume of a standard Rubik's Cube.

This required careful consideration of:

  • Internal component placement
  • Custom PCB dimensions and mounting
  • Cable routing
  • Battery placement
  • Display clearance
  • Magnet positioning
  • Dock alignment

Engineering Deep Dive

Analog Button Multiplexing

Because the magnetic pogo pin interface between the cube and the dock only has four physical connections (5V, GND, 3.3V, and a single data line), it was physically impossible to dedicate separate GPIO pins for each of the four dock buttons.

To overcome this hardware constraint, every dock interaction is transmitted through the single available analog pin using a resistor ladder. Each button routes current through a different resistor, producing a unique voltage.

The ESP32 reads this incoming voltage through its ADC and determines which button was pressed based on predefined threshold ranges.

text
Button 1 → Home Clock
Button 2 → Quick Timer
Button 3 → Tomo
Button 4 → Productivity Stats

Battery Monitoring

A fully charged LiPo battery outputs approximately 4.2V, exceeding the ESP32's safe analog input voltage.

To safely monitor the battery, a voltage divider using two identical 10kΩ resistors cuts the voltage in half before it reaches the ADC.

Hardware Flow:

text
Battery
↓
Voltage Divider
↓
ESP32 ADC

Software Logic:

text
ADC Reading
↓
Measured Voltage
↓
×2
↓
Actual Battery Voltage
↓
Battery Percentage

This approach allows safe and accurate battery monitoring without risking damage to the microcontroller.

2021031915491336

Firmware Architecture

The firmware is built around a finite state machine.

text
Standalone
 └── Clock
      │
      ▼
    Timer

Docked
 └── Clock
      ├── Quick Timer
      ├── Tomo
      └── Productivity Stats

Separating functionality into individual states simplified transitions, animations, and memory management.


Software Highlights

  • CircuitPython firmware
  • SPI-driven GC9A01 display
  • TileGrid sprite animations
  • Memory-efficient bitmap loading
  • Real-time battery monitoring
  • Dock state detection
  • ADC signal filtering
  • Finite State Machine architecture

Challenges

This project introduced me to several engineering disciplines simultaneously.

Mechanical

  • First complete CAD enclosure
  • Designing around extremely limited internal space
  • Dock alignment tolerances

Electrical

  • Designing a custom PCB in KiCad for the cube's internal layout
  • Designing analog resistor ladder circuits
  • Designing a voltage divider
  • Magnetic pogo-pin charging
  • Battery management
  • Dock signal integrity

Embedded Software

  • Memory optimization
  • Bitmap management
  • Animation timing
  • Display flickering
  • ADC calibration
  • State machine architecture

Debugging

Some of the most time-consuming issues included:

  • ESP32 memory limitations
  • Magnetic charging reliability
  • Analog threshold calibration
  • Battery percentage accuracy
  • Dock signal filtering
  • Sprite memory fragmentation

Many of these required custom diagnostic firmware, multimeter testing, and extensive trial-and-error before arriving at stable solutions.


Lessons Learned

This project taught me far more than simply building a productivity timer.

Some of the biggest skills I developed include:

  • Embedded Systems
  • CircuitPython
  • Analog Circuit Design
  • PCB Design (KiCad)
  • Hardware Debugging
  • CAD
  • 3D Printing
  • Battery Management
  • SPI Displays
  • Embedded UI Design
  • Firmware Optimization
  • State Machine Architecture

Future Improvements

Although the current prototype is fully functional, there are several improvements I would like to explore.

  • Custom PCB for the charging dock to replace the perfboard prototype
  • Improved magnetic charging reliability
  • Lower-power sleep mode
  • Configurable timer durations
  • Improved charging dock alignment
  • Historical productivity graphs
  • Rotating screen animation to make the interface fixed

Gallery

CubeDock
IMG_2750IMG_2749
Real-Time ClockIterated Timer
IMG_2753IMG_2754
TamagotchiStats
IMG_2757IMG_2756
PCBWiring
front_pcbcomponents

Acknowledgements

This project was independently designed and built using CircuitPython on the Seeed Studio XIAO ESP32-C3.

It combines concepts from embedded systems, analog electronics, firmware development, mechanical design, PCB design, and human-centered interaction into a single portable productivity device.


Contact


If you enjoyed this project, consider leaving a star!

Parts

20
QtyValueFootprintReferences
5CCapacitor_SMD:C_0603_1608MetricC1, C2, C3, C4, C5
4MountingHoleMountingHole:MountingHole_2.2mm_M2_PadH1, H2, H3, H4
210k OhmsResistor_SMD:R_0603_1608MetricR1, R2
2~Connector_PinHeader_2.54mm:PinHeader_1x07_P2.54mm_VerticalJ1, J2
1BAT+Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalJ8
1BuzzerConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJ7
1DS3231Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_VerticalJ4
1Dock Pogo PadsConnector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_VerticalJ5
1Gc9A01AConnector_PinHeader_2.54mm:PinHeader_1x07_P2.54mm_VerticalJ3
1MPU 6050Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_VerticalJ6
1SW_PushConnector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_VerticalSW1

Similar boards

  • 4 layers68.6 × 53.3 mmTapMatrix, the printed circuit board in 3D

    TapMatrix

    cbonsig/openclock

    Open Clock: an open source hardware touchscreen digital clock

    65 parts27
  • 2 layers398.2 × 398.2 mmLargeWordClock LargeKickstarter, the printed circuit board in 3D

    LargeWordClock LargeKickstarter

    PCBench/PCBench

    resolution = [0.5, 0.5] pcbfolder = '../PCBs/' pcbnames = ["1Bitsy1bitsy"] iters = 30 env = PCBRoutingEnv(resolution=resolution, pcbfolder=pcbfolder, pcbnames=pcbnames) obs, info = env.reset() for in range(iters): act =…

    1,591 parts21MIT
  • 2 layers167 × 52 mmIn-2-nixie, the printed circuit board in 3D

    In-2-nixie

    mistic100/Nixie-Clock-IN2

    Check out my other projects: - Nixie Clock IN14 - Nixie Clock IN12 - IV-27 VFD Clock

    34 parts10
  • 2 layers200 × 66 mmNixie control board, the printed circuit board in 3D

    Nixie control board

    shengwen-tw/nixie-clock

    IN-14 Russian nixie tube clock

    79 parts9MIT
  • 2 layers100 × 100 mmMK2090 PERI order, the printed circuit board in 3D

    MK2090 PERI order

    ptravnik/Retro_CALC

    A powerful RPN calculator, programmable in BASIC

    50 parts8GPL-3.0
  • 2 layers83.5 × 45 mmArducon, the printed circuit board in 3D

    Arducon

    OpenARDF/Arducon

    A transmitter controller for Amateur Radio Direction Finding (ARDF). Based on the Arduino Pro Mini.

    114 parts7MIT
  • 2 layers32.5 × 24 mmRpi rtc, the printed circuit board in 3D

    Rpi rtc

    skiselev/rpi_rtc_ds3231

    Maxim DS3231 Based RTC Module for Raspberry Pi

    7 parts7GPL-3.0

Questions

How big is the Pomodoro Timer PCB?

It measures 53.5 × 53.5 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Pomodoro Timer use?

20 parts, built around the DS3231S#. 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 Pomodoro Timer KiCad files?

From the phampaul07/Pomodoro-Cube repository on GitHub, at the commit this page was made from: the board is hardware/Pomodoro Timer.kicad_pcb and its schematic hardware/Pomodoro Timer.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Pomodoro Timer design in my own project?

Its repository publishes it under the MIT licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).