top of page
Search
  • Writer's pictureIfrim Ciprian

Pulse Sensor - Testing

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


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.

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.


5 views0 comments

Recent Posts

See All
bottom of page