Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save kulbhushanchand/5733d844e5e11d8ad1a771b45da533ce to your computer and use it in GitHub Desktop.
Save kulbhushanchand/5733d844e5e11d8ad1a771b45da533ce to your computer and use it in GitHub Desktop.
Code to read heartbeats from the SeedStudio heartrate clip sensor.
/* Program to measure and display heart beats on two led's (and on serial monitor for debug)
* Green led flashes at approx freq of your heart rate when you are at or below your target,
* if you go above this (eg 65 bpm) the red.
* led flashes at the approx freq of your heart rate
* You can check by feeling your pulse
* in your neck and looking at LED - both should be in sync
* C. Turner 16/01/2013.
* Seeed product wiki http://www.seeedstudio.com/wiki/Grove_-_Heart_rate_ear_clip_kit
* Avaialible in UK here: https://digitalmeans.co.uk/shop/sensors-category/sensors-medical-category/grove-ear_clip_heart_rate_sensor
* More detailed project write-up here: http://gampageek.blogspot.co.uk/2013/01/arduino-meets-yogic-arts-seeduino-ear.html
// Sketch is provided "As is" with no guarantees, or support from the Author.
// Help with Arduino and shields can be found by joining the forum on the Arduino website: http://arduino.cc/en/
*/
unsigned char HIpin = 13;//red led = over target & use 560 Ohm resitor in series
unsigned char LOpin = 12;// green = @target heart rate or below & use 560 Ohm resitor in series
// times
unsigned long t1 = 0;
unsigned long t2 = 0;
unsigned long counter = 0; // count interrupts = beats
unsigned long secsElapsed = 0; // time for 60 beats
unsigned long myCount = 0; // heart beat count so far
float heartRate = 0; // instantaneous rate
float averageHeartRate = 0;// ave over 30 beats
volatile boolean beatDetect = false;
void setup()
{
pinMode(HIpin, OUTPUT);
pinMode(LOpin, OUTPUT);
Serial.begin(9600);
Serial.println("Please ready your ear clip.");
digitalWrite(HIpin, HIGH);// red led off
delay(2000);//time to place clip, note that some people's earlobes are too thick (mine are)
// I had to place it on the main ear. May need to play until you get sensible results.
// change to 5000 or more if need more time.
digitalWrite(HIpin, LOW);// leds off
digitalWrite(LOpin, LOW);
Serial.println("Heart rate test begin.");// debug
t1 = millis(); // set start time.
attachInterrupt(0, interrupt, RISING);//set interrupt 0, digital pin 2 -
//Seed / grove heart monitor out pin is attched here.
}
void loop()
{
if (beatDetect == true)// if interrupted on pin 2 ie beat was detected
{
//*****************************************************************************
Serial.println("BEAT");// debug: print BEAT on each interrupt
if (counter > 20 )// use heart rate when 20 beats averaged
{
Serial.println("Heart Rate is: ");// debug
averageHeartRate = heartRate;
Serial.print(averageHeartRate);// debug
Serial.println();// debug
}
//************************************************************************************
counter = counter + 1 ;
t2 = millis(); // check time
myCount = counter;// heart beats so far
secsElapsed = (t2 - t1 ) / 1000 ; // seconds elapsed
heartRate = (float(myCount) / float(secsElapsed) ) * 60;// beats per minute
beatDetect = false;// reset for next interrupt (beat)
if (counter == 61)
{
counter = 0; // reset counter after 30 beats
t1 = millis(); // reset t1 to millis()
}
//display the info **************************
if (averageHeartRate != 0)
{
// SET TARGET HEART BEAT HERE ++++++++++++++++++++++++++++++++++++++++++++++++
if (averageHeartRate > 63)// my average resting heart rate = 65 bpm - choose your own
{
//HIGH target RED led
digitalWrite(HIpin, HIGH);// red led on
delay10thsOfSeconds (1);// flash at heart beat rate
digitalWrite(HIpin, LOW);// red led off
delay10thsOfSeconds (1);// flash at heart beat rate
digitalWrite(LOpin, LOW);// green led off
}
if (averageHeartRate <= 63) // my average resting heart rate = 65bpm choose your own
{
//LOW target green led
digitalWrite(LOpin, HIGH);// green led on
delay10thsOfSeconds (1);// flash at heart beat rate
digitalWrite(LOpin, LOW);// gree led off
delay10thsOfSeconds (1);// flash at heart beat rate
digitalWrite(HIpin, LOW);// red led off
}
}
else if (averageHeartRate == 0)// when starting up flash both leds
{
digitalWrite(HIpin, HIGH);// red led on
delay10thsOfSeconds (1);// flash at heart beat rate
digitalWrite(HIpin, LOW);// red led off
delay10thsOfSeconds (1);// flash at heart beat rate
digitalWrite(LOpin, LOW);// green led off
digitalWrite(LOpin, HIGH);// green led on
delay10thsOfSeconds (1);// flash at heart beat rate
digitalWrite(LOpin, LOW);// gree led off
delay10thsOfSeconds (1);// flash at heart beat rate
digitalWrite(HIpin, LOW);// red led off
}
}// end of beat detected
}
void interrupt()
{
beatDetect = true;
}
void delay10thsOfSeconds (int multi){// delay multi x 0.1 sec
for (int i = 1; i < (multi * 10); i++) // wait 10 = 0.1 sec
{
delayMicroseconds(10000); // multi x 100 x 10000 us
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment