-
-
Save kulbhushanchand/5733d844e5e11d8ad1a771b45da533ce to your computer and use it in GitHub Desktop.
Code to read heartbeats from the SeedStudio heartrate clip sensor.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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