05be118dd1f4009cd94ab7cf8b62e3c1792ed965
ESP32 LED Controller for Model Aircraft
Professional LED controller firmware for ESP32 with Web-BLE configuration interface. Designed for model aircraft with WS2812B LED strips.
Features
Hardware Support
- ESP32 DevKitC and ESP32-C3 MINI Development Board
- Dual WS2812B LED strip support (configurable GPIOs)
- PWM signal input for RC control
- Real-time LED animation at 60 FPS
Animation Modes
- Black - All LEDs off
- Red - Solid red
- Blue - Solid blue
- Green - Solid green
- White - Solid white
- Rainbow - Smooth rainbow gradient
- Rainbow with Glitter - Rainbow with sparkles
- Confetti - Random colored speckles
- Sinelon - Sweeping colored dot with trails
- BPM - Pulsing stripes at 33 BPM
- Navigation - Aviation lights (red left, green right)
- Chase (Red) - Red dot chase effect
- Chase (RGB) - RGB cycling chase effect
- Random - Random LED colors
Web-BLE Configuration
- Pin Configuration: Set GPIO pins for LED strips and PWM input
- BLE Auto-Off: Configure timeout (Never/1min/5min)
- Manual Control: Select animation modes from web interface
- PWM Emulation: Test mode switching without RC signal
- OTA Firmware Update: Upload new firmware via Bluetooth
Project Structure
led-controller-firmware/
├── main/
│ ├── main.c # Application entry point
│ ├── control.c/h # BLE, NVS, initialization
│ ├── led.c/h # WS2812B control (RMT driver)
│ ├── rcsignal.c/h # PWM signal reading
│ └── animation.c/h # LED animation patterns
├── webapp/
│ ├── index.html # Web-BLE interface
│ ├── app/app.js # BLE communication logic
│ ├── css/style.css # UI styling
│ └── data/favicon.ico
├── CMakeLists.txt
├── sdkconfig.defaults
└── partitions.csv # OTA-enabled partition table
Build Instructions
Prerequisites
-
Install ESP-IDF v5.0 or later
-
For ESP32-C3, ensure RISC-V toolchain is installed
Building
cd led-controller-firmware
# For ESP32 DevKitC
idf.py set-target esp32
idf.py build
# For ESP32-C3 MINI
idf.py set-target esp32c3
idf.py build
Flashing
idf.py -p /dev/ttyUSB0 flash monitor
Replace /dev/ttyUSB0 with your serial port (COM3 on Windows).
Hardware Setup
Wiring
ESP32 Pin -> Component
----------- ----------
GPIO XX -> WS2812B Strip A Data
GPIO XX -> WS2812B Strip B Data
GPIO XX -> RC PWM Signal
GND -> Common Ground
5V -> LED Strip Power (if current < 500mA)
LED Strips
- WS2812B strips require 5V power
- Each LED draws ~60mA at full white
- Use external power supply for >10 LEDs
- Add 100-500µF capacitor near strips
- Add 330Ω resistor on data line
PWM Signal
- Standard RC PWM: 1000-2000µs pulse width
- 1500µs threshold for mode switching
- Rising edge >1500µs after <1500µs triggers next mode
Web-BLE Configuration
Access the Interface
- Open
webapp/index.htmlin Chrome, Edge, or Opera (Web Bluetooth required) - Click "Connect via BLE"
- Select "LED-Controller" from device list
- Configure settings and control LEDs
Configuration Options
Pin Setup
- LED Strip A GPIO: -1 to disable, 0-48 for GPIO pin
- LED Strip B GPIO: -1 to disable, 0-48 for GPIO pin
- PWM Input GPIO: -1 to disable, 0-48 for GPIO pin
BLE Timeout
- Never: BLE stays on until manually disabled
- 1 Minute: Auto-disable after 1 min of boot (unless connected)
- 5 Minutes: Auto-disable after 5 min of boot (unless connected)
Firmware Update
- Build firmware:
idf.py build - Find binary:
build/led_controller.bin - Upload via Web-BLE interface
- Device restarts with new firmware (settings reset)
Default Configuration
On first boot or after reset:
- All pins: Not configured (-1)
- BLE timeout: Never
- Animation mode: Black (off)
Configure via Web-BLE before use.
Development
Adding New Animations
- Add mode to
animation_mode_tenum inanimation.h - Implement animation function in
animation.c - Add case to
animation_update()switch statement - Update
MODE_NAMESarray inwebapp/app/app.js
Modifying LED Count
Edit DEFAULT_NUM_LEDS_A and DEFAULT_NUM_LEDS_B in control.c. TODO
Testing
# Build and flash
idf.py build flash
# Monitor output
idf.py monitor
# Exit monitor: Ctrl+]
License
See LICENSE
Description
Languages
C++
100%