Helmet ESP32: LED helmet controller
An ESP32 that runs a WS2812B LED strip around a helmet, with 16 patterns, a bass mode that reacts to music, and an Android app over BLE.

I replaced the stock LEDs on a helmet with a WS2812B strip and an ESP32. It runs off a USB power bank. There are 16 patterns, and Bass mode uses a MAX9814 mic to flash the lights on the kick drum.
There are two versions of the hardware:
- XIAO ESP32-S3 with a small OLED screen and three buttons
- CYD (ESP32-2432S028R) with a 2.8 inch touchscreen
Both use the same firmware for the LEDs, Bluetooth and settings. You can also control it from the Android app.
Bass mode
The bass detector samples the mic 1,000 times a second, filters for the kick drum, and ignores mains hum. It has a noise gate so the lights stay off when it’s quiet. You can test the detector on a computer without the helmet:
$ make -C tools/bass_test && tools/bass_test/bass_test $ pio run -e xiao_s3 -t upload
Tip: connect the MAX9814’s GAIN pin to 3V3 or GND. If you leave it floating it picks up a lot of noise.
Screen off
I keep the controller in my pocket, and the touchscreen kept getting pressed. I added a switch in the app that turns off the screen and buttons. The LEDs and mic keep working. You can only turn it back on from the app.
Releases
GitHub Actions builds the firmware and runs the tests on every push. When I push a tag, it makes a release with the firmware files and a signed APK.
Future improvements
- Test the screen-off setting after a reboot
- Measure the power limit on a real strip
- Test bass mode on the XIAO version. So far I’ve only run it on the CYD.
// alientrails