📖 TAKEONE REFLEX C3 - DIY Reaction Light System
Complete User Documentation
📋 Table of Contents
- Overview
- Hardware Requirements
- Wiring Diagram
- Software Setup
- Configuration
- BLE Commands Reference
- Using the Device
- Mobile App Testing
- Troubleshooting
- Advanced Features
🎯 Overview
BlazePod C3 is a DIY reaction light training system inspired by commercial products like BlazePod. It uses an ESP32-C3 microcontroller to create a wireless, Bluetooth-controlled LED pod that measures reaction time with millisecond accuracy.
Key Features
- ✅ Wireless BLE 5.0 control
- ✅ Millisecond-accurate reaction timing
- ✅ Customizable RGB colors via mobile app
- ✅ Multiple trigger options: Piezo (slap), Button (press), Accelerometer (shake)
- ✅ Smooth breathing animations
- ✅ Modular design - enable/disable sensors as needed
- ✅ Low power consumption
🔧 Hardware Requirements
Required Components
| Component | Quantity | Notes |
|---|---|---|
| ESP32-C3 Super Mini | 1 | Main controller |
| WS2812B NeoPixel Ring (12 LEDs) | 1 | 5V, 12-LED ring |
| Piezo Disc | 1 | Optional - for slap detection |
| Momentary Push Button | 1 | Optional - for press detection |
| ADXL335 Accelerometer | 1 | Optional - for shake detection |
| 1M Ω Resistor | 1 | For piezo sensor |
| 3.7V LiPo Battery | 1 | 500-1000mAh recommended |
| TP4056 Charging Module | 1 | Battery charging |
| Slide Switch | 1 | On/Off power switch |
Tools Needed
- Soldering iron & solder
- USB-C cable (data-capable)
- Wire cutters/strippers
- Hot glue gun
- 3D printer (optional, for case)
🔌 Wiring Diagram
ESP32-C3 Super Mini Pinout
| Component | ESP32-C3 Pin | Notes |
|---|---|---|
| NeoPixel Data | GPIO 3 | DIN pin on ring |
| NeoPixel VCC | 5V (VIN) | Use 5V for brightness |
| NeoPixel GND | GND | Common ground |
| Piezo (+) | GPIO 4 | With 1M Ω resistor to GND |
| Piezo (-) | GND | |
| Button (Leg 1) | GPIO 5 | |
| Button (Leg 2) | GND | No resistor needed (internal pullup) |
| Accel X | GPIO 6 | ADXL335 X-Out |
| Accel Y | GPIO 7 | ADXL335 Y-Out |
| Accel Z | GPIO 0 | ADXL335 Z-Out |
| Accel VCC | 3.3V | ⚠️ 3.3V ONLY! |
| Accel GND | GND |
Wiring Schematic
ESP32-C3 Super Mini
┌─────────────────┐
│ GPIO 3 ──────┼──> NeoPixel DIN
│ 5V ──────┼──> NeoPixel VCC
│ GND ──────┼──> NeoPixel GND, Piezo (-), Button (Leg 2)
│ GPIO 4 ──────┼──> Piezo (+) [with 1MΩ to GND]
│ GPIO 5 ──────┼──> Button (Leg 1)
│ GPIO 6 ────────> ADXL335 X
│ GPIO 7 ──────┼──> ADXL335 Y
│ GPIO 0 ──────┼──> ADXL335 Z
│ 3.3V ──────┼──> ADXL335 VCC
└─────────────────┘
💻 Software Setup
Step 1: Install Arduino IDE
Download from: https://www.arduino.cc/en/software
Step 2: Add ESP32 Board Support
- Open Arduino IDE
- Go to File > Preferences
- Add this URL to "Additional Board Manager URLs":
https://espressif.github.io/arduino-esp32/package_esp32_index.json - Go to Tools > Board > Boards Manager
- Search for "esp32"
- Install "esp32 by Espressif Systems" (version 2.0.9 or higher)
Step 3: Install Required Libraries
- Go to Sketch > Include Library > Manage Libraries
- Search and install:
- Adafruit NeoPixel by Adafruit
Step 4: Select Board Settings
- Tools > Board: Select "ESP32C3 Dev Module"
- Tools > USB CDC On Boot: "Enabled"
- Tools > Partition Scheme: "Default 4MB with spiffs"
- Tools > Port: Select your ESP32-C3 port
Step 5: Upload Code
- Copy the full code into Arduino IDE
- Click Verify (✓) to compile
- Hold BOOT button on ESP32-C3
- Press RESET (or plug in USB while holding BOOT)
- Click Upload (→)
- Release BOOT button when you see "Connecting..."
- Press RESET once after upload completes
⚙️ Configuration
Enable/Disable Sensors
At the top of the code, you'll find:
// --- Feature Toggles (Comment to disable) ---
#define FEATURE_PIEZO
#define FEATURE_BUTTON
#define FEATURE_ACCEL
To enable a feature: Leave the line as is (uncommented)
To disable a feature: Add // at the beginning
Example Configurations
Button Only (Quiet Mode)
//#define FEATURE_PIEZO
#define FEATURE_BUTTON
//#define FEATURE_ACCEL
Slap Only (Classic Mode)
#define FEATURE_PIEZO
//#define FEATURE_BUTTON
//#define FEATURE_ACCEL
Full Features (All Triggers)
#define FEATURE_PIEZO
#define FEATURE_BUTTON
#define FEATURE_ACCEL
Adjust Sensitivity
#ifdef FEATURE_PIEZO
#define PIEZO_THRESHOLD 1500 // Higher = less sensitive
#endif
#ifdef FEATURE_BUTTON
#define BUTTON_THRESHOLD 100 // Not used (digital read)
#endif
#ifdef FEATURE_ACCEL
#define ACCEL_THRESHOLD 150 // Higher = less sensitive
#endif
Change Device Name
#define DEVICE_NAME "BlazeC3_Pod_01"
Change to any name (max 15 characters).
Adjust LED Brightness
#define BRIGHTNESS 50 // 0-255 (0=off, 255=brightest)
#define BREATHE_MAX 40 // Max brightness for breathing effect
📱 BLE Commands Reference
Connection Details
| Parameter | Value |
|---|---|
| Device Name | BlazeC3_Pod_01 (or your custom name) |
| Service UUID | 4fafc201-1fb5-459e-8fcc-c5c9c331914b |
| Characteristic UUID | beb5483e-36e1-4688-b7f5-ea07361b26a8 |
Game Control Commands
| Command | Description | Response |
|---|---|---|
START |
Start reaction test | OK:STARTED |
RESET |
Stop game, return to connected state | OK:RESET |
Color Configuration Commands
Format: COLOR_NAME:R,G,B where R,G,B are 0-255
| Command | Example | Description |
|---|---|---|
COLOR_WAIT:0,0,255 |
Blue breathing when waiting for connection | |
COLOR_CONN:0,255,255 |
Cyan when connected, ready | |
COLOR_ACTIVE:255,0,0 |
Red when game active (wait for trigger) | |
COLOR_SUCCESS:0,255,0 |
Green when triggered (success) |
Responses: OK:COLOR_NAME:R,G,B
Utility Commands
| Command | Description | Response Example |
|---|---|---|
GET_COLORS |
Get all current colors | COLORS|WAIT:0,0,255|CONN:0,255,255|ACTIVE:255,0,0|SUCCESS:0,255,0 |
RESET_COLORS |
Reset to default colors | OK:COLORS_RESET |
Automatic Notifications
| Notification | When Sent |
|---|---|
RESULT:245ms |
When trigger detected (reaction time) |
OK:STARTED |
When game starts |
OK:RESET |
When game resets |
🎮 Using the Device
Basic Workflow
-
Power On
- Turn on the slide switch
- LEDs perform rainbow spin (2 seconds)
- LEDs enter breathing blue mode (waiting for connection)
-
Connect via Bluetooth
- Open nRF Connect or your mobile app
- Scan for
BlazeC3_Pod_01 - Tap CONNECT
- LEDs turn solid cyan (connected)
-
Customize Colors (Optional)
- Send
COLOR_ACTIVE:255,0,255for purple active color - Send
GET_COLORSto verify
- Send
-
Start Reaction Test
- Send
START - LEDs turn red (or your custom active color)
- Wait for the light...
- Send
-
Trigger the Pod
- Slap it (if piezo enabled)
- Press the button (if button enabled)
- Shake it (if accelerometer enabled)
- LEDs turn green (success)
-
View Result
- Check notification:
RESULT:245ms - Lower = faster reaction time!
- Check notification:
-
Repeat
- Send
STARTagain for another round - Or send
RESETto stop
- Send
State Indicators
| LED Behavior | State | Meaning |
|---|---|---|
| 🌈 Rainbow spin | Boot | Starting up |
| 💙 Breathing blue | Waiting | No Bluetooth connection |
| 💚 Solid cyan | Connected | Ready to train |
| 🔴 Solid red | Active | Game started - wait for trigger |
| 🟢 Solid green | Success | Triggered! Showing result |
📲 Mobile App Testing
Using nRF Connect (Android/iOS)
Download:
Step-by-Step Testing
- Open nRF Connect
- Scan for devices
- Find
BlazeC3_Pod_01 - Tap CONNECT
- Expand "Unknown Service" (
4fafc201...) - Enable Notifications:
- Tap the up arrow (↗️) on the characteristic
- Select "Indicate" or "Notify"
- Send Commands:
- Tap the down arrow (↙️) or pencil icon (✏️)
- Type command (e.g.,
START) - Select "UTF-8" or "TEXT" format
- Tap SEND
- View Results:
- Notifications appear below the characteristic
- Look for
RESULT:XXXms
Quick Test Sequence
1. GET_COLORS → Verify current colors
2. COLOR_ACTIVE:255,0,255 → Set purple active color
3. START → Begin test
4. [Press button] → Trigger
5. [See RESULT:XXXms] → Check time
6. RESET → Stop
🐛 Troubleshooting
LED Issues
Problem: LEDs don't turn on
Solution:
- Check 5V power connection
- Verify
BRIGHTNESSis not set to 0 - Ensure NeoPixel DIN is on GPIO 3
Problem: LEDs flicker or show wrong colors
Solution:
- Add 1000μF capacitor across NeoPixel VCC/GND
- Add 330Ω resistor on data line (GPIO 3)
- Check power supply (use 5V, not 3.3V)
Button Issues
Problem: Button triggers immediately after START
Solution:
- Check wiring: Button leg 1 to GPIO 5, leg 2 to GND
- Verify
FEATURE_BUTTONis enabled - Open Serial Monitor, check button value when NOT pressed (should be HIGH/1)
- If reading LOW/0 when not pressed, check for loose wires
Problem: Button doesn't trigger
Solution:
- Test with multimeter: Should read 0V when pressed, 3.3V when released
- Try increasing
BUTTON_THRESHOLD(though digital read shouldn't need this) - Check if
FEATURE_BUTTONis commented out
Piezo Issues
Problem: Piezo too sensitive (triggers on its own)
Solution:
- Increase
PIEZO_THRESHOLD(try 2000-3000) - Ensure 1M Ω resistor is connected between GPIO 4 and GND
- Check for loose wires picking up noise
Problem: Piezo not sensitive enough
Solution:
- Decrease
PIEZO_THRESHOLD(try 800-1200) - Open Serial Monitor, slap piezo, note the value
- Set threshold between idle value and slap value
Accelerometer Issues
Problem: Triggers without movement
Solution:
- Increase
ACCEL_THRESHOLD(try 200-300) - Ensure ADXL335 is powered by 3.3V (not 5V!)
- Check wiring is secure
Problem: Doesn't trigger on shake
Solution:
- Decrease
ACCEL_THRESHOLD(try 80-120) - Verify ADXL335 is working (check X/Y/Z values in Serial Monitor)
- Shake harder!
Bluetooth Issues
Problem: Can't find device
Solution:
- Ensure device is powered (LEDs breathing blue)
- Move closer to phone (within 5 meters)
- Restart ESP32-C3 (press RESET)
- Check if already connected to another device
Problem: Can't send commands
Solution:
- Enable Notifications on the characteristic
- Use UTF-8 or TEXT format (not HEX)
- Don't include quotes:
STARTnot"START" - Check if device is connected (LEDs solid cyan)
Problem: Commands not working
Solution:
- Check Serial Monitor for "Received: [COMMAND]"
- Verify command spelling (case-sensitive:
STARTnotstart) - Enable notifications to see responses
Serial Monitor Debugging
Open Serial Monitor:
- Baud rate: 115200
- Line ending: Newline or Both NL & CR
What to look for:
================================
BlazePod C3 - Production Ready
================================
Piezo: OFF
Button: ON
Accel: OFF
================================
System Ready - Waiting for connection...
Device Connected
Received: [START]
Game Started
Trigger: Button
Reaction Time: 245ms
🚀 Advanced Features
Building a Mobile App
For a production app, you can use:
- Flutter (cross-platform)
- React Native (cross-platform)
- Swift (iOS only)
- Kotlin (Android only)
Key BLE Libraries:
- Flutter:
flutter_blue_plus - React Native:
react-native-ble-plx
Multiple Pods Setup
To build 6 pods for group training:
-
Change device names:
#define DEVICE_NAME "BlazeC3_Pod_01" // Pod 1 #define DEVICE_NAME "BlazeC3_Pod_02" // Pod 2 // etc. -
Connect to all pods in your app
-
Send START to all simultaneously
-
Collect results from each pod
Power Optimization
Extend battery life:
- Reduce
BRIGHTNESSto 30-40 - Reduce
BREATHE_MAXto 20 - Add deep sleep after 10 minutes of inactivity
- Use smaller battery (300mAh) for lighter weight
3D Printed Case
Design considerations:
- Diameter: 100-120mm (to fit 12-LED ring)
- Height: 20-30mm (for ESP32-C3 + battery)
- Diffuser: 1-2mm thick milky white PLA over LEDs
- Mounting: Magnets or velcro on bottom
- Button access: Hole or membrane over button
- Charging port: USB-C access hole
Recommended settings:
- Infill: 20%
- Layer height: 0.2mm
- Material: PLA or PETG
📊 Performance Specifications
| Metric | Value |
|---|---|
| Reaction Time Accuracy | ±1ms |
| BLE Range | 10-40 meters (open space) |
| Battery Life | 4-8 hours (typical use) |
| Charging Time | 2-3 hours |
| LED Refresh Rate | 100 Hz |
| Touch Response Time | <5ms |
| BLE Latency | 10-20ms (not included in reaction time) |
📞 Support & Resources
Code Repository
- GitHub: [Your Repo Link]
Community
- Arduino Forum: https://forum.arduino.cc/
- ESP32 Discord: https://discord.gg/esp32
Tutorials
- ESP32-C3 Getting Started: https://docs.espressif.com/
- NeoPixel Guide: https://learn.adafruit.com/adafruit-neopixel-uberguide
- BLE GATT Tutorial: https://www.bluetooth.com/specifications/gatt/
📄 License
This project is open-source. Feel free to modify, distribute, and use for personal or commercial projects.
✅ Quick Start Checklist
- Solder all components
- Install Arduino IDE & ESP32 board support
- Install Adafruit NeoPixel library
- Configure features (comment/uncomment defines)
- Upload code to ESP32-C3
- Open Serial Monitor, verify boot message
- Download nRF Connect app
- Connect to
BlazeC3_Pod_01 - Enable notifications
- Send
START - Trigger the pod
- See
RESULT:XXXms - You're ready to train! 🎉
Happy Training! 💪🔥