Introduction

The DFRobot heart rate sensor is a thumb-sized heart rate monitor designed for Arduino microcontrollers. It includes a Gravity interface, for easy plug-and-play connectivity. This sensor is a pulse sensor which is developed based on PPG (PhotoPlethysmoGraphy) techniques. This is a simple and low-cost optical technique that can be used to detect blood volume changes in the microvascular bed of tissues. It is relatively easy to detect the pulsatile component of the cardiac cycle according to this theory. The sensor has two holes that you can use to attach to your belt. You can wrap on your finger, wrist, earlobe or other areas where it has contact with skin. The heart sensor has two kinds of signal output mode: analog pulse mode and digital square wave mode. You can change its output mode using the dial switch. There are many user scenarios, including education, sports or maker/interactive projects!

Please Note: This product is NOT a medical device and is not intended to be used as such or as an accessory to such nor diagnose or treat any conditions.

Specification

Board Overview

SEN0203_overall.png

NOTE: The switch is to set the working mode, it will change the signal type to be Digital or Analog. If it was NOT set as consistent as the code or wiring, i.e. the switch was set as "A", but you write your code as digitalRead and(or) you wire the module onto Arduino digital pin, in this case, you will fail to get any readings, vice versa.

Tutorial

In this tutorial, you will learn how to use this Heart Rate sensor in digital mode as well as analog mode, more than this, at the end of this tutorial, we will show you how to use this sensor to draw the ECG to a LCD module.

Requirements

Before start

Once you opened the box, you can find a black belt inside of the package. Thread it through the holes of the sensor as indicted in the photo. And then you could attach it on your finger (suggested), wrist or any other places where exposes blood vessels. Do not attach the belt too tight or too loose to your finger or the reading might be not stable. During the test, you should steady your finger and do not move too much, or the readings might be unstable.

1.Thread the belt through the holes

2.Wrap on finger

3.Wrap on wrist

4.Wrap on the back of wrist

Connection Diagram

SEN0203_Connection_Diagram.png

Sample Code

The sample code could be found in the Github Page, open the example "DFRobot_Heartrate_Digital_Mode".


/*!
* @file DFRobot_Heartrate.h
* @brief DFRobot_Heartrate.h detailed description for Heartrate.cpp 
*
*  This is written for the heart rate sensor the company library. Mainly used for real 
*  time measurement of blood oxygen saturation, based on measured values calculate heart rate values.
* 
* @author linfeng(Musk.lin@dfrobot.com)
* @version  V1.1
* @date  2016-8-16
* @version  V1.0
* @date  2015-12-24
*/
#define heartratePin A1
#include "DFRobot_Heartrate.h"

DFRobot_Heartrate heartrate(DIGITAL_MODE); ///< ANALOG_MODE or DIGITAL_MODE

void setup() {
  Serial.begin(115200);
}

void loop() {
  uint8_t rateValue;
  heartrate.getValue(heartratePin); ///< A1 foot sampled values
  rateValue = heartrate.getRate(); ///< Get heart rate value 
  if(rateValue)  {
    Serial.println(rateValue);
  }
  delay(20);
}
/******************************************************************************
  Copyright (C) <2015>  <linfeng>
  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.
  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.
  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  Contact: Musk.lin@dfrobot.com
 ******************************************************************************/

Digital Mode

  1. Wiring
    • Select the sensor's mode switch as "D" for Digital
    • Connect it with UNO's A1 as the code indicates (you could change it as you wish)
  2. Upload the code
  3. Open the Serial monitor.
  4. Adjust the finger's position until you notice the LED is flashing regularly as your heartbeat, after several seconds, the Serial Monitor will print your heart rate.

Expected results:

SEN0203_flashing_as_heart_beats.gif
SEN0203_serial_reading_d.png

Draw the ECG (Electrocardiography)

Digital Mode

  1. Attach this sensor to Arduino D2

  2. Set the sensor mode switch as D (digital)

  3. Upload the code below

  4. Open the Arduino Serial Plotter (Baud: 9600)

    Open "Serial Plotter"


/*
  DigitalReadSerial
 Reads a digital input on pin 2, prints the result to the serial monitor

 This example code is in the public domain.
 */

// digital pin 2 has a pushbutton attached to it. Give it a name:
int pushButton = 2;

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  // make the pushbutton's pin an input:
  pinMode(pushButton, INPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input pin:
  int buttonState = digitalRead(pushButton);
  // print out the state of the button:
  Serial.println(buttonState);
  delay(10);        // delay in between reads for stability
}

SEN0203_plotter_digital.png

Analog Mode

  1. Attach this sensor to Arduino A1
  2. Set the sensor mode switch as A (analog)
  3. Upload the code below
  4. Open the Arduino Serial Plotter (Baud: 9600)

/*
  AnalogReadSerial
  Reads an analog input on pin 0, prints the result to the serial monitor.
  Graphical representation is available using serial plotter (Tools > Serial Plotter menu)
  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.

  This example code is in the public domain.
*/

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A1);
  // print out the value you read:
  Serial.println(sensorValue);
  delay(10);        // delay in between reads for stability
}

SEN0203_plotter_Analog.png

Use it with LCD12864 shield

  1. Please download and install the library for LCD12846.
  2. Upload the code below
  3. It will display the heart rate and ECG on the LCD(12846) screen.


/*!
* @file HeartrateDisplay
* @brief  Waves of blood oxygen saturation and heart rate value is displayed on the LCD
*
* @brief  Waves of blood oxygen saturation and heart rate value is displayed on the LCD
*
* @author linfeng(490289303@qq.com)
* @version  V1.1
* @date  2016-8-16
* @version  V1.0
* @date  2015-12-24
*/

#define heartratePin A1
#include "Heartrate.h"
#include "Lcd12864Shield.h"

uint16_t heartrateValue=0,heartrateValueLast=0;
uint8_t count;

Lcd12864Shield lcddisplay(10,9,8,13,11);
Heartrate heartrate(DIGITAL_MODE); ///< ANALOG_MODE or DIGITAL_MODE

char wordDisplay[]=  ///< word
{
0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,
0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,
0x00,0x00,0xC0,0xE0,0xE0,0xE0,0xC0,0x80,
0xC0,0xE0,0xE0,0xE0,0xC0,0x00,0x00,0x00,///< ♥
};
char letterDisplay[]= ///< character
{

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,///< 0
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,///< 1
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,///< 2
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,///< 3
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,///< 4
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,///< 5
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,///< 6
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,///< 7
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,///< 8
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,///< 9
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,///< =
};



void lcdBegin(void)
{
  lcddisplay.initialLcd(); ///< Enable LCD
  lcddisplay.clearScreen(); ///< Clear LCD
  lcddisplay.drawXLine(48); ///< Draw a horizontal line
  lcddisplay.drawYLine(7); ///< Draw a vertical line
  lcddisplay.drawWord(7,10,0,wordDisplay); ///< Displays a word
  lcddisplay.drawLetter(7,30,10,letterDisplay); ///< Displays a character
}

void setup() {
  Serial.begin(115200);
  lcdBegin();
}

void loop() {
  unsigned char rateValue;
  heartrateValueLast = heartrateValue;
  heartrateValue = heartrate.getValue(heartratePin);  ///< A1 foot sampled values
  count = heartrate.getCnt();
  if(count)
  {
    lcddisplay.drawYLine(count+8,heartrateValue/24,heartrateValueLast/24); ///< Draw a vertical line,Step 24
  }
  else
  {
    lcddisplay.drawYLine(count+8,heartrateValue/24,heartrateValueLast/24);
  }

  rateValue = heartrate.getRate(); ///< Get heart rate value
  if(rateValue)
  {
    lcddisplay.drawLetter(7,50,3,rateValue,letterDisplay);  ///< Display values
    Serial.println(rateValue);
  }
  delay(20);
}

FAQ

Q1. Some general Arduino Problems/FAQ/Tips
A1. Click the topic link on DFRobot Forum.
For any questions, advice or cool ideas to share, please visit the DFRobot Forum.

More

Schematic
Layout
SON1303 Datasheet
SON3130 Datasheet

DFshopping_car1.png Get Gravity: Heart Rate Monitor Sensor For Arduino from DFRobot Store or DFRobot Distributor.

Turn to the Top