This reverse engineering is based on efforts from Gordon Williams (Espruino), Fanoush, and atc1441
If you like this please consider supporting Espruino, or buying an Open Source Bangle.js watch (which will "just work")... Or contributions to improve the accuracy of info here or features of the Espruino build would be hugely appreciated.
The SMA Q3 can be a bit hard to get hold of - if there's enough interest I could sort out some kind of bulk purchase, so please let me know if so.
Specs
- nRF52840 (BLE 5, 64MHz, 256kB RAM, 1MB Flash)
- LPM013M126 sunlight-readable 176x176 8 color LCD, with full touch
- One button, IP68 waterproof
- 8MB SPI Flash (XT25F64B)
- GPS (AT6558)
- Accelerometer (Kionix KX022)
- Compass
- Pressure/Temperature sensor (Bosch BMP280)
- Heart rate sensor
Current State
There is a build of Espruino for the watch that exposes Bangle.js functionality to the point where some apps from the App Loader can but run. Pretty much all functionality now works:
- LCD & terminal on LCD
- Bluetooth
- Compass, Accelerometer, Gestures
- Heart rate monitor
- GPS
- Touchscreen
- External flash
- Bootloader and firmware updates
- Power saving (now 150uA normally)
- Pressure sensor implemented
The only real sticking point is compatibility with existing apps as the screen size and number of buttons is different, but a JS library is in progress to work around that.
The Espruino firmware can be built pretty easily with:
https://github.com/espruino/Espruino
source scripts/provision.sh BANGLEJS2
BOARD=BANGLEJS2 RELEASE=1 make flash
Pinouts
SWD - the 4 pads on the rear of the watch are GND, SWDIO/SWDCLK, VCC. The charge cable has wires for all 4 leads brought out to the USB connector, so the easiest method is just to attach wires from a USB socket to an nRF52DK
LCD - LPM013M126C
PRESSURE - BMP280, I2C 0x3C(0x1E)
TOUCH - Hynitron CST816S, I2C 0x2A(0x15)
Hynitron CST816S https://wiki.pine64.org/index.php/PineTime#Touch_panel
Can write 0x03,0xe5 to turn off
HRM - VCare VC31, I2C 0x66(0x33)
http://www.vcaresensor.com/vc31.html
No source or datasheets. Seems to produce raw ADC values
ACCEL - Kionix KX022, I2C 0x3C(0x1E)
COMPASS - I2C 0x18(0x0C) - we have it working but we don't know what it is (It's not GMC303 even though it shares the I2C address)
Pin | Connected | State |
0 | 32876 oscillator | |
1 | 32876 oscillator | |
2 | PRESSURE_SCL | |
3 | Battery voltage analog GND-[1M]-D3-[3M]-VBATT | |
4 | ||
5 | Memlcd_CS (active high) | out |
6 | Memlcd_EXTCOMIN Needs to be toggled at 5ms or 250ms in sleep all the time | |
7 | memlcd_DISP 1=disp on, 0=disp off | out, pulsed high |
8 | Backlight | out |
13 (0x0d) | Flash_MISO | input |
14 (0x0e) | Flash_CS | out |
15 (0x0f) | Flash_MOSI | out |
16 (0x10) | Flash_SCK | in_pullup |
17 (0x11) | Button | In_pullup, edge detect |
19 (0x13) | Vibrate, active=1 | out |
21 (0x15) | HRM_POWER, active=1 | out |
22 (0x16) | HRM_INT | |
23 (0x17) | Charge port | in_pullup |
24 (0x18) 25 (0x19) | HRM_SDA Charging complete | |
26 (0x1a) | memlcd_SCK | |
27 (0x1b) | memlcd_MOSI | |
29 (0x1d) | GPS power, active=1 | out |
30 (0x1e) | GPS TXD | |
31 (0x1f) | GPS RXD | |
32 (0x20) | HRM_SCL | |
33 (0x21) | TOUCH_SDA | |
34 (0x22) | TOUCH_SCL | |
35 (0x23) | TOUCH_RESET (active low) | out |
36 (0x24) | TOUCH_INT (active low) | |
37 (0x25) | ACCEL_SDA | |
38 (0x26) | ACCEL_SCL | |
39 (0x27) | ACCEL_INT | input |
44 (0x2c) | COMPASS_SDA | |
45 (0x2d) | COMPASS_SCL | |
47 (0x2f) | PRESSURE_SDA |
Is the screen transflective? How well does it work in a lighted room if the backlight is completely off?
Alternatively, how difficult would it be to swap the screen out for an electrophoretic one?