Motivation

This year I attended Open Sauce (2025) for the first time, and I spent a long time deciding what to build for it. I’d be flying there so whatever I built needed to be airport security friendly. I also didn’t want to be carrying around a heavy build for two days. A small wearable project sounded like a good idea and I had been kicking around the idea of making a custom watch for a while. This ended up being my first build outside the Arduino ecosystem and the smallest SMD soldering I’ve done to date. All things considered, I’m really pleased with how it turned out!

A huge inspiration was Joe Sullivan’s similar take on a PCB watch. I took a slightly different approach, simplifying the interface to a single tactile button. I preferred the cleaner look without the daughter board and (more importantly) I wasn’t up to dealing with the complexity of it.

Specs

Dimensions29 mm diameter, 7 mm thick
Accuracy0.43 seconds/day, ~5 ppm
Current draw28.5 µA @ 3 V
Battery typeCR1220
Runtime on 40mAh battery Draw~58 days (estimate)

I only measured the accuracy and current draw on a single board so I don't know how repeatable they are. I'm pretty happy with the limited results I did get though.

Case Compatibility

Before I started designing anything, I needed to select a watch case and figure out how much room I had to work with. I eventually settled on cases designed for the Seiko NH35 movement and 29 mm dials. Seiko modding is a popular hobby and the NH35 a common movement, giving plenty of options in a variety of sizes on AliExpress (which came in handy when my wife said she wanted one too).

NH35 Spec: https://www.timemodule.com/uploads/attachments/download/Spec%20Sheet/NH35_SS.pdf

Component Selection

With an idea of the overall size, the next step was to figure out how to actually display the time. I used a 4-digit segmented LCD display complete with colon and three decimal points. It’s the right size and requires very little power to drive. I would’ve preferred more digits to also show the date but couldn’t find a suitable part. 

I used a PIC16F1938 as it has a bunch of handy features for this application: built-in LCD driver, low-power Sleep mode, and a dedicated 32.768 kHz oscillator driver. It’s available in both DIP (for prototyping) and SSOP (for PCB) packages with readily available programmers. Microchip also has application notes for building clocks with their chips (AN649) and readily available development boards. Since I was new to the PIC ecosystem, the Curiosity Board DM164136 was great for quickly getting started. 

I went with a 32.768 kHz quartz crystal oscillator to keep time, taking advantage of the PIC16's dedicated oscillator driver. It’s not temperature-compensated but accurate enough for me. I added a small tactile button for the user interface, a few passives, and filled the rest of the PCB with the largest battery I could fit: a 40 mAh CR1220.

Board Layout

Since this is a watch, component placement was primarily driven by what I thought looked nice. That means only the PIC16 and LCD on the visible front side, and centered of course.

One tip I picked up from the Microchip dev board: the through holes for the programming header are staggered. It creates enough friction to hold a 0.1” pitch header in place for programming without having to add any extra features. 

I designed some quick 3D-printed spacers to hold everything in the watch case at (mostly) the correct height. These were easily my least favorite part of the build. I hadn't built any anti-rotation features into the PCB, so the spacers have tiny features that register in the through holes for the programming header. I knew I'd have access to the DLP printer at my workplace to get myself out of trouble (and it did) but wish I had better planned this. 

If I order more of these boards in the future I would include a keying notch to make the prints easier, and I'd also get an edge-mount button so it's easier to press through the crown opening in the watch case.

Firmware

To minimize power consumption, the PIC16 is left in Sleep mode as much as possible with only the LCD and crystal oscillator running. The crystal runs Timer1 which is configured to overflow each second. When it does, the PIC16 wakes from Sleep, advances the second count, checks if the minute/hour needs to advance, and updates the display. After that it’s back into Sleep mode until the next interrupt is triggered.

On each interrupt there’s also a check to see if the button is pressed. If it has been for three consecutive interrupts (i.e. the button has been held down for at least 3 seconds), the watch stops keeping time, lights one of the decimal points, and waits for user input. The PIC16 only has a single interrupt vector so the same interrupt service routine is repurposed to also measure how long the button has been held down, distinguishing between a short and long press.

Lessons Learned (and Building Another)

Going into this project I tried to design for compatibility with a wide selection of NH35 watch cases. That was mostly because I wanted to give myself as many options as possible. That turned out to be a wise decision when my wife wanted a watch of her own. I usually wear 40mm watches and she wanted something much smaller. I was easily able to find a 33mm case from the same AliExpress store where I bought mine. The result is two watches with very different character using the same PCB.

Overall I’m incredibly pleased with how this turned out. There are definitely things I’d change (mostly the 3D printed spacers, see GitHub for the full list) but I now have an everyday watch that I built myself. My wife and I have been wearing ours often and it’s been like using any other watch. Can't ask for more than that!