Projects
Online HLM-01

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.

Cartoon of a faceted black helmet with pointed ears and a mesh visor lined with glowing green and blue LED strips, sitting on a workbench next to a small speaker, a touchscreen controller and a power bank.

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:

nigel@bench:~/helmet-esp32host test
$ 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