to choose which watchface to select in the application configuration file (app_config.h).  | 
			||
|---|---|---|
| design | ||
| documentation | ||
| src | ||
| .gitignore | ||
| LICENSE | ||
| README.md | ||
W800_Smart_Watch
Why this project :
I was interested in working on a bigger project with more challenges and which could be useful.
I am also quite unhappy with the smartwatches that are on the market (expensive, no access to the firmware, data collection and privacy issues), that's why I decided to try doing my own that I can fully customize. This is going to be a long adventure with a lot of discoveries along the way :).
I also wanted to test this W800 SOC more deeply and see what it could do and I think it is a perfect fit for the project.
So let's go !
A Smart Watch project using the Chinese W800 SOC.
The W800 is a pretty interesting chip with impressive characteristics for its price (around 1$) :
Core :
- 32bit XT804 CPU
 - 240 MHz max clock
 
Memory :
- 2 MB on chip flash
 - 288 KB RAM, ~130 KB available to the user
 
Wireless connectivity :
- Bluetooth EDR(Classic) and BLE 4.2
 - WiFi 2.4Ghz 802.11 b/g/n
 
SDK & OS
- FreeRTOS v10.4.1
 - BLE stack : NimBLE
 - TCP IP stack : lwip v2.1.3
 
W800 Smart Watch V1 specifications :
Sensors :
- A magnetometer (QMC5883L) used by the compass app for example
 - An accelerometer (BMA456) to get wrist tilt detection (to wake the screen up), step counts, activity detection (standing, walking and running) and more.
 - A pressure and temperature sensor (BMP280) used by the altimeter app for example.
 - A heart rate sensor (MAX30102).
 
Screen and Actuators :
- A 1.28 inch touch screen is being used on the watch (GC9A01 screen controller).
 - A vibration motor to notify the user of events.
 - No physical buttons as everything can be done using the graphical interface.
 
Connectivity :
- The watch has BLE (4.2) connectivity which is used to connect to a phone using the GadgetBridge app to :
- control music playback
 - find my phone feature
 - report its battery level
 - report step counts - to implement
 - display received text messages, emails and calls - to implement
 - show the weather forecast for the next 6 hours or so - to implement
 
 - WiFi is also available but not used yet because I didn't find any good use case for it. It is also quite power hungry.
 
Battery and Battery life:
- The battery currently used in this version of the watch is a 6mm x 25mm x 35mm (602535) single cell 600 mAh lipo battery (had one laying around).
 - Using the current battery, expected battery life is :
- ~ 5 days in sleep mode.
 - ~ 9 hours when continuously connected to BLE with the phone (I may be able to slightly improve power consumption in BLE mode - working on it).
 
 
Casing size, Weight and Docking station :
- The case of the watch is 3D printed and the STL design files are available here
 - It also has a docking station designed for it which is used to :
 
Getting started :
So, you'd like to try this project yourself ?
Here are the steps to follow, in order to build the firmware and flash the board :
On Windows :
- Start by cloning this repository.
Put it in a path that doesn't contain any spaces ie : "C:\Users\Bob\Desktop\projects" for example. - Once cloning is done, you will need to install the MSYS2 tool/environment. This tool is needed to compile the project using Make.
 - Open a terminal by clicking on the MSYS2 icon and execute the following commands to prepare the environment :
- Update packages :
 
pacman -Syu- Install make :
 
pacman -S msys/make- Install automake :
 
pacman -S msys/automake- Install autoconf :
 
pacman -S msys/autoconf- Install gcc :
 
pacman -S msys/gcc- Install git :
 
pacman -S msys/git- Install utils needed for menuconfig :
 
pacman -S msys/ncurses-devel pacman -S msys/gettext-devel - You now, need to download the toolchain required to compile and link the app here and extract it somewhere you remember on your hardrive.
 - Now, go back to the MSYS terminal window and move to the src/W800_SDK_v1.00.10/ directory which is located in the cloned repository, using the cd command.
 - Then, execute the make menuconfig command, this should greet you with a crude configuration window.
Move to the Toolchain Configuration --> option using the arrows and hit enter.
Using the same controls, move to the toolchain path and set the location to where you extracted the toolchain in step 4. - To be able to flash the board, you will also need to set the used com port in the Download Configuration ---> option.
TIPS : set the download rate to : 2000000, this should speed up the flashing process. - Now save your configuration and exit.
 - Finally, type :
 
#This will remove all builded object to start from a clean environment (Needed only once)
make distclean
#This will only compile the library part of the firmware
make lib
#This will compile the actual firmware using the libraries and produce the .bin file
make 
#This will flash the board using the previously generated .bin file
make down
#This will do both previous commands in one (build and flash)
make flash
Sensors and I2C addresses :
- Accelerometer : BMA456 I2C addr : 0x18 or 0x19 7 bit address.
 - Magnetometer : QMC5883L I2C addr : 0x0D 7 bit address.
 - Pressure/Temperature sensor : BMP280 I2C addr : 0x76 or 0x77 7 bit address.
 - Heart Rate and SpO2 sensor : Max30102 I2C addr : 0x57 7 bit address.
 
Power source :
- A single ~ 600 mAh cell lipo battery.
 - A charge/discharge controller stage :
- TP4056
 - DW01A + 8205A
 
 
Screen + touch element :
- Screen with touch : GC9A01 with touch panel. It uses the required 4 line Serial Interface.
 - Touch element i2c addr : 0x15, CST816D I2C touch driver.
 
Programming and charging :
- The smart watch programming and charging is done through the same USB port
using a magnetic 4 pin plug. 
MCU Pin assignement table :
| Pin Number | Pin Name | Type | Function | Pull UP/DOWN | Connected to | Comment | 
|---|---|---|---|---|---|---|
| PB_20 | I/O | UART0_RX/PWM1/UART1_CTS/I²C_SCL | U/D | USB/Serial TX flash pin | ||
| PB_19 | I/O | UART0_TX/PWM0/UART1_RTS/I²C_SDA | U/D | USB/Serial RX flash pin and BMA456, Touch Panel, HMC5883L and BMP280 SDA pins | ||
| WAKEUP | I | External Wake Up Pin | D | BMA456 IRQ 1 line and Touch Panel IRQ line through NAND Gate | The chip is waken up when the pin is HIGH | |
| RESET | I | Reset Pin | D | Micro switch and USB/Serial RTS pin | ||
| XTAL_OUT | O | External crystal output | ||||
| XTAL_IN | I | External crystal input | ||||
| AVDD3V3 | P | Chip power supply, 3.3V | ||||
| ANT | I/O | RF Antenna | ||||
| AVDD3V3 | P | Chip power supply, 3.3V | ||||
| AVDD3V3 | P | Chip power supply, 3.3V | ||||
| AVDD3V3_AUX | P | Chip power supply, 3.3V | ||||
| TEST | I | Test function configuration pin | ||||
| BOOTMODE | I/O | BOOTMODE and I²S_MCLK/LSPI_CS/PWM2/I²S_DO | U/D | Touch Panel Reset line | ||
| PA_1 | I/O | JTAG_CK/I²C_SCL/PWM3/I²S_LRCK/ADC0 | U/D | BMA456, Touch Panel, HMC5883L and BMP280 SCL pins | ||
| PA_4 | I/O | JTAG_SWO/I²C_SDA/PWM4/I²S_BCK/ADC1 | U/D | Battery resistor voltage divider output | ||
| PA_7 | I/O | PWM4/LSPI_MOSI/I²S_MCK/I²S_DI/Touch0 | U/D | LCD backlight N-MOSFET driver | ||
| VDD3V3IO | P | IO power supply, 3.3V | ||||
| PB_0 | I/O | PWM0/LSPI_MISO/UART3_TX/PSRAM_CK/Touch3 | U/D | Vibration motor control pin | ||
| PB_1 | I/O | PWM1/LSPI_CK/UART3_RX/PSRAM_CS/Touch4 | U/D | Touch Panel IRQ line | ||
| PB_2 | I/O | PWM2/LSPI_CK/UART2_TX/PSRAM_D0/Touch5 | U/D | Debug UART serial output | ||
| PB_3 | I/O | PWM3/LSPI_MISO/UART2_RX/PSRAM_D1/Touch6 | U/D | TP4056A Charging Signal | ||
| PB_4 | I/O | LSPI_CS/UART2_RTS/UART4_TX/PSRAM_D2/Touch7 | U/D | TP4056A Charged Signal | ||
| PB_5 | I/O | LSPI_MOSI/UART2_CTS/UART4_RX/PSRAM_D3/Touch8 | U/D | Battery resistor voltage divider enable | ||
| VDD3V3IO | P | IO power supply, 3.3V | ||||
| CAP | I | External capacitor, 4.7µF | ||||
| PB_6 | I/O | UART1_TX/MMC_CLK/HSPI_CK/SDIO_CK/Touch9 | U/D | LCD Serial Clock Pin | ||
| PB_7 | I/O | UART1_RX/MMC_CMD/HSPI_INT/SDIO_CMD/Touch10 | U/D | LCD Serial Data Pin | ||
| PB_8 | I/O | I²S_BCK/MMC_D0/PWM_BREAK/SDIO_D0/Touch11 | U/D | LCD Data or Command Selection Pin | ||
| PB_9 | I/O | I²S_LRCK/MMC_D1/HSPI_CS/SDIO_D1/Touch12 | U/D | LCD Reset Pin | ||
| PB_10 | I/O | I²S_DI/MMC_D2/HSPI_DI/SDIO_D2 | U/D | LCD Chip Select Pin | ||
| VDD3V3IO | P | IO power supply, 3.3V | ||||
| PB_11 | I/O | I²S_DO/MMC_D3/HSPI_DO/SDIO_D3 | U/D | BMA456 IRQ 2 line | ||
| GND | P | Ground (Central Pad) | 
What is done/working so far - HARDWARE :
- Schematic :
- First version of the schematic is done an available here.
 
 - 2 layer PCB version 1.0 design is done based on the schematic. It has a 38 mm diameter size.
 - Wake up interrupts handling :
- Wrist tilt MCU wake up working
 - LCD touch wake up
 
 - MCU sleep feature :
- Sleep and Standby modes working but implemented in a crude way.
Can and should be improved. 
 - Sleep and Standby modes working but implemented in a crude way.
 - PIFA antenna tested, performance isn't the best but it is working well for what it will be used for (BLE).
 
What is done/working so far - SOFTWARE :
- LVGL 8.3.3 running on the SOC using DMA.
- Supported LCD drivers :
- ILI9341 in 4-line serial mode (8 bits) with D/C pin
 - ST7789 in 4-line serial mode (8 bits) with D/C pin
 - GC9A01 in 4-line serial mode (8 bits) with D/C pin <-- this one is used.
 
 - Supported LCD touch screen :
- CST816D I2C capacitive touch ic.
 
 - Five screens designed and working with LVGL :
- A watch face based on a casio watch.
 - A menu screen with a list of icons.
 - A setting screen with basic settings (date and time + display brightness) (work in progress).
 - A compass application using the QMC5883L.
 - A find my phone screen which makes the device ring and vibrate (must be connected to watch using BLE through the GadgetBridge app).
 
 
 - Supported LCD drivers :
 - Debug UART on PB_2 (output only)
 - Sensors/Actuators :
- QMC5883L driver working
 - BMA456 driver working
 - BMP280 driver working (temperature + pressure + altitude)
 - MAX30102 driver working
 - Battery voltage sense using ADC is working
 - Vibration motor controlled by PWM working
 
 - Update the W800 SDK from version 1.00.08 to version 1.00.10 released in January of 2023.
 - Added multi-language support to the UI, still some translations to do though.
 - Step counter using the BMA456 is working and steps are displayed on the watch face.
 
To do - HARDWARE:
- Add the MAX30102 Heart Rate Monitor to the current design.
 - Issue with the DW01A chip, 
should be as easy as to replace the 100nf C12 cap with a lower value, let's say 80nf, found a workaround. 
To do - SOFTWARE
- Finish to design the settings page.
 - Implement watch settings persistency using the integrated flash memory
 - Implement a good algorithm to handle adaptiv MCU clock to save power
 - Drivers:
- Write/port the MAX30102 Heart Rate Monitor driver to the project.
 
 - Add a wake up alarm app (using the vibration motor).
 - Add BLE functionality.
 
Achieved power consumption recap:
(Need to work on sleep current :-( )
| Mode | Current draw | Estimated battery life (600 mAh lipo) | 
|---|---|---|
| Active (40MHz clk) (No BLE / No WiFi)  | 
~52 mA | ~11 hour | 
| Active (240MHz clk) (No BLE / No WiFi)  | 
~72 mA | ~8 hour | 
| Sleep | ~4.5 mA | ~5 days and 12 hours | 
| Standby | ~1.8 mA | ~13 days and 15 hours | 
Some screenshots of the achieved visuals currently running on the watch using lvgl :
Here is a preview of what the PCB should look like :
The front :
The back :
Update 21/03/2023 : PCBs were received from JLCPCB and this what they look like :
And the watch running :
Everything works :
- BMA456 ✓
 - BMP280 ✓
 - QMC5883L ✓
 - MAX30102 ✓
 - Screen + touch panel ✓
 - CH340E for chip programming ✓
 - Vibration motor ✓
 - Charge IC ✓
 
** Known issues :**
- DW01A chip not driving the double N mosfet as expected (when plugging a battery, the watch doesn't start without beeing plugged into the charger at least once).
Thought it might be a capacitor value issue, replaced C12 with a 82nf and 68nf caps, but it did not solve the problem :(.
TLDR : after installing the battery, the watch might need to be plugged to it's charger at least once to start up 
Next steps :
- Write and release a usable firmware for every day use. - In active dev
 








