# šŸ“– TAKEONE REFLEX C3 - DIY Reaction Light System ## Complete User Documentation --- ## šŸ“‹ Table of Contents 1. [Overview](#overview) 2. [Hardware Requirements](#hardware-requirements) 3. [Wiring Diagram](#wiring-diagram) 4. [Software Setup](#software-setup) 5. [Configuration](#configuration) 6. [BLE Commands Reference](#ble-commands-reference) 7. [Using the Device](#using-the-device) 8. [Mobile App Testing](#mobile-app-testing) 9. [Troubleshooting](#troubleshooting) 10. [Advanced Features](#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 1. Open **Arduino IDE** 2. Go to **File > Preferences** 3. Add this URL to **"Additional Board Manager URLs"**: ``` https://espressif.github.io/arduino-esp32/package_esp32_index.json ``` 4. Go to **Tools > Board > Boards Manager** 5. Search for **"esp32"** 6. Install **"esp32 by Espressif Systems"** (version 2.0.9 or higher) ### Step 3: Install Required Libraries 1. Go to **Sketch > Include Library > Manage Libraries** 2. Search and install: - **Adafruit NeoPixel** by Adafruit ### Step 4: Select Board Settings 1. **Tools > Board**: Select **"ESP32C3 Dev Module"** 2. **Tools > USB CDC On Boot**: **"Enabled"** 3. **Tools > Partition Scheme**: **"Default 4MB with spiffs"** 4. **Tools > Port**: Select your ESP32-C3 port ### Step 5: Upload Code 1. Copy the full code into Arduino IDE 2. Click **Verify** (āœ“) to compile 3. **Hold BOOT button** on ESP32-C3 4. **Press RESET** (or plug in USB while holding BOOT) 5. Click **Upload** (→) 6. Release BOOT button when you see "Connecting..." 7. Press **RESET** once after upload completes --- ## āš™ļø Configuration ### Enable/Disable Sensors At the top of the code, you'll find: ```cpp // --- 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)** ```cpp //#define FEATURE_PIEZO #define FEATURE_BUTTON //#define FEATURE_ACCEL ``` **Slap Only (Classic Mode)** ```cpp #define FEATURE_PIEZO //#define FEATURE_BUTTON //#define FEATURE_ACCEL ``` **Full Features (All Triggers)** ```cpp #define FEATURE_PIEZO #define FEATURE_BUTTON #define FEATURE_ACCEL ``` ### Adjust Sensitivity ```cpp #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 ```cpp #define DEVICE_NAME "BlazeC3_Pod_01" ``` Change to any name (max 15 characters). ### Adjust LED Brightness ```cpp #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 1. **Power On** - Turn on the slide switch - LEDs perform **rainbow spin** (2 seconds) - LEDs enter **breathing blue** mode (waiting for connection) 2. **Connect via Bluetooth** - Open nRF Connect or your mobile app - Scan for `BlazeC3_Pod_01` - Tap **CONNECT** - LEDs turn **solid cyan** (connected) 3. **Customize Colors** (Optional) - Send `COLOR_ACTIVE:255,0,255` for purple active color - Send `GET_COLORS` to verify 4. **Start Reaction Test** - Send `START` - LEDs turn **red** (or your custom active color) - **Wait for the light...** 5. **Trigger the Pod** - **Slap** it (if piezo enabled) - **Press** the button (if button enabled) - **Shake** it (if accelerometer enabled) - LEDs turn **green** (success) 6. **View Result** - Check notification: `RESULT:245ms` - Lower = faster reaction time! 7. **Repeat** - Send `START` again for another round - Or send `RESET` to stop ### 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**: - [Android](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp) - [iOS](https://apps.apple.com/us/app/nrf-connect-for-mobile/id1054362403) #### Step-by-Step Testing 1. **Open nRF Connect** 2. **Scan** for devices 3. **Find** `BlazeC3_Pod_01` 4. **Tap CONNECT** 5. **Expand** "Unknown Service" (`4fafc201...`) 6. **Enable Notifications**: - Tap the **up arrow** (ā†—ļø) on the characteristic - Select **"Indicate"** or **"Notify"** 7. **Send Commands**: - Tap the **down arrow** (ā†™ļø) or **pencil icon** (āœļø) - Type command (e.g., `START`) - Select **"UTF-8"** or **"TEXT"** format - Tap **SEND** 8. **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 `BRIGHTNESS` is 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_BUTTON` is 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_BUTTON` is 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: `START` not `"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: `START` not `start`) - 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: 1. **Change device names**: ```cpp #define DEVICE_NAME "BlazeC3_Pod_01" // Pod 1 #define DEVICE_NAME "BlazeC3_Pod_02" // Pod 2 // etc. ``` 2. **Connect to all pods** in your app 3. **Send START to all** simultaneously 4. **Collect results** from each pod ### Power Optimization **Extend battery life**: - Reduce `BRIGHTNESS` to 30-40 - Reduce `BREATHE_MAX` to 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! šŸ’ŖšŸ”„**