Signal Coach
1 Upload the sketch2 Close Serial Monitor3 Click Connect4 Place the sensor gently
Already sending pulse data? Start at Connect. Desktop Chrome, Edge, or Brave. Coach not loading? Open directly.
BETA
What the coach does: It reads your live pulse wave and tells you when to adjust the sensor, hold still, or trust the BPM.
Pulse samples stay in this browser tab. This beta runs alongside the current WebSerial page. Wave visible but not locking? Use Re-sync Signal.
Tell us what happened
Tell us your board, what went wrong, whether you can repeat it, and whether it also happens with another finger or person.
Hack Signal Coach at home
Every part of the Chrome coach is public, readable source code: the waveform UI, beat detector, BPM/IBI logic, coaching states, Re-sync recovery, serial adapters, tests, tutorial page, and Arduino sender. There is no build step, minified bundle, cloud detector, or private dependency.
1 · Send raw samples
Upload the minimal Arduino/ESP32 sketch. It prints one ADC value every 20 ms; Chrome does the coaching.
2 · Run locally
Serve the downloaded repository on localhost, open the dashboard in Chrome, and connect at 50 samples/s.
3 · Change anything
Edit the unminified detector, copy, colors, serial formats, waveform renderer, or tests under the MIT License.
python3 -m http.server 8000
# Open http://localhost:8000/docs/signal-coach/ in Chrome
Arduino / ESP32 setup
No Arduino library is required for the simplest stream. Choose the signal pin for your board, upload this sketch, select 50 samples/s above, and let Chrome do the beat detection and coaching. The same sketch is saved in the repo as SignalCoachWebSerial.ino.
| Board | PULSE_PIN |
Sensor power |
|---|---|---|
| Arduino Uno / Nano / Mega | A0 |
5V or 3.3V |
| XIAO ESP32-S3 | 1 |
3.3V |
| ESP32 DevKit | 34 |
3.3V |
/* PulseSensor Signal Coach — minimal Web Serial sender
* Sends one raw pulse-wave sample per line at 115200 baud.
* Chrome owns beat detection, BPM/IBI, coaching, and Re-sync.
* World Famous Electronics LLC · MIT License
*/
const int PULSE_PIN = A0; // XIAO ESP32-S3 A0 = GPIO 1; ESP32 DevKit often uses 34.
const unsigned long SAMPLE_PERIOD_MS = 20;
unsigned long nextSampleAt = 0;
void setup() {
Serial.begin(115200);
delay(1000);
}
void loop() {
if ((long)(millis() - nextSampleAt) < 0) return;
nextSampleAt += SAMPLE_PERIOD_MS;
Serial.println(analogRead(PULSE_PIN));
}
Troubleshooting
| What you see | What to try |
|---|---|
| Cannot connect | Close Arduino Serial Monitor. Use desktop Chrome, Edge, or Brave. Reconnect USB and try again. |
| No Signal | Check signal, power, and ground. Confirm the sketch pin and 115200 baud. Then place the sensor on skin. |
| Hold Steady | Use lighter pressure. Rest your hand on a surface, keep the cable from pulling, or try an earlobe. |
| Good Wave but no BPM | Keep the same position for a few more beats. The coach waits for a repeatable pattern. |
| Signal Lost | Motion or pressure changed. Reposition gently and hold still again. |
| Signal stuck near 0 or full scale | Check wiring and power. Make sure the signal wire reaches an analog-capable input. |
What about Signal, Beat, and IBI?
Signal is the raw ADC reading used to draw the waveform. Beat is a one-sample event you can use to flash a light or trigger an animation. IBI is the measured time between accepted beats in milliseconds. Signal Coach keeps these in Technical details because most users need placement guidance and a trustworthy waveform before they need raw timing values.
How Web Serial works
Your board sends raw pulse-wave samples over USB at 115200 baud. A single number per line is enough; the tutorial's signal,bpm,ibi,beat format works too. Chrome draws the waveform, detects beats, calculates IBI and BPM, and runs Signal Coach. Any BPM or IBI supplied by the board is shown only as a diagnostic and never controls the coach. No samples are sent to PulseSensor.com.
The current PulseSensor Kit includes the TPU Stabilizer Ring, finger strap, ear clip, and insulation dots.
Educational biofeedback only. PulseSensor and Signal Coach are not medical devices and must not be used for diagnosis, treatment, or health decisions.