opensourceprojects.dev

A broadsheet for software that doesn't ask for your email

A smartwatch firmware built on STM32, FreeRTOS, and LVGL with a low-power design...
GitHub RepoImpressions1

Project Description

View on GitHub

Building a Smartwatch Firmware That Actually Respects Your Battery

You know the drill: you crack open a smartwatch firmware project, and the first thing you find is a power management section that's basically an afterthought. The screen drains the battery in hours, the sensors never sleep, and the whole thing feels like it was designed on the assumption that you'll be tethered to a charger. If you've been looking for an embedded project that treats low-power design as a first-class citizen, the OV-Watch firmware is worth a serious look.

This is an open-source smartwatch firmware built on an STM32F411CEU6 microcontroller, running FreeRTOS with an LVGL v8.2 UI. It's not a polished commercial product—it's a hands-on, learn-by-reading project where the author has documented real design decisions and the trade-offs that came with them.

What It Does

OV-Watch is a complete smartwatch firmware for a custom hardware design. The MCU is an STM32F411CEU6, the UI runs on LVGL v8.2, and FreeRTOS handles the multitasking. The firmware is split into two separate Keil projects: a Bootloader and the main APP, which together enable IAP OTA updates over Bluetooth.

The watch has three operating modes. Normal mode is the full-featured running state. Sleep mode puts the MCU into STOP mode while the MPU6050 accelerometer keeps counting steps. Shutdown mode cuts power entirely—the TPS63020 DC-DC converter's enable pin is pulled low, so there's no 3V3 rail at all, only the battery's Vbat line.

The feature set includes a heart rate monitor using an EM7028 sensor, data storage via external EEPROM, a page-switching system that remembers where you were, and Bluetooth connectivity through a KT6368A module. The heart rate algorithm is particularly interesting: the author initially used the official library but found it too slow, so they replaced it with a custom peak-detection algorithm.

Why It's Cool

The low-power design is where this project really shines. Here's what the author actually did to get power consumption down:

  • Serial port cleanup: In sleep mode, the UART IO pins are de-initialized and set as inputs. This alone fixed a high sleep current issue, bringing standby current down to around 800 microamps.
  • RTC wake-up instead of motion interrupts: Initially, the MPU6050's motion interrupt was used to wake the watch, but it required too much movement to trigger. The author switched to RTC periodic interrupts that check for a wrist-raise gesture.
  • MPU6050 power tuning: The DMP library can't be used directly—it leaves the sensor drawing too much current. The project includes the necessary modifications to get the power draw down.
  • Bluetooth shutdown: The KT6368A's enable circuit was redesigned in V2.4.0 so the radio can be completely powered off when not in use.

The measured results are respectable: 70-80mA in run mode, around 1mA in standby, and essentially nothing in shutdown mode except the RTC.

The page navigation logic is another clever bit. The firmware uses a stack to manage screen transitions, storing pointers to UI screens. When you press a button to go back, it pops the previous screen from the stack. The author includes a warning about a subtle bug here: you can't push a screen pointer directly like ui_HomePage because those variables change dynamically—you need to capture the address correctly or you'll crash.

There's also a practical honesty in the README that you don't always see in embedded projects. The blood oxygen (SpO2) feature is listed as "not written yet." The author acknowledges that the V2.4.0 bootloader setup is more complex than necessary and points you to an older branch if you just want to flash the app directly.

How to Try It

If you have the OV-Watch hardware, the fastest path is to flash the pre-built firmware from the Firmware directory—the README recommends this over compiling from source. The project includes separate Bootloader and APP Keil projects in the software folder, and detailed flashing instructions are in Firmware/README.md.

If you don't have the watch hardware, the author has created a companion STM32F411 development board called "FriPi炸鸡派" (FryPi) specifically for learning the code without dealing with the difficult soldering required for the watch itself. That's another repository: https://github.com/No-Chicken/FryPi.

You can browse the main project here: https://github.com/no-chicken/ov-watch

Final Thoughts

OV-Watch is best suited for embedded developers who want to see how a real firmware project handles power management, OTA updates, and UI state management on constrained hardware. It's not a polished SDK with clean abstractions—it's a working project with honest documentation of the messy decisions that go into making something battery-powered actually last.

The power consumption numbers won't win any awards against commercial smartwatches, but that's not the point. The point is the journey: the RTC wake-up fallback, the MPU6050 power tuning, the Bluetooth enable circuit redesign. Those are the lessons you'll carry into your own projects. If you've been looking for a concrete example of low-power embedded design that doesn't hide the rough edges, this is it.


Follow @githubprojects for more developer tools and open source projects.

Back to Projects
Project ID: d8a85b7c-02f3-478b-b7eb-0be1ab8da0a0Last updated: August 26, 2026 at 07:57 AM