Zeheng Chen
/
funky
heart rate test
main.cpp@4:3edb2dedc40b, 2015-04-14 (annotated)
- 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?
User | Revision | Line number | New 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 | } |