

Pomodoro Timer
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
1README
README.mdSmart 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
- Demonstrations
- Features
- Hardware
- Getting Started
- Mechanical Design
- Engineering Deep Dive
- Software Highlights
- Challenges
- Lessons Learned
- Future Improvements
- Gallery
- Acknowledgements
- Contact
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
| Component | Purpose |
|---|---|
| Seeed Studio XIAO ESP32-C3 | Main Microcontroller |
| Custom KiCad PCB | Main Board / Cube Electronics |
| 1.28" Round GC9A01 IPS Display | User Interface |
| MPU6050 | Orientation Detection |
| RTC Module | Timekeeping |
| 3.7V LiPo Battery | Portable Power |
| Magnetic Pogo Pins | Charging & Communication |
| Custom Perfboard | Dock 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.
- Flash the CircuitPython UF2 for the Seeed Studio XIAO ESP32-C3 (hold BOOT while plugging in, drag the
.uf2onto theESP32C3drive). - Once it reboots into CircuitPython, it'll appear as a
CIRCUITPYdrive. Copy the entirefirmware/folder's contents onto it:code.py,animation.py,dock.py, the.bmpsprite assets, and thelib/folder of vendored Adafruit libraries. code.pyis the entry point — CircuitPython auto-runs it on boot.firmware/legacy/standalone_cube.pyis an earlier, dock-less iteration kept for reference only; it isn't used.- The board reloads automatically any time
code.pyis 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.
Button 1 → Home Clock
Button 2 → Quick Timer
Button 3 → Tomo
Button 4 → Productivity StatsBattery 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:
Battery
↓
Voltage Divider
↓
ESP32 ADCSoftware Logic:
ADC Reading
↓
Measured Voltage
↓
×2
↓
Actual Battery Voltage
↓
Battery PercentageThis approach allows safe and accurate battery monitoring without risking damage to the microcontroller.
Firmware Architecture
The firmware is built around a finite state machine.
Standalone
└── Clock
│
▼
Timer
Docked
└── Clock
├── Quick Timer
├── Tomo
└── Productivity StatsSeparating 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
| Cube | Dock |
|---|---|
| Real-Time Clock | Iterated Timer |
|---|---|
| Tamagotchi | Stats |
|---|---|
| PCB | Wiring |
|---|---|
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
- Paul Pham — phampp07@gmail.com • linkedin.com/in/paul-pham07
If you enjoyed this project, consider leaving a star!
Parts
20| Qty | Value | Footprint | References |
|---|---|---|---|
| 5 | C | Capacitor_SMD:C_0603_1608Metric | C1, C2, C3, C4, C5 |
| 4 | MountingHole | MountingHole:MountingHole_2.2mm_M2_Pad | H1, H2, H3, H4 |
| 2 | 10k Ohms | Resistor_SMD:R_0603_1608Metric | R1, R2 |
| 2 | ~ | Connector_PinHeader_2.54mm:PinHeader_1x07_P2.54mm_Vertical | J1, J2 |
| 1 | BAT+ | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | J8 |
| 1 | Buzzer | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J7 |
| 1 | DS3231 | Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical | J4 |
| 1 | Dock Pogo Pads | Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical | J5 |
| 1 | Gc9A01A | Connector_PinHeader_2.54mm:PinHeader_1x07_P2.54mm_Vertical | J3 |
| 1 | MPU 6050 | Connector_PinHeader_2.54mm:PinHeader_1x08_P2.54mm_Vertical | J6 |
| 1 | SW_Push | Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | SW1 |
Similar boards
- 4 layers68.6 × 53.3 mm

- 2 layers398.2 × 398.2 mm

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 layers147.3 × 95.3 mm

Nixie proj conflict-20171112-163801
dm2lct/tlnixie
PCB files for the Turmlabor nixie clock 2.0
117 parts11GPL-3.0 - 2 layers167 × 52 mm

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 mm

- 2 layers100 × 100 mm

MK2090 PERI order
ptravnik/Retro_CALC
A powerful RPN calculator, programmable in BASIC
50 parts8GPL-3.0 - 2 layers83.5 × 45 mm

Arducon
OpenARDF/Arducon
A transmitter controller for Amateur Radio Direction Finding (ARDF). Based on the Arduino Pro Mini.
114 parts7MIT - 2 layers32.5 × 24 mm

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).