Pulse Sensor Presentation
By Jason Kim, Rachel Law, and Freddie Andrade
1)Pulse Sensor Description Presentation
2)Pulse Sensor Working with LED & working with LOL Shield
LED Arduino Code and Processing Code (from http://www.pulsesensor.com)
LOL Shield Arduino Code
#include <Charliplexing.h> //Imports the library, which needs to be byte line = 0; //Row counter char buffer[10]; int value; // VARIABLES unsigned long time; // Holds current time for pulse rate calculation unsigned long lastTime; // Used for calculating time between beats int Sensor; // Holds current analog Sensor Reading int lastSensor; // Used to find waveform direction int Peak; // Holds value of peak in waveform int Trough; // Holds value of trough in waveform int beats[10]; // Array to collect time between beats for calculating BPM int beatCounter = 0; // Used to hold position in beats array int QuantifiedSelf; // Used to hold the heart rate value (BPM) int drop; // Holds the amplitude of waveform int fadeRate = 10; // when arduino finds a heartbeat, it will fade an LED on pin 11 (PWM) int Fade = 0; // Fade variable will set PWM boolean falling = false; // used to keep track of waveform direction // PINS int LED = 13; // pin 13 LED blinks on each pulse int dimLED = 11; // LED on pin 11 fades with each pulse int PulseSensor = 5; // Pulse Sensor purple wire connected to analog pin 5 void setup() { LedSign::Init(); // pinMode(LED, OUTPUT); // set the LED pins as outputs // pinMode(dimLED, OUTPUT); Serial.begin(115200); // start the hardware serial block and set the baud rate lastTime = millis(); // initialize lastTime variable } void loop() { Sensor = analogRead(PulseSensor); // take a reading Serial.print("s"); // send raw analog data to Processing sketch (or other) Serial.println(Sensor); // 's' = Raw Sensor Data // USE WITH LED ON PIN 11 FOR FADE EFFECT // Fade -= fadeRate; // Fade variable set to 255 when heart beat is found // Fade = constrain(Fade,0,255); // these lines fade the LED // analogWrite(dimLED,Fade); // KEEP TRACK OF THE DIRECTION OF THE WAVEFORM if (falling == false){ // if the sensor values are rising if (Sensor < lastSensor-1){ // if current reading is less than last reading - noise falling = true; // a peak has been reached Serial.print("P"); // send peak value to Processing scketch (or other) Serial.println(Peak); // 'P' = Peak in waveform // digitalWrite(LED,LOW); // turn off pin 13 LED // myHeart(); smallHeart(); }else if(Sensor > lastSensor){ // otherwise, if current reading is bigger, values are still rising Peak = Sensor; // record the next potential peak lastSensor = Sensor; // keep track of rising signal } } if (falling == true){ // if the sensor values are falling if (Sensor > lastSensor){ // if current reading is bigger than last reading falling = false; // a trough has been reached Serial.print("T"); // send trough value to Processing sketch (or other) Serial.println(Trough); // 'T' = Trough in waveform drop = Peak - Trough; // difference = signal amplitude Peak = 0; // setting Peak to 0 here helps get rid of noise // THIS IF STATEMENT IS HOW THE HEARTBEAT IS FOUND IN PULSE SENSOR WAVEFORM if (drop > 4 && drop <60){ // ignore noise in signal. adjust as needed timeBeat(); // go work out the BPM Serial.print("d"); // send the amplitude to Processing Sketch (or other) Serial.println(drop); // 'd' = amplitude of waveform // digitalWrite(LED,HIGH); // start pin 13 LED blink bigHeart(); // Fade = 255; // set fading LED to high brightness } }else if (Sensor < lastSensor){ // otherwise, if current reading is smaller weʻre still falling Trough = Sensor; // record the next potential trough lastSensor = Sensor; // keep track of falling signal } } delay(150); //SLOW DOWN!!!!!!!! (LOL SHIELD) // break for 20mS. Processing frame-rate = 100. }// END VOID LOOP void timeBeat(){ time = millis(); // take note of the current time beats[beatCounter] = time - lastTime; // record miliseconds since the last pulse in beats array lastTime = time; // stay up to date! beatCounter ++; // move array pointer to next position in array if (beatCounter == 10){ // if we've taken 10 readings, it's time to derive heart rate QuantifiedSelf = getBPM(); // go derive the heart rate Serial.print("q"); // send the heart rate to Processing sketch (or other) Serial.println(QuantifiedSelf); // 'q' = heart rate beatCounter = 0; } }// END OF timeBeat FUNCTION // This function will return a value for heart rate (Beats Per Minute) int getBPM(){ int dummy; // used in sorting int mean; // used in averaging boolean done = false; // clear sorting flag // this simple sorting routine will arrange values in the beat array from lowest to highest while(done != true){ done = true; for (int j=0; j<9; j++){ // simple swap sorts numbers from lowest to highest if (beats[j] > beats[j + 1]){ // sorting numbers here dummy = beats[j + 1]; beats [j+1] = beats[j] ; beats[j] = dummy; done = false; } } } // this FOR loop selects the longer beat time values to avoid incorrect heart rate readings for(int k=1; k<9; k++){ // exclude lowest and highest values from averaging mean += beats[k]; // add beat times together } mean /=8; // averaging mean = 60000/mean; // devide 60 seconds by average pulse length return mean; // return beats per minute }// END OF getBPM function void smallHeart() { // delay(2000); DisplayBitMap(0); DisplayBitMap(0); DisplayBitMap(288); DisplayBitMap(720); DisplayBitMap(528); DisplayBitMap(528); DisplayBitMap(288); DisplayBitMap(192); DisplayBitMap(0); } void bigHeart() { // delay(100); DisplayBitMap(0); DisplayBitMap(816); DisplayBitMap(1224); DisplayBitMap(2052); DisplayBitMap(2052); DisplayBitMap(1032); DisplayBitMap(528); DisplayBitMap(288); DisplayBitMap(192); } void DisplayBitMap(int lineint) { //int data[9] = {95, 247, 123, 511, 255, 1, 5, 31, 15}; //for(line = 0; line < 9; line++) { for (byte led=0; led<14; ++led) { if (lineint & (1<<led)) { LedSign::Set(led, line, 1); } else { LedSign::Set(led, line, 0); } } line++; if(line >= 9) line = 0; }
Reply