A smart rowing machine monitor firmware for ESP32-S3 that transforms a rowing machine into a connected fitness device with Bluetooth FTMS support and a real-time web interface.
- Bluetooth FTMS - Works with Kinomap, EXR, MyHomeFit, and other fitness apps
- Web Interface - Real-time metrics via WiFi on any browser
- Heart Rate Support - Connects to BLE heart rate monitors
- Accurate Metrics - Physics-based power, pace, and distance calculations
- Session Storage - Saves workouts with full data for later sync
| Component | Connection |
|---|---|
| ESP32-S3 DevKitC-1 | USB-C for power |
| Flywheel reed switch | GPIO 15 + GND |
| Seat reed switch | GPIO 16 + GND |
Requires ESP-IDF v6.0+.
git clone https://github.com/j0b333/ESP32RowingMachine.git
cd ESP32RowingMachine
idf.py set-target esp32s3
idf.py build
idf.py -p /dev/ttyUSB0 flash monitor- Connect to WiFi: CrivitRower (open network, no password)
- Open browser: http://192.168.4.1
- Connect it to your local wireless network or use it directly using http://rower.local
- Start rowing!
Note: ESP32-S3 has known issues with WPA2 softAP. Using an open network is more reliable. Once connected to your home WiFi, the device uses your router's security.
Full Documentation - Complete guides and references
| Guide | Description |
|---|---|
| Setup Guide | Hardware wiring, building, configuration |
| API Reference | REST endpoints and WebSocket interface |
| Architecture | System design and modules |
| Physics Model | How metrics are calculated |
Real-time rowing metrics display with power, distance, pace, and heart rate.
Live graphs showing pace, power, and heart rate over time.
View and manage your saved workout sessions.
Configure weight, heart rate zones, units, and advanced options.
Sync workouts to Samsung Health / Google Fit: ESP32RowingMachineCompanionApp
If clients cannot connect to the "CrivitRower" WiFi network:
- Verify the password - Default is
12345678(8 characters required for WPA2) - Check the logs - Look for disconnect reason codes in the serial output
- Try different devices - If only some devices fail, it may be client-specific
- Test WiFi hardware - Access
http://192.168.4.1/api/wifi/statusfrom a connected device to see diagnostics:{ "diagnostics": { "wifiHardwareOk": true, "nearbyNetworks": 5, "hardwareHint": "WiFi hardware appears functional" } } - If diagnostics show hardware issues - The ESP32's antenna may be damaged. Try a different ESP32 board.
Common log messages and their meanings:
removing station after unsuccessful auth/assoc- Client failed to authenticate (wrong password or client issue)AUTH_FAIL- Authentication failed, check passwordHANDSHAKE_TIMEOUT- Possible hardware issue or interferenceASSOC_FAIL- Association failed, may indicate hardware problem
There is a known bug in ESP-IDF affecting ESP32-S3 softAP mode where some iOS/Android devices fail to connect (GitHub issues #13508, #13608, #13210). This issue does not affect the original ESP32.
Workarounds:
- Use an original ESP32 board instead of ESP32-S3
- Try downgrading to ESP-IDF v4.4.x
- Reboot your phone and try connecting again
- Put your phone in airplane mode, then enable WiFi only (disable cellular)
MIT License - See LICENSE for details.
This project is inspired by and builds upon the work of the open source community. See Attributions for credits including:
- OpenRowingMonitor - Physics algorithms
- ESP-IDF - Espressif IoT Development Framework
- NimBLE - Bluetooth stack
This was done purely as a hobby project for my own usage. Therefore it was also almost completly vibe coded. You are free to use or add on to it as you see fit but I cannot guarantee great code.



