One of the features that I want to add to my device is the ability to measure the heart rate of the wearer, and for the purpose of the testing I decided to use one of the cheaper sensors, before going and testing with something more professional and accurate.
I have decided to use a SFASF Pulse Sensor module, with a working voltage of 3.3 volts to 5 volts, with the documentation available here: https://pulsesensor.com/pages/code-and-guide
![](https://static.wixstatic.com/media/4b820e_63b366e243204955a0d6779007e1b916~mv2.jpg/v1/fill/w_980,h_866,al_c,q_85,usm_0.66_1.00_0.01,enc_auto/4b820e_63b366e243204955a0d6779007e1b916~mv2.jpg)
After running the following code:
#define USE_ARDUINO_INTERRUPTS true
// VARIABLES
int pulsePin = 0; // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13; // pin to blink led at each beat
int fadePin = 5; // pin to do fancy classy fading blink at each beat
int fadeRate = 0; // used to fade LED on with PWM on fadePin
// these variables are volatile because they are used during the interrupt service routine!
volatile int BPM; // used to hold the pulse rate
volatile int Signal; // holds the incoming raw data
volatile int IBI = 600; // holds the time between beats, must be seeded!
volatile boolean Pulse = false; // true when pulse wave is high, false when it's low
volatile boolean QS = false; // becomes true when Arduoino finds a beat.
void setup(){
pinMode(blinkPin,OUTPUT); // pin that will blink to your heartbeat!
pinMode(fadePin,OUTPUT); // pin that will fade to your heartbeat!
Serial.begin(115200); // we agree to talk fast!
while(!Serial); // this is necessary for Leonardo to find the serialport.
delay(100);
Serial.println("Pulse Sensor Amped - Leonardo");
Serial.println("done interrupt setup");
// UN-COMMENT THE NEXT LINE IF YOU ARE POWERING The Pulse Sensor AT LOW VOLTAGE,
// AND APPLY THAT VOLTAGE TO THE A-REF PIN
// analogReference(EXTERNAL);
}
void loop(){
sendDataToProcessing('S', Signal); // send Processing the raw Pulse Sensor data
if (QS == true){ // Quantified Self flag is true when arduino finds a heartbeat
fadeRate = 255; // Set 'fadeRate' Variable to 255 to fade LED with pulse
sendDataToProcessing('B',BPM); // send heart rate with a 'B' prefix
sendDataToProcessing('Q',IBI); // send time between beats with a 'Q' prefix
QS = false; // reset the Quantified Self flag for next time
}
ledFadeToBeat();
delay(20); // take a break
}
void ledFadeToBeat(){
fadeRate -= 15; // set LED fade value
fadeRate = constrain(fadeRate,0,255); // keep LED fade value from going into negative numbers!
analogWrite(fadePin,fadeRate); // fade LED
}
void sendDataToProcessing(char symbol, int data ){
Serial.print(symbol); // symbol prefix tells Processing what type of data is coming
Serial.println(data); // the data to send culminating in a carriage return
}
The Arduino was generating good outputs in the Serial Monitor.
![](https://static.wixstatic.com/media/4b820e_736e56530614430dba2a8b13d5da4358~mv2.png/v1/fill/w_980,h_395,al_c,q_90,usm_0.66_1.00_0.01,enc_auto/4b820e_736e56530614430dba2a8b13d5da4358~mv2.png)
However, I noticed that the sensor was only working with the tip of my fingers, and could not be used, while generating accurate values, with the wrist, so I needed to start researching sensors (and successful projects for them) that could be placed on the wrist and would work accordingly.
Some sensor modules that I found that could pe successful in achieving our desired task:
Gravity Heart Rate Monitor Sensor
AD8232 ECG Sensor
DFRobot heart rate sensor
Optical Heart Rate Sensor (SEN0203)
The last 2 seem the most promising, but more research needs to be done on accuracy and wrist functionality, before pulling the trigger and acquiring one of them.
Comments