Reads heart rate from an Arduino pulse sensor over USB and puts it on screen as a live overlay, so a BPM readout and waveform could be shown on stream while playing a game.
Written in 2016. Archived to GitHub in 2026.
This is old code, unfinished, and probably buggy. It was a quick side project that I lost interest in and never polished, and it's archived here as-is.
An example of it overlayed onto Alien: Isolation. See video of it in action: https://www.youtube.com/watch?v=4SECn4RsA4Y
There are two windows. The main one has a connect button, large readouts for BPM, inter-beat interval and raw signal, and a scrolling waveform of the raw sensor value.
The second (not shown) is the overlay. It has no window chrome and sits on a black background, and shows just the BPM figure next to a heart icon along with the waveform. It's meant to be picked up in OBS as a window capture and composited over gameplay by keying out the black background.
The sensor is a PulseSensor on an Arduino, connected over USB. The Arduino streams newline-terminated readings at 115200 baud, one reading per line, where the first character tags what the number means:
| Prefix | Meaning |
|---|---|
S |
Raw sensor signal |
B |
Beats per minute |
Q |
Inter-beat interval, in milliseconds |
So a line reads like B72 or S512. This is the format emitted by the PulseSensor "Getting Started"
Arduino sketch, which is not included here.
The port and baud rate are hardcoded to COM5 and 115200 in Core/PulseSensor.cs. There's no UI
for changing them, so you'd need to edit that to match wherever your board enumerates.
Open the solution in Visual Studio and build. It targets .NET Framework 4.5.2 and WPF, so it's Windows-only.
The 4.5.2 targeting pack often isn't installed on current machines. If the build fails with MSB3644,
either install that pack or retarget without editing the project:
msbuild PulseMonitor.csproj /p:Configuration=Debug /p:TargetFrameworkVersion=v4.8
It builds and runs clean against 4.8. Without a sensor attached you'll get the window above, and connecting will fail.

