Watching my heart beat
A few weeks ago I started playing with something we carry around all day and almost never look at: our heart. I wanted to see it. Not as a number on a watch screen, but as something alive that pulses.
How it works
The sensor is a Polar H10 chest strap, the kind people train with. It speaks Bluetooth Low Energy and publishes heart rate over the standard heart-rate service, so anything that speaks BLE can listen in.
On the other end there's an ESP32-C3 SuperMini that finds the strap, subscribes to those notifications and pulses a 16-LED WS2812 ring in red, with a period of 60,000 / BPM milliseconds. While it's still looking for the sensor, the ring “breathes” in cyan, Iron Man arc-reactor style, so you can tell it's alive even before there's a heartbeat to show.
- ESP32-C3 SuperMini (BLE, Arduino + NimBLE)
- 16-LED WS2812 ring, with brightness capped to spare the battery
- A 1000 mAh LiPo and a protected USB-C TP4056 charger
- A 3D-printed box in matte black PLA
The box
It's three parts: the base, the lid and the ring holder. The boards clip onto the lid with their components facing up, each USB-C port peeks out through its own slot (the ESP32 at one end, the charger at the other) and the lid snaps shut, no screws. The holder has a channel for the ring and two claws that hug the H10 strap itself, so everything sits on your chest. It prints without supports.
Drag to rotate: the base with the battery, the open lid with the ESP32-C3 and charger clipped inside, and the LED ring on its holder. The boards are simplified stand-ins.
Download the STLs (matte PLA, no supports, in the file's orientation):
- Box: base (STL, 175 KB)
- Box: lid (STL, 215 KB)
- Ring holder for the H10 (STL, 111 KB)
The code
A single Arduino sketch. Board ESP32C3 Dev Module with USB CDC On Boot enabled, and two libraries: NimBLE-Arduino 2.x and Adafruit NeoPixel. The ring goes on GPIO10.
- Polar Ring firmware (INO, 3 KB)
What I learned
The board and the charger share the 5 V rail, so you have to unplug the battery before plugging in the ESP32's USB: otherwise USB can push current back into the battery. And the ring's brightness ended up at a fraction of the max: 16 LEDs at full blast drain the battery in no time, and you don't need to blind anyone to see a heartbeat.
An honest disclaimer: this is a toy for seeing a body signal, not a medical device. It doesn't diagnose anything; it just lets you see something that's always there. ❤️🤓