A customizable Bluetooth media controller based on Waveshare ESP32-S3-Zero, inspired by the Sony RM-MC25C controller design with modern enhancements.
This project transforms a Waveshare ESP32-S3-Zero into a powerful Bluetooth media controller with:
- Media control (play/pause, next/previous track, volume)
- Deep sleep for power saving (2-minute timeout)
- Visual feedback via RGB LEDs
- Modified RM-MC25C functionality with additional features
- Customizable button actions (including modifier key combinations)
- Smart power management using USB-C LiPo charger module
- Waveshare ESP32-S3-Zero (Main controller)
- LiPo battery (3.7V, 500mAh+ recommended)
- USB-C LiPo Charger/Booster Module (like https://www.amazon.com.mx/dp/B09YD5C9QC)
- Tactile buttons (x5)
- NeoPixel LED (optional)
- Resistors (10kΩ for pull-ups)
- JST PH 2.0 connector (for battery)
The USB-C LiPo Charger Module provides:
- Built-in charging circuit (no separate TP4056 needed)
- 5V boost output (powers ESP32 directly)
- On/off button functionality
Special wiring:
- ESP32 5V/GND connected to module's boosted 5V output
- DOWN button wired to charger module's power button pin
- Single press: Turns power on/off
- Still functions as modifier button when powered on
LiPo (+) → Charger Module "BAT+" LiPo (-) → Charger Module "BAT-"
Charger Module "5V OUT" → ESP32 "5V" Charger Module "GND" → ESP32 "GND" DOWN button → Charger Module "PWR" pin
| Button | GPIO | Function |
|---|---|---|
| DOWN | 7 | Modifier/Power |
| PLAY | 9 | Play/Pause |
| BACK | 10 | Previous Track/Vol- |
| NEXT | 11 | Next Track/Vol+ |
| STOP | 12 | Stop/Wake-up |
- Red LED: GPIO 6
- Blue LED: GPIO 5
- Green LED: GPIO 4
- NeoPixel: GPIO 21
If your ESP32 randomly wakes from deep sleep shortly after entering it (especially when using GPIO12 as the wake-up trigger), follow these steps to resolve electrical noise issues:
Recommended Fix Hardware Modifications (Required for GPIO12):
Add a 10kΩ pull-up resistor between GPIO12 and 3.3V.
Add a 100nF ceramic capacitor between GPIO12 and GND (for debouncing).
Circuit Diagram:
[3.3V] ----[10kΩ]----.
|
GPIO12 --------------+
|
[ ] STOP button (to GND)
|
[100nF]
|
[GND]
Software Configuration: In setup(), add these lines to stabilize the wake-up pin:
void setup() {
...
pinMode(STOP, INPUT_PULLUP); // Enable internal pull-up
gpio_pullup_en(GPIO_NUM_12); // Force strong pull-up
esp_sleep_enable_ext0_wakeup(GPIO_NUM_12, LOW); // Wake on LOW (button press)
...
Why This Happens ESP32 wake-up pins are sensitive to noise (floating voltages, EMI, or button bounce).
The 10kΩ resistor ensures a clean HIGH state, while the 100nF capacitor filters noise.
If Issues Persist Use a multimeter to verify GPIO12 voltage:
Should read ~3.3V when idle (no button press).
Should read 0V when pressed.
Shorten wires between the button and ESP32.
Replace the tactile switch (defective switches can cause floating signals).
- Bluetooth LE keyboard emulation
- Media control shortcuts inspired by RM-MC25C
- Enhanced with modern ESP32-S3 capabilities
- Visual status indicators
-
Hardware Setup:
- Solder components according to wiring diagram
- Ensure proper polarity for battery connections
-
Software Setup:
- Install required Arduino libraries:
- Adafruit_NeoPixel
- BleKeyboard
- Install required Arduino libraries:
-
Upload the Sketch:
- Open WS-ESP32-Media-Controller-Sleep.ino
- Select ESP32-S3 board
- Upload to device
- Power On: Press DOWN button once
- Pairing: Connect via Bluetooth as "RM-MC25C Media Controller"
- Controls:
- Standard button presses for media control
- DOWN + other buttons for secondary functions
- Power Off: Press DOWN button twice quickly
- Change timeout duration in code
- Adjust LED colors
- Modify button mappings
- Create custom enclosure
Bluetooth: BLE 4.2 Operating Voltage: 3.3V (regulated from 5V boost) Current Draw: ~15mA active, ~5μA sleep Battery Life: ~20 hours (500mAh LiPo)
- 3D Printed housing to put all together inside
This project is licensed under the GNU GENERAL PUBLIC LICENSE. See the LICENSE file for details.
This project was made possible thanks to these valuable resources:
-
ESP32-BLE-Keyboard Library by T-vK
For enabling Bluetooth HID keyboard functionality on ESP32 -
Waveshare ESP32-S3-Zero Documentation
For hardware specifications and pinout references -
USB-C LiPo Charger/Booster Module
For providing integrated battery charging and power management
Special thanks to the open source community and all contributors whose work helped shape this project.
Project Repository:
🔗 github.com/geekinsanemx/ESP32-Bluetooth-Media-Controller
Creator:
👨💻 GeekInsaneMX
Need Help?
- Open an Issue on GitHub
- Share your project modifications - I'd love to see what you build!