Arduino Watch Project

I’ve recently started wearing a watch every day after eschewing the practice for around 35 years. As a result, I’ve gotten pretty interested in cheap, reliable, digital watches like the old Casio F-91W (which costs around $15 brand new). I’ve also, unsurprisingly, gotten pretty opinionated about what a watch is, and does, and how I want one to behave and look. After napkin-sketching some ideas and spending a couple bucks at Adafruit, I decided to build my own. For thorough development, build, and UX details ignore that thrashing sound (poor Douglas Adams rolling over in his grave) and read on. There’s a GitHub repository for the code I’m writing.

The Problems

But I wanted a little more. It’s clunky to set the time on a watch, and I travel sometimes, so setting the watch via an app or other method would be great. They’re hard to read in when it’s dark, even with the tiny illumination LED they pack, so a brighter screen would help too. Finally, the watch faces on the cheapo digitals leave a lot to be desired and sometimes the preconfigured modes are haphazard and tough to read at a glance. It would be nice to have full control over each pixel of that little 1″ display.

TL;DR Features for V1:

  • Sync time with iOS/Android via Bluetooth LE
  • Display customizable date/time readout on 1-1.5″ display
  • Run on battery for 3+ hours

Detailed Thoughts on Why I Chose These Parts

I wanted to stick with what I knew was low-power and easy to code, so Arduino-based was the obvious choice. When it comes to tiny-but-powerful Arduino boards the ItsyBitsy line hits the right spot of inexpensive, tons of pins, and excellent community support. It’s got enough pins to support several pin-heavy breakouts to support our goals of remotely setting the time and displaying a customizable face, and it’s low-power enough that it should be able to run for some time on a small battery.

Since Bluetooth is ubiquitous now and Bluetooth LE modules have gotten cheap I decided to try using that for setting the time, via serial commands. This way we can sync the clock with an iOS or Android or Windows or Whatever device on startup, and really just let it roll. Maybe we re-sync a couple of times a day, but we shouldn’t “drift” much with the excellent Arduino Time library. The library also lets us set the clock by transmitting a UNIX timestamp prefixed by T, like so: T1529265357.

I’d shopped around for some nice looking monochrome OLED displays, which are really bright even in total darkness, for a previous project. The ones Adafruit sells have the added benefit of being able to run off of the 3.3V our ItsyBitsy will provide.

Some Process

This also means we only have to care about sending one string one time to the watch to get started, but we still have to do all the boring, complicated, Bluetooth LE setup stuff. Luckily Adafruit has a great line of Bluetooth LE breakout boards and libraries which does it for us.

Parts List

Here’s a quick parts list (no, I’m not getting a kickback on these):

Total bill of materials, so far: $68.48

Future Features:

  • Visual, grid-based, watch face maker iOS app
  • A case, band, gauntlet, whatever
  • Share faces via in-app camera QR code recognition
  • I’d like to enable some kind of tap/haptic feedback switch though
  • A cute little buzzy speaker

Dumb Ideas:

  • Use as the world’s worst bluetooth mic
  • Gameboy Camera quality video calling
  • Stream 1-bit video at 1 fps to the watch for no good reason

More Media

The watch telling time in H:M:S format (from UNIX epoch).

[/video]

I fried the ItsyBitsy programmer somehow, now I can’t write to it: