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
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):
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 ;).
- PCB https://aisler.net/uvwxy/pauls-3d-things/esp-watch (You can solder this manually, but I highly recommend using a stencil, and a hot air gun)
- 1x Switch
- 2x Buttons
- 1x 4x30x35mm LiPo
- 1x micro USB Connector
- 1x ESP8285-M3
- 1x 200x200pix e-ink Display
- 1x BME280
- 1x DS1307 (I desoldered the ds1307 and oscillator from the board)
- 1x 3.3V LDO - MCP1700
- 1x LiPo Charger - MCP73831
- SMD 0603 capacitors and resistors (1k, 2x10k), (2x1uF, 2x4.7uF, 1x10uF)
- 1x SMD 1206 LED
- 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
And, by disabling the line 370 with a comment: