Taking live heart-rate from 60 people at the same time using 20 NPG Lite devices connected to a single ESP32-S3 dongle to control a live animation on a web interface!
Data Structure:
- 20 nodes × 3 persons each = 60 simultaneous heart rate readings
- RMS calculation aggregates BPM from all connected nodes to a single BPM value
- Time-series data with event markers for performance analysis
- Place all files in the same directory
- Serve via local web server:
python -m http.server 8000 - Open
http://localhost:8000/index.html
- BPM Plot: Color-coded heart rate bars (Green <90, Orange 90-110, Red >110)
- Nodes Plot: Device connectivity (Red <5, Orange 5-10, Green >10 connected devices)
- Event Markers: Purple circles mark performance events - hover for full data
- Performance Ranges: Red background indicates active performance periods
- Interactive Timeline: Drag, zoom, and scroll through time-series data
- Dual Data Sources: Toggle between Raw and Processed data instantly
Timeline Navigation:
- Drag Timeline Bar: Click and drag the grey timeline bar to scroll through time
- Mouse Wheel: Scroll up/down to move forward/backward through data
- Zoom Slider: Drag left/right arrows on the slider to adjust visible time window
- Slider Handle: Drag the entire green slider handle to jump to different time periods
Data Interpretation:
- BPM Bars: Green (<90) = relaxed, Orange (90-110) = normal, Red (>110 or clamped) = elevated
- Nodes Bars: Red (<5) = poor connection, Orange (5-10) = moderate, Green (>10) = good connection
- Purple Markers: Event indicators (hover for details) - clickable circles at plot tops
- Red Background: Performance duration (from start to freeze frame)
- Hover Any Bar: Shows Time, BPM, Connected Nodes, and Confidence %
Data Source Toggle:
- Switch between "Raw Data" and "Processed Data" buttons at top-right
- Data is cached for instant switching
The project includes a Jupyter notebook ISF-2026-Data-Processing.ipynb for processing raw BPM data:
Processing Steps:
- Event Marker Integration: Merges event markers from
ISF-2026-Event-Markers.csvinto the main dataset - Raw Data Export: Generates
ISF-2026-BPM-Data-Raw-with-events.csvwith all 20 nodes - Data Filtering: Creates processed dataset by:
- Removing Node14 (disconnected device)
- Filtering out rows with ConnectedNodes < 2
- Processed Data Export: Generates
ISF-2026-BPM-Data-Processed-with-events.csv
Requirements: pandas, pathlib
Usage: Run all cells sequentially to regenerate both CSV files from source data.
ISF-2026-BPM-Data-Raw-with-events.csvISF-2026-BPM-Data-Processed-with-events.csvindex.html