heart rate test

Dependencies:   mbed

Committer:
zchen78
Date:
Tue Apr 14 03:28:30 2015 +0000
Revision:
4:3edb2dedc40b
Parent:
3:fe75390a6f30
Child:
5:6db460f13fcc
revision

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zchen78 0:901c98b3591a 1 #include "mbed.h"
zchen78 0:901c98b3591a 2 #include "math.h"
zchen78 0:901c98b3591a 3 Ticker flipper;
zchen78 0:901c98b3591a 4 Ticker flipper2;
zchen78 0:901c98b3591a 5 DigitalOut led2(LED2);
zchen78 0:901c98b3591a 6 AnalogIn sensor(p20);
zchen78 0:901c98b3591a 7 AnalogIn sensor_visible(p19);
zchen78 0:901c98b3591a 8 AnalogIn sensor_invisible(p18);
zchen78 0:901c98b3591a 9
zchen78 0:901c98b3591a 10 //680 nm
zchen78 0:901c98b3591a 11 #define visible 68
zchen78 0:901c98b3591a 12 //940 nm
zchen78 0:901c98b3591a 13 #define invisible 94
zchen78 0:901c98b3591a 14 float data =0;
zchen78 0:901c98b3591a 15 float previous_data =0;
zchen78 0:901c98b3591a 16 int count1=-1;
zchen78 0:901c98b3591a 17 int count2=-1;
zchen78 0:901c98b3591a 18 float max1 =0.0;
zchen78 0:901c98b3591a 19 float max2 =0.0;
zchen78 3:fe75390a6f30 20 float global_max =0.0;
zchen78 0:901c98b3591a 21 int running_count=0;
zchen78 0:901c98b3591a 22 bool foundMax = false;
zchen78 1:b7f42e8e04fc 23 bool firstRun = true;
zchen78 2:d7d21a7491aa 24 #define difference 0.05
zchen78 0:901c98b3591a 25 #define count_period 0.1
zchen78 2:d7d21a7491aa 26 void reset();
zchen78 2:d7d21a7491aa 27 float normalization();
zchen78 0:901c98b3591a 28 void flip() {
zchen78 0:901c98b3591a 29 led2 = !led2;
zchen78 0:901c98b3591a 30 previous_data = data;
zchen78 0:901c98b3591a 31 // printf("Data = %f\t",data);
zchen78 0:901c98b3591a 32 data = sensor.read() * 3.3;
zchen78 0:901c98b3591a 33 running_count++;
zchen78 0:901c98b3591a 34 // printf("data = %f\n",data);
zchen78 0:901c98b3591a 35 if (data - previous_data > 0){
zchen78 0:901c98b3591a 36 //increasing
zchen78 0:901c98b3591a 37 printf("Increasing \n");
zchen78 0:901c98b3591a 38 //do nothing
zchen78 0:901c98b3591a 39 }
zchen78 0:901c98b3591a 40 else if(data - previous_data < 0 && !foundMax){
zchen78 1:b7f42e8e04fc 41 //check if foundMax
zchen78 2:d7d21a7491aa 42 printf("Decrease\n");
zchen78 1:b7f42e8e04fc 43 if(firstRun){
zchen78 1:b7f42e8e04fc 44 float diff = data - global_max;
zchen78 4:3edb2dedc40b 45 float negative = -1*difference;
zchen78 4:3edb2dedc40b 46 printf("HERE\n");
zchen78 4:3edb2dedc40b 47 printf("diff = %f\n",diff);
zchen78 4:3edb2dedc40b 48 printf("data = %f\n",data);
zchen78 4:3edb2dedc40b 49 printf("global_max = %f\n",global_max);
zchen78 4:3edb2dedc40b 50 printf("HERE End\n");
zchen78 4:3edb2dedc40b 51 if(diff < difference && diff >negative) {
zchen78 1:b7f42e8e04fc 52 printf("Within the range of first max, confident\n");
zchen78 1:b7f42e8e04fc 53 printf("found max, data= %f\n",data);
zchen78 1:b7f42e8e04fc 54 foundMax = true;
zchen78 1:b7f42e8e04fc 55 count1 = running_count;
zchen78 1:b7f42e8e04fc 56 max1 = data;
zchen78 1:b7f42e8e04fc 57 firstRun = false;
zchen78 1:b7f42e8e04fc 58 }
zchen78 1:b7f42e8e04fc 59 }
zchen78 1:b7f42e8e04fc 60 else{
zchen78 1:b7f42e8e04fc 61 printf("found max, data= %f\n",data);
zchen78 1:b7f42e8e04fc 62 foundMax = true;
zchen78 1:b7f42e8e04fc 63 count1 = running_count;
zchen78 1:b7f42e8e04fc 64 max1 = data;
zchen78 1:b7f42e8e04fc 65 }
zchen78 0:901c98b3591a 66 }
zchen78 4:3edb2dedc40b 67 else if(data - previous_data < 0 && foundMax){
zchen78 4:3edb2dedc40b 68 if((max1-data < difference && max1-data > -1*difference)){
zchen78 3:fe75390a6f30 69 //found second max;
zchen78 4:3edb2dedc40b 70 printf("max1 = %f\n",max1);
zchen78 3:fe75390a6f30 71 printf("found second max,data = %f \n",data);
zchen78 3:fe75390a6f30 72 count2 = running_count;
zchen78 3:fe75390a6f30 73 float period = (count2 - count1)* count_period;
zchen78 3:fe75390a6f30 74 float BPM = (1/period) * 60;
zchen78 3:fe75390a6f30 75 printf("Period = %f\n",period);
zchen78 3:fe75390a6f30 76 printf("BPM = %f\n",BPM);
zchen78 3:fe75390a6f30 77 exit(1);
zchen78 3:fe75390a6f30 78 printf("\n");
zchen78 3:fe75390a6f30 79 printf("\n");
zchen78 3:fe75390a6f30 80 printf("\n");
zchen78 3:fe75390a6f30 81 }
zchen78 0:901c98b3591a 82 }
zchen78 2:d7d21a7491aa 83
zchen78 4:3edb2dedc40b 84 else{
zchen78 4:3edb2dedc40b 85 }
zchen78 4:3edb2dedc40b 86
zchen78 2:d7d21a7491aa 87 if(!foundMax && running_count>250){
zchen78 2:d7d21a7491aa 88 reset();
zchen78 2:d7d21a7491aa 89 global_max = normalization();
zchen78 2:d7d21a7491aa 90 printf("new normalization = %f",global_max);
zchen78 2:d7d21a7491aa 91 }
zchen78 2:d7d21a7491aa 92 }
zchen78 2:d7d21a7491aa 93
zchen78 2:d7d21a7491aa 94 void reset(){
zchen78 2:d7d21a7491aa 95 //reset
zchen78 2:d7d21a7491aa 96 printf("reset\n");
zchen78 0:901c98b3591a 97 count1 = 0;
zchen78 1:b7f42e8e04fc 98 count2 = 0;
zchen78 0:901c98b3591a 99 foundMax = false;
zchen78 1:b7f42e8e04fc 100 max1 = 0;
zchen78 1:b7f42e8e04fc 101 running_count = 0;
zchen78 0:901c98b3591a 102 }
zchen78 0:901c98b3591a 103
zchen78 2:d7d21a7491aa 104 float normalization(){
zchen78 2:d7d21a7491aa 105 float max_input = -1.0;
zchen78 2:d7d21a7491aa 106 float data_input;
zchen78 1:b7f42e8e04fc 107 //normalize the data input
zchen78 1:b7f42e8e04fc 108 //find the max in 5 seconds;
zchen78 1:b7f42e8e04fc 109 for (int x=0;x<100;x++){
zchen78 1:b7f42e8e04fc 110 data_input = sensor.read() * 3.3;
zchen78 1:b7f42e8e04fc 111 if(data_input > max_input)max_input = data_input;
zchen78 1:b7f42e8e04fc 112 wait_ms(50);
zchen78 1:b7f42e8e04fc 113 }
zchen78 1:b7f42e8e04fc 114 return max_input;
zchen78 1:b7f42e8e04fc 115 }
zchen78 1:b7f42e8e04fc 116
zchen78 1:b7f42e8e04fc 117
zchen78 0:901c98b3591a 118 void findOxygenSaturation(){
zchen78 0:901c98b3591a 119 float v = log10f(sensor_visible.read()*3.3) * visible;
zchen78 0:901c98b3591a 120 float iv = log10f(sensor_invisible.read()*3.3) * invisible;
zchen78 0:901c98b3591a 121 printf("visible = %f\n",v);
zchen78 0:901c98b3591a 122 printf("invisible = %f\n",iv);
zchen78 0:901c98b3591a 123 float ratio = v/iv;
zchen78 0:901c98b3591a 124 printf("ratio = %f\n",ratio);
zchen78 0:901c98b3591a 125 float spo = -0.3393 * ratio + 1.1595 ;
zchen78 0:901c98b3591a 126 printf("spo = %f\n",spo);
zchen78 0:901c98b3591a 127 }
zchen78 0:901c98b3591a 128
zchen78 0:901c98b3591a 129
zchen78 0:901c98b3591a 130 int main() {
zchen78 0:901c98b3591a 131 led2 = 1;
zchen78 0:901c98b3591a 132 //comment out the below line to test heart rate
zchen78 0:901c98b3591a 133 //the heart rate test subroutine, once it find the heart rate, it will terminate the program.
zchen78 0:901c98b3591a 134 //so make sure you reset the MBED
zchen78 1:b7f42e8e04fc 135 global_max = normalization();
zchen78 1:b7f42e8e04fc 136 printf("normalization = %f",global_max);
zchen78 1:b7f42e8e04fc 137 flipper.attach(&flip, count_period); // the address of the function to be attached (flip) and the interval (1 seconds)
zchen78 0:901c98b3591a 138 //read OxygenSaturation Every two second.
zchen78 0:901c98b3591a 139 //use pin 19 for visible light input
zchen78 0:901c98b3591a 140 //use pin 18 for invisible light input
zchen78 1:b7f42e8e04fc 141 // flipper2.attach(&findOxygenSaturation,2.0);
zchen78 1:b7f42e8e04fc 142
zchen78 0:901c98b3591a 143 while(1) {
zchen78 0:901c98b3591a 144 }
zchen78 0:901c98b3591a 145 }