This is a custom Zephyr RTOS firmware I built to experiment with Bluetooth Low Energy (BLE) and edge computing on wearables. I started this project during the Hacktor Watch hackathon (April 2026)
Bassicly, this project turns an ESP32-S3 smartwatch into a live public transport dashboard (currently setup for the Bucharest STB network).
Smartwatches usually have tiny batteries. I realized that making the watch connect to WiFi, establish SSL, and parse massive JSON payloads from a transit API is a terrible idea for battery life and RAM.
To fix this, I offloaded all the heavy compute to the smartphone:
- A background daemon on the phone fetches the real-time STB API data.
- The phone parses the JSON and formats it into a tiny, simple string like
41,Ghencea,5(Route 41, towards Ghencea, arriving in 5 mins). - The phone pushes this raw string over BLE to the watch.
- The Zephyr RTOS on the watch gets the BLE interrupt, splits the string, and directly updates the LVGL graphics.
This architecture means the watch does almost zero heavy computing, saving alot of battery and memory.
Target board: esp32s3_devkitc/esp32s3/procpu
- ESP32-S3 (dual core)
- GC9A01 Round LCD screen (240x240) via SPI3
- CST816T Capacitive Touch via I2C1
- Built-in ESP32 Bluetooth controller
prj.conf- My Zephyr Kconfig (enabled LVGL, SPI, and BLE, but disabled extra sensors to save space).src/ble.c- Sets up a custom GATT service (12345678-1234-5678-1234-56789abcdef0) to recive the transit string from the phone.src/transit_ui.c- Uses the LVGL library to draw a clean digital interface (tram number, destination, minutes).src/main.c- Inits the display, starts bluetooth advertising, and runs the main UI loop.
You need the Zephyr SDK installed. Just run the build script:
./build.sh --pristineFlash the board:
./build.sh --flash --port /dev/ttyACM0The watch acts as a pure BLE GATT server. To feed it data, the repository includes a Python bridge script (transit_bridge.py) meant to run on a background terminal environment (like a Linux laptop or a phone environment via Pydroid/Termux).
- Install the asynchronous Bluetooth library dependencies:
pip install bleak