Watchy Project

This page will capture my notes about my Watchy project.

What is Watchy?

An open source e-ink watch built on a powerful ESP32 processor with wifi, bluetooth, gesture detection, and customizable watch faces.

It’s sold by SQFMI as a kit.

My goals for the project.

Fun, mostly! I’ve been dabbling in electronics and programming and this is my first chance to use those skills to make something personally useful.

Eventually, I want to design a custom watchface with step counter functionality.

First Impressions / Day One

The kit looked nice inside the box and the plastic watch case was smoother and more substantial than I’d expected. I liked that the board components were labeled so neatly, it made it easy to figure out how the board functions.

The Watchy development board. Small chips on a watch-shaped PCB, some square, some round. Don’t worry, I turned the board right-side up!

I followed the initial instructions for the build and nothing worked like I expected. The buttons did nothing! The screen refreshed halfway and froze. And the connection for the e-ink screen kept popping out. Also, the micro USB was painfully tight. Lastly, the device wouldn’t show up in my Arduino software.

An e-ink screen that looks like a garbled mess

😬 I wondered if I’d received a bum unit.

My issue: The port that accepts the thin gold-colored connector (bus?) for the e-ink display has two teeny clips that must be pushed down to lock it in place. As soon as I figured that out, the screen stopped ghosting and the buttons worked. I spent a solid hour troubleshooting before I figured that out. 🤦🏼‍♀️ The clips weren’t just for holding it in place, either. They must have tightened down and closed the circuit connection.

Frustrated with Arduino’s inability to see my device, I used SQFMI’s “Bluetooth Beta” to pair the watch to my laptop and upload the Starry Field sketch to the phone. It worked! Note, this worked on Chrome with a bluetooth enabled laptop. it didn’t work with my phone.

The Watchy screen says firmware downloading, and the number of bytes

I installed the recommended drivers to make the device visible to Arduino. When that still didn’t work, I read through open issues in Github. My issue is a common one, and it may be fixable by changing the Arduino configuration. So I’ll try that next time.

The Watchy is big and blocky like a 1980s calculator watch. I need to take care not to get it wet. But it’s light and comfortable.

The assembled Watchy on my wrist, big, black and blocky.

So far, so good. I assembled the components, updated the firmware via Bluetooth, and I had a functional e-paper watch. Not bad for a beginner.

When I woke up the next morning around 9am, my watch said it was 11pm? I’ll add that issue to my list.

Getting Into It

During my second session with my Watchy I was able to access the watch via the Arduino IDE on Windows. I copied project files from the following watchfaces into Arduino, one at a time, and flashed them onto my phone:

To see what these watchfaces look like, check this site or check the image files in the code repositories below

Watchy LCARS, which looks like an old-school Star Trek Watch.

Watchy Bahn, which is based on a Pebble smartwatch watchface.

Watchy SMB, a cute retro NES watchface reminiscent of a certain princess-rescuing plumber.

Watchy DOS, a watchface that looks like a file list from the old DOS operating system.

Modifying Code

I’m still very new to programming, so it’s been helpful to read the Arduino/C code for each watchface and try to figure out what’s going on. Some examples:

  • I loved the LCARS watch face, but it includes a bunch of button functions for home automation, and I wasn’t able to excise those bits of code without breaking the compile. Unfortunately, using the watchface without the home automation server activated would “break” the watch when buttons were pressed.

  • The Bahn watchface had a neat little line of code that resets the watch’s step counter at midnight. It was also nice and readable.

  • The Watchy SMB uses the OpenWeather API to pull in the temperature for your city. While I was tinkering with that one, I learned how to set up an OpenWeather account, set up an API call, switch from celcius to farenheit, and change the C to an F.

I really liked the WATCHY-DOS watchface, even though the print is tiny, but the only thing it did was to show the time of day. There was no way to know how much battery you have remaining, or anything else. I decided to see if I could modify the watchface to sneakily add the information I wanted without changing the look and feel too much.

WATCHY-DOS is mostly a bunch of print statements. I added in some supported Watchy functions (such as retrieving the battery voltage) in various places to add in the sensor data I wanted.:

display.print(” CHERI-DOS “);


This prints the top line on the watch face, CHERI-DOS 4.22. It looks like a version number, but 4.22 is actually my battery voltage. The number goes down as my battery is depleted.

I did the same thing to “sneak in” the month and day, my steps taken, and the day of the week. It looks something like this:

Cheri's e-ink Watch, which looks like a DOS file system.

Next, because I’d added a step counter, I borrowed that line of code from the Bahn watchface to reset the step counter at midnight. Otherwise the steps would accumulate indefinitely. This kind of tinkering, borrowing, and sharing is possible due to the permissive MIT license used by watchface designers. You can review or use my code for Cheri DOS (which I’ve renamed as Happy DOS) here on Github.

Minor Complaints

As a baby programmer, my ongoing complaint about learning to code is the persistent lack of documentation. The functions that I added to Happy DOS included things like getBatteryVoltage, currentTime.Month, and sensor.getCounter. I learned about those functions by seeing them in other people’s code, but I haven’t been able to find a legend that says “here are the list of functions and what they do”.

It’s possible this stuff is documented somewhere, but I haven’t been able to find it. And the lack of documentation is a huge barrier for newbies like me.

Next time, I’ll be learning about the draw functions that put images on the Watchy screen.

Last Updated: 7/18/21