Introduction: Heart Rate Monitor

I built a relatively simple heart rate monitor circuit that is monitored and controlled by an Arduino Uno. The theory of operation is based on the fact that infrared (IR) light is partially absorbed by blood. When your index finger is placed between the IR emitter and detector, the amount of IR light absorbed by the finger (and thus transmitted into the detector) varies in sync with your heart beat.

The Arduino monitors and filters the IR detector's signal, and turns a blue LED on and off in sync with your heart beat. The signal filtering library used by the Arduino code can be found here. The filtering is done mathematically and not with an external circuit.

I also modified some Processing code that monitors and plots the filtered signal from the serial monitor.

UPDATE: I replaced the previous Arduino code with a slightly "cleaner" version in which I made a few changes that I believe result in a more robust, less noisy signal. First, I amplify the signal before doing the filtering. Second, I use a band-pass filter with a passband of 1 hz - 3 hz. Also, with the rollout of Arduino 1.6.6 and the Serial Plotter tool, it's quite easy to see the heart rate signal without running the Processing code that I included. Of course, if you want more control over the display, you're going to need more than the Serial Plotter tool, but it's a good first start.

Step 1: Building the Circuit

Build the circuit shown. I used this emitter detector pair from SparkFun. The resistor in series with the emitter is 100 Ohm, and the resistor in series with the detector is 10 kOhm. I use a blue LED (right side of bread board) in series with a 100 Ohm resistor.

Step 2: Connections to the Arduino Uno

The 5 V pin on the Arduino powers both the IR emitter and detector. The Analog 0 input pin monitors the voltage after the 10 kOhm resistor, and the Analog 8 output pin controls the voltage on the blue LED.

Step 3: Output

First upload and run the Arduino code. Second, run the Processing code. The Processing code monitors the serial port output and plots it. The shape of the output pulses is very sensitive to how the index finger is placed between the emitter and detector (position, pressure, etc.), and you can see this in the video below as it's impossible to hold my index finger perfectly still for the duration of the video.

Update: On a whim, I removed the blue LED from the circuit and retested. The new video below shows a markedly improved heart rate signal. I'm not sure what kind of interference (optical? electrical?) was occurring with the Blue LED near the IR detector, but getting rid of it certainly improved the signal. I'll continue testing but I'm curious to see what others find.