Skip to content
E-Ink Smartwatch based on ESP8285-M3
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.

A DIY Smartwatch

Ok, we can argue about the smart part, but let's call it that way ;).

The goal of this project is to build a DIY smartwatch (with WiFi + Sensors) that runs for a month. Key is to use an e-ink display (like a Kindle) and lots of deepsleep.

It is mainly based on

  • a 3D printed case (PLA) and wristband (TPU)
  • an ESP8285-M3 module
  • an e-ink display
  • a BME280 environment sensor
  • a DS1307 for time keeping
  • a custom PCB + additional parts for power and charging

The software/firmware is under code, using the platformio framework to build. It currently is in ALPHA which means I'm playing around with adding features and functionality. The basic functionality of different watchfaces and refreshing every minute works, as well as sensor data and charts work 👍. An initial case already works, but might need further updates.

Everything else is still TODO. I am developing this in my spare time, so documentation is incomplete.

Click on the image below for a demo (there are more videos on my Instagram):

Required Parts

If you want to join this project and help developing the hardware + code, these are the links I used for ordering. You can contact me via instagram to check if there are free PCBs ;).

Known Issues


  • the button footprints have been updated, they might fit now
  • the pins 4+5 on the usb footprint are corrected

How I built it



I know the schematics can be cleaned up. I haven't spent that much time with KiCad, so if you have advice, please let me know. The same goes for the PCBs.



Partial refresh: tuning the u8g2 lib for redraw performance

Use the following LUT in u8x8_d_ssd1607_200x200.c, starting at line 306. It has less flickering

/* orginal values without 0-0 and 1-1 transition */
  U8X8_A(L(3,0,0,3)), // 0x02
  U8X8_A(L(3,0,0,3)), // 0x02
  U8X8_A(L(3,0,0,3)), // 0x01
  U8X8_A(L(3,1,0,3)), // 0x11
  U8X8_A(L(3,1,0,3)), // 0x12
  U8X8_A(L(3,1,0,3)), // 0x12
  U8X8_A(L(3,2,0,3)), // 0x22
  U8X8_A(L(3,2,0,3)), // 0x22
  U8X8_A(L(3,2,1,3)), // 0x66
  U8X8_A(L(3,2,2,3)), // 0x69
  U8X8_A(L(3,2,2,3)), // 0x69
  U8X8_A(L(3,1,2,3)), // 0x59
  U8X8_A(L(3,1,2,3)), // 0x58
  U8X8_A(L(3,1,2,3)), // 0x99
  U8X8_A(L(3,1,2,3)), // 0x99
  U8X8_A(L(3,0,2,3)), // 0x88
  U8X8_A(L(3,0,0,3)), // 0x00
  U8X8_A(L(3,0,0,3)), // 0x00
  U8X8_A(L(3,0,0,3)), // 0x00
  U8X8_A(L(3,0,0,3)), // 0x00

Also, we speedup initialization by calling u8g2.initDisplay(); instead of u8g2.begin(); And, by disabling the line 370 with a comment: // u8x8_d_ssd1607_200x200_first_init(u8x8);

You can’t perform that action at this time.