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
- Input Voltage (Vin): 3.3 - 6V (5V recommended)
- Output Voltage: 0 - Vin (Analog), 0/ Vin (Digital)
- Operating current: <10mA
- Dimension: 28 x 24(mm), 1.102" x 0.945"(in)
- Interface Type: PH2.0-3P
Board Overview
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
- Hardware
- 1 x DFRduino UNO (or similar)
- 1 x This Heart Rate Sensor
- 1 x IO Expansion Shield for Arduino (suggested)
- Some wires
Software
- Arduino IDE 1.6.6+, Click to Download Arduino IDE from Arduino®
Library
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
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
- 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)
- Upload the code
- Open the Serial monitor.
- 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:
Draw the ECG (Electrocardiography)
Digital Mode
- Attach this sensor to Arduino D2
- Set the sensor mode switch as D (digital)
- Upload the code below
- Open the Arduino Serial Plotter (Baud: 9600)
/*
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
}
Analog Mode
- Attach this sensor to Arduino A1
- Set the sensor mode switch as A (analog)
- Upload the code below
- 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
}
Use it with LCD12864 shield
- Please download and install the library for LCD12846.
- Upload the code below
- 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
For any questions, advice or cool ideas to share, please visit the DFRobot Forum. |
---|