Pace

- A Minute Timer for Swimmers

Description

Pace is a small timer I made after our pool closed, when I was still a competitive swimmer and wanted a way to keep pace while training alone.

In swimming it's hard to gauge how fast you are actually moving when you don't have someone to pace yourself against. There is the minute clock on the wall but you can only see that at the wall or during a breath. I wanted something that I could race against.

The eight-layer PCB is smaller than a euro one-cent coin (13mm diameter). A ferrous disc on the back lets it sit on glasses or swimming goggles when you put a magnet on the other side of the glass. It also activates with the magnet.

Sixty LEDs run around the edge. A seconds hand moves one position every second, a minute hand advances once per lap, and a fixed north marker keeps the display readable. The quarter marks are yellow and all other LEDs are green. They appear to be on together, but the STM32L0 is charlieplexing the ring across nine GPIO lines and driving one LED at a time in one-millisecond slices. That was partly a layout decision and partly a power-budget decision for the tiny rechargeable coin cell.

Pace lives in a printed charging case with its own battery and USB-C input. Spring-loaded pogo contacts meet the two charging pads when the timer is pressed into the insert, so the case can charge Pace without putting a connector on the timer itself.

Build

I built the first two versions in the summer before my Leaving Cert. V1 used eight daisy-chained shift registers, a quartz oscillator, and a delayed latching circuit to inject the first bit. It was an elaborate way to move one light around a ring. I posted it on Reddit, got a fairly blunt review, and moved to an STM32 and LED matrix driver for v2.

The second review was kinder. One comment said, “It's a truly beautiful board layout. I hope it works!” Another immediately asked, “What will happen if battery voltage drops under 3.4ish?” Both were fair. That board reached the point of ordering before I realised its buried vias would add about €500. I never ordered it.

The project sat for a while. In November 2025 I picked it up again and rebuilt it rather than trying to rescue v2: a new Pace board, a separate charge board, a new case, and new firmware. The useful change was charlieplexing. Sixty LEDs only need nine bus lines, so the external matrix driver and buried-via layout disappeared while the board stayed coin-sized.

The board was so much fun to assemble. I placed parts through 6 loupes taped together for roughly 10× magnification and reflowed it in an oven I had made from a halogen floodlamp. It took me about 6 hours to place and in the meantime the flux for the solder paste had evaporated. So I ran a second reflow cycle with plenty flux to fix the pillow in head defects that plagued over half of the LEDs. There were many moments before and after reflowing where I looked at it wrong and 4 LEDs pinged off and then I had to replace them while hoping not to fry the rest of the board. Pace rev3 has weathered more than 20 reflow cycles. I also tried casting the electronics in a resin-printed mould. The release spray did not release, so I ended up carving the board back out through fibreglass and resin. It survived.

The firmware uses the 32.768kHz crystal and RTC for the one-second tick, then shares the display time between the two hands and north marker. I wanted the startup to feel less like a circuit waking up, so it begins with a short random sparkle. There is no stored animation: on every boot the ADC samples the internal voltage reference 32 times, mixes the lowest four noisy bits of each reading into a seed, and feeds that into a xorshift generator. The resulting pattern is different each time, then the hands move into place and the timer starts.

The case went through its own set of iterations. I wanted the body and insert to work like the AirPods case I use every day: a continuous outer shell, with the insert seam hidden by the lid rather than left as a visible split around the body. That made the finished object cleaner, but it also meant fitting a charge board, battery, contacts, and wiring into a shape that had not been especially generous to any of them.

The charge board then behaved just well enough to be confusing. With USB connected, the blue Pace-charge LED would flicker and go out while the green case-battery LED stayed on. The boost stage and two charging paths made the readings look circular, and I had already added a flywire after modifying the board to fit the printed assembly. The fault was under a capacitor. I lifted it and found a paste-like bridge underneath; with the capacitor removed the short disappeared. I cleaned the pads, put the capacitor back, and the short stayed gone. The battery sat around 3.5V and stayed.

The last part was mostly mechanical soldering. I soldered the pogo pins to wires, passed the wires through holes in the case insert, heat-set the pins into place, then connected them to Pace+ and ground on the charge board. It was 3:10am when I stopped before the final two joints. By then Pace fitted the insert, the case battery was charging, and pressing the timer onto the contacts produced a voltage across the pogos. The assembly was no longer hypothetical.

This is the third and final version: the one being posted and shipped rather than another board waiting to be ordered. I started Pace because I swam. I don't swim anymore, but I have been using it to time strength, conditioning, and flexibility work instead. The use changed while the project sat; the timer did not need to.

With a blunt 30-gauge needle balanced between both thumbs and index fingers, and my forearms resting on the desk for support, I could pick up the 01005 LEDs (0.4 × 0.2 mm) with friction alone.

In future, for waterproofing my projects I will conformally coat them with Parylene C or some equivalent, by myself, naturally :)

V3.0 - Charlieplexed timer and charging case

Working Pace v3 held beside a euro one-cent coin Pace v3 held above its assembly jig Close view of the Pace v3 PCB and its ring of LEDs Pace fitted into a charging case insert during assembly

V3.0 - Charlieplexed timer board

Pace v3 timer 3D board render Pace v3 timer PCB layout Pace v3 main board schematic

V3.0 - Universal charger

Pace universal charger 3D board render Pace universal charger PCB layout Pace v3 charging case schematic

V2.0 - STM32L0 and LED matrix driver · Reddit review

Pace v2 3D board render Pace v2 PCB layout Pace v2 schematic

V1.0 - Discrete logic · Reddit review

V1 used eight shift registers and a latching circuit to create the first bit that moved around the ring. The first video shows the pulse-generating latch; the second shows the daisy-chained registers.

Pace v1 3D board render
Pace v1 PCB layout
Please do not try review this
Pace v1 schematic