How to build your own Raspberry Pi watch

Our Maker in Residence, Toby, and our Head of Documentation, Alasdair, were both talking about the idea of a Raspberry Pi RP2040-powered watch. While they were looking around to see if anyone else had already come up with the idea and made one, they stumbled across an RP2040-based 1.28-inch TFT display and watch board on Tindie.

RP2040-based Raspberry Pi watch on Toby's wrist

So, with all the engineers at Pi Towers apparently too busy to bow to their watch-needing whims, they went ahead and bought a couple to play around with.

Tindie’s version is priced at $35.50, but what looks like the same board can be found much cheaper on AliExpress if you have the skills to brave that particular shopping experience.

Homemade hacks

The watch Toby and Alasdair purchased comes in two parts: a board with the screen, and a RP2040 main board. The watch came with a strap but not a battery, so they used this inexpensive rechargeable lithium polymer battery, although since the JST battery connector on the main board was an unusual size they both opted to pull it off and solder their batteries directly the contacts on the board rather than try and source the odd connector.

While the watch does ship with pre-installed firmware, which displays a simple watch face, there was no documentation at all. So Alasdair set about reverse engineering to try and find out more about the hardware. At the same time, Toby began designing a 3D-printable case that other Raspberry Pi watch-wanters could replicate themselves. The STL files for that case are available for free on Printables.

Scouting for software

Alasdair poked around inside the firmware and found that the unidentified display was a GC9A01, which meant the display was driveable via SPI from both CircuitPython and MicroPython. He also identified the IMU on the board as a QMIC88658, and which of the I/O pins on the RP2040 the three user-facing buttons were attached to.

Things started to speed up when he discovered that the watch they’d found on Tindie looked really similar to a Waveshare board that used the same 1.28-inch display, and that with a little bit of tweaking for which pins were connected to what, the Waveshare example code worked more-or-less out of the box on their watch. Finally, he stumbled across the GitHub repo for the firmware which shipped on the watch. Which felt to him like a good place to stop.

Alasdair modified his own RP2040 watch so the display is oriented with the top towards his hand, because “that way I can see the time properly when I’m typing“, which is weird of him, but no more than we’ve come to expect.

The code Toby and Alasdair used on the final version of the watch was originally written by Tony Goodhew for the Waveshare board, and we did some small modifications to rotate the watch face.

Dive in with some suggestions if you’ve had a go at integrating the buttons and motion sensors that are available on this watch board that weren’t present on the Waveshare board, as we love a good upgade. You can find the pins they’re connected to elsewhere in Alasdair’s “Hello World” example code.

Lastly, if your preferred learning style is to scroll through a Twitter thread detailing Alasdair’s entire thought process as he worked through this whole make-the-watch-work thing, go here.


Ralph Corderoy avatar

What’s the battery life like?

Toby Roberts avatar

Only about 8 hours as it’s currently setup. Some work needed with the motion sensor to come up with a ‘raise to wake’ type feature perhaps.

Jim avatar

Does it take sd cards?
Whats the speed like?
Is there a place to buy them prebuilt?

Alasdair Allan avatar

The watch is built around our RP2040 microcontroller, so the dual cores run at 133MHz. There is not an SD Card slot on this particular board.

Yes you can buy it pre-built, see the first paragraph, or click here.

Harley Smith avatar

Ok few questions:

1: would one be able to add a module for Qi charging or a form of solar charging?

2:With this set up could one use a 3d printer to make the watch body look unique?

Alasdair Allan avatar

The more things you add to it, the bigger it’s going to get. It’s already fairly bulky. I’ve got a couple of these kicking around the lab, and the coil is more-or-less the right size. So it’s physically doable. But honestly, I think if I was going to add inductive charging I’d probably roll my own board at that point. It’d be cleaner.

However, yes, you can totally take the STL files for the case Toby produced and customise them.

Gordon77 avatar

Nice concept, but battery life a bit limited.

shifty avatar

E-paper is the answer.

Alasdair Allan avatar

I’d tend to agree, and you can get round e-ink displays these days.

That said, there’s a bunch you can do in software to improve the battery life of this watch. None of the example code I wrote for it made any attempt at power management of either the display or the RP2040. There are a bunch of fairly easy fixes you could put in place to help power management. For instance, you could use the IMU to have motion-based activation of the display and the RP2040 itself, so bringing the watch up to look at the time would turn the display on, at other times it could be powered down. My guess is that you could extend the battery life by a ×2 without thinking too hard about things.

However, this board doesn’t have a RTC, so it’s definitely in the “toy” category rather than an attempt at a serious watch build. Still pretty cool though!

Anders avatar

There are Arduino watches and ESP32 ones out there. An OpenSmartwatch OS project on GitHub.

I tried an ESP32 one some time ago, the OS ongoing development became too big for the storage so it has been at the back of the drawer 101 since.

Anders avatar

I’ve hunted the watch out, it’s a LilyGo.

Alasdair Allan avatar

Really? I had a poke around their site when I was reversing the board and couldn’t see anything. Can you link to it?

The circuitry looks like a copy of a Waveshare board, with some changes — the addition of LiPo charging circuitry, buttons, and the physical split between display and main boards.

Anders avatar

LilyGo T-Watch.

There is a V3 out now. Mine is a V1. There is also an E-Paper version.

Alasdair Allan avatar

The TTGO T-Watch 2021 is the round version. But that isn’t based on the RP2040, it’s built around the ESP32. Do you have a direct link to an RP2040-based version?

Anders avatar

Crossed wires here Alisdair, in my original comment I was referring to my experience with ESP32 watch projects. Since I read about this, I had a hunt around the parts drawer and found the old LilyGo watch.

Anders avatar

I think crossed wires, I was talking about my experience with an early version of the T Watch which I hunted out of a drawer.

Presumably you’ve seen this?

Anders avatar

I think crossed wires, I was talking about my experience with an early version of the T Watch which I hunted out of a drawer.

Presumably you’ve seen this?

Alasdair Allan avatar

Yup. I’ve spent a bunch of time hacking with open-ish watches.

I honestly wasn’t that happy with the TTGO T-Watch, but for a good long while the Bangle.js was my daily driver. I wore both the big round first generation, and the smaller rectangluar second generation Bangle smart watches.

fanoush avatar

The Bangle.js watches are based on nrf52 platform and there are quite a few cheap ($15 and up) hackable nrf52832/52840 watches from China. Just google Espruino and names like Rock, Magic3, P22, P8, SN80 – basically any shape/size/price. Most can be updated OTA, some have screws and can be opened and flashed via SWD (G5, GW32). The point is – they have BLE and can last over month on single charge with BLE turned on! (unlike ESP32 or RP2040 based thing). Sunlight readable is Bangle2/Q3, then DK08 which is hard to get nowadays and the G5 has 454×454 AMOLED that can last few days in low power always on mode too ($49 thing on aliexpress).

So while it is nice to make your own hardware, there is also some cheap and good stuff you can just get and hack.

Alasdair Allan avatar

You’re replying to a comment where I just said I owed most of those watches, and a few more. I was a big Pebble fan back in the day. Not sure what your point is? This is cheap and hackable? To the point it’s not really a watch, it’s a dev board.

fanoush avatar

My post was just a followup with some more related info that anyone can find interesting. It was not a reply specifically to you. It is related to Bangle.js so I made a reply to your related post.

Points were 1. this is a toy/devboard, not a watch 2. ESP32 watches are mostly toys too . 3. There are cheap real watches (possibly cheaper that this, cheaper than esp32 toy developer watches) that are not just a toys – one has some chance to actually wear them daily with good battery life, some sort of waterproofness etc. And those real watches are hackable.

fanoush avatar

And btw both Bangle.js watches are precisely this – real mass produced ‘smart’ watches with good and cheap hardware and mediocre original firmware (plus typical mobile fitness spyware app) which were reverse engineered and updated with custom open firmware and re-sold as such.

And regarding “You’re replying to a comment where I just said I owed most of those watches, and a few more.” – no, not at all, while I was not responding to you, you did not mention any of those watches I was talking about.


Great to see my watch face code put to good use. It would have been nice for my code to have been acknowledged more prominently.

Alasdair Allan avatar

Added a link to your original!

Travis Thundershield avatar

Absolute beginner here,
I just bought the display and watch board to start learning. Can you point me in the right direction of a starting point? I’m already proficient in python I’m just not sure how to start using it for hardware. Thank you!

Toby Roberts avatar

Hey Travis. Because this watch is RP240 based, take a look at the documentation for our Raspberry Pi Pico (also RP2040 based) and programming with Thonny. That should get you started. Best of luck.

Ryan avatar

I found a 602030 Lipo battery where the JST connector fits perfectly. It is a PH 1.25 JST Connector, the battery comes with 2.0 and 2.54 sizes too.

Mike D avatar

If anyone’s interested in setting the time from the system clock, add these lines:
import utime
#Get system time
current_time = utime.time()
# Convert the timestamp to local time
local_time = utime.localtime(current_time)
# Extract the individual components of the local time
year, month, day, hour, minute, second, weekday, yearday = local_time
# Start time
h = hour
m = minute
s = second

Mike D avatar

Following my comment above, I’ve not incorporated a day-date function. Happy to share upon request.
If anyone has figured out the button GPIOs I’d love to hear from you.

alan avatar

Thank you for your support, the schematic diagram and reference code have been updated on github, the link is as follows:
Email us if you have any questions
[email protected]

Ashley Whittaker avatar

Everyone LOVED this project Alan. TikTok and Instagram went wild for it.

Logan avatar

The icbbuy github is 404’ing. Is this project still active?

Comments are closed