Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@5:3e17d7863de8, 2019-07-26 (annotated)
- Committer:
- mehrnaz
- Date:
- Fri Jul 26 11:29:01 2019 +0000
- Revision:
- 5:3e17d7863de8
- Parent:
- 3:3d51f8870e91
Final Version of the Breath project. Only streaming data (Yudhi edition!) + Solenoid. Ready to be used with KST and Bluetooth. Commented.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| christodoulos | 0:d034cdad5b6d | 1 | #include "mbed.h" |
| mehrnaz | 2:ef98576cd67b | 2 | #include "flow.h" |
| christodoulos | 0:d034cdad5b6d | 3 | |
| mehrnaz | 2:ef98576cd67b | 4 | ///////////////////////// |
| mehrnaz | 3:3d51f8870e91 | 5 | // In this version of the program developed for the Breath project, flow and CO2, as well as 8 channel sensors, |
| mehrnaz | 2:ef98576cd67b | 6 | // are measured in a separate .h file called: "flow.h" which is included in the |
| mehrnaz | 3:3d51f8870e91 | 7 | // main code. So 10 sets of data is streamed using a serial connection (TTL cable or Bluetooth) |
| mehrnaz | 3:3d51f8870e91 | 8 | // without any intruption. |
| mehrnaz | 2:ef98576cd67b | 9 | // This version is especially suitable to be used for KST. |
| mehrnaz | 2:ef98576cd67b | 10 | // Also, a solenoid would be turned on and off based on calculating the standard deviation in CO2 profile. |
| mehrnaz | 2:ef98576cd67b | 11 | // |
| mehrnaz | 3:3d51f8870e91 | 12 | // START POINT: calculates SD for 9 samples of CO2, if it's grater than 0.02 it enables the solenoid. |
| mehrnaz | 3:3d51f8870e91 | 13 | // END POINT: calculates SD for 9 samples of CO2, if it's grater thatn 0.05 it disables the solenoid. |
| mehrnaz | 3:3d51f8870e91 | 14 | // |
| mehrnaz | 3:3d51f8870e91 | 15 | // You can easily change the threshold of Standard deviation to detect plateau |
| mehrnaz | 3:3d51f8870e91 | 16 | // |
| mehrnaz | 2:ef98576cd67b | 17 | // Generated by: Mehrnaz Javadipour |
| mehrnaz | 2:ef98576cd67b | 18 | ////////////////////////// |
| christodoulos | 0:d034cdad5b6d | 19 | |
| mehrnaz | 5:3e17d7863de8 | 20 | Serial ble(PC_12,PD_2); //Bluetooth module TX,RX |
| mehrnaz | 5:3e17d7863de8 | 21 | //If you like to use TTL cable instead, just change the above pins to: PA_2,PA_3 |
| mehrnaz | 2:ef98576cd67b | 22 | DigitalOut sol(PC_5); //Solenoid: Digital Output |
| mehrnaz | 3:3d51f8870e91 | 23 | PwmOut led(PB_6); |
| mehrnaz | 3:3d51f8870e91 | 24 | |
| mehrnaz | 3:3d51f8870e91 | 25 | |
| mehrnaz | 2:ef98576cd67b | 26 | |
| mehrnaz | 2:ef98576cd67b | 27 | int main() |
| christodoulos | 0:d034cdad5b6d | 28 | { |
| mehrnaz | 5:3e17d7863de8 | 29 | ble.baud(9600); //baudrate for the serial connection |
| mehrnaz | 2:ef98576cd67b | 30 | flow(); //calling flow from flow.h |
| mehrnaz | 2:ef98576cd67b | 31 | carbon(); //calling CO2 from flow.h |
| mehrnaz | 3:3d51f8870e91 | 32 | s1(); //calling 8 channels from flow.h |
| mehrnaz | 3:3d51f8870e91 | 33 | s2(); |
| mehrnaz | 3:3d51f8870e91 | 34 | s3(); |
| mehrnaz | 3:3d51f8870e91 | 35 | s4(); |
| mehrnaz | 3:3d51f8870e91 | 36 | s5(); |
| mehrnaz | 3:3d51f8870e91 | 37 | s6(); |
| mehrnaz | 3:3d51f8870e91 | 38 | s7(); |
| mehrnaz | 3:3d51f8870e91 | 39 | s8(); |
| mehrnaz | 3:3d51f8870e91 | 40 | getTemp(); //calling Temperature from flow.h |
| mehrnaz | 3:3d51f8870e91 | 41 | |
| mehrnaz | 3:3d51f8870e91 | 42 | ////////////////////////////// |
| mehrnaz | 3:3d51f8870e91 | 43 | // I defined a flag for each section of specific functions, so by enabling the |
| mehrnaz | 3:3d51f8870e91 | 44 | // flag the section starts and by disabling the flag it finishes the section. |
| mehrnaz | 3:3d51f8870e91 | 45 | // at the end of the program, I reset the flags so it would be ready for the next loop. |
| mehrnaz | 3:3d51f8870e91 | 46 | ///////////////////////////// |
| mehrnaz | 3:3d51f8870e91 | 47 | |
| mehrnaz | 3:3d51f8870e91 | 48 | int bf=0; //FLAG for detecting base flow |
| mehrnaz | 2:ef98576cd67b | 49 | int i=0; |
| mehrnaz | 3:3d51f8870e91 | 50 | float bfArray[4]; //sampling flow for finding the average base flow |
| mehrnaz | 3:3d51f8870e91 | 51 | float sf=0; //sum of flow samples for calculating base flow |
| mehrnaz | 3:3d51f8870e91 | 52 | float fv=0; //final value of base flow |
| mehrnaz | 3:3d51f8870e91 | 53 | |
| mehrnaz | 3:3d51f8870e91 | 54 | int measurement_started=0; //FLAG for starting calculations after detecting breath |
| mehrnaz | 3:3d51f8870e91 | 55 | |
| mehrnaz | 3:3d51f8870e91 | 56 | int solstart=0; //FLAG for starting calculations for detecting plateau |
| mehrnaz | 3:3d51f8870e91 | 57 | int m=0; |
| mehrnaz | 3:3d51f8870e91 | 58 | int myArray[9]; //sampling 9 values of CO2 |
| mehrnaz | 3:3d51f8870e91 | 59 | unsigned int sum=0; //sum of 9 samples of CO2 |
| mehrnaz | 3:3d51f8870e91 | 60 | int avg=0; //average of 9 samples of CO2 |
| mehrnaz | 3:3d51f8870e91 | 61 | int difSum=0; //used for the Standard deviation algorithm |
| mehrnaz | 3:3d51f8870e91 | 62 | long double var=0.0; //used for the Standard deviation algorithm |
| mehrnaz | 3:3d51f8870e91 | 63 | float sigma=0.0; //final value for standar deviation |
| mehrnaz | 3:3d51f8870e91 | 64 | int flags=0; //FLAG for keep taking samples from CO2 profile when it's too early to detect plateau |
| mehrnaz | 3:3d51f8870e91 | 65 | |
| mehrnaz | 3:3d51f8870e91 | 66 | int solend=0; //FLAG for ending calculations for detecting plateau |
| mehrnaz | 3:3d51f8870e91 | 67 | unsigned int sum2=0; //same as before; used for finding standard deviation |
| mehrnaz | 2:ef98576cd67b | 68 | long double var2=0.0; |
| mehrnaz | 2:ef98576cd67b | 69 | float sigma2=0.0; |
| mehrnaz | 2:ef98576cd67b | 70 | int difSum2=0; |
| mehrnaz | 3:3d51f8870e91 | 71 | int avg2=0; |
| mehrnaz | 3:3d51f8870e91 | 72 | int flage=0; //FLAG for keep taking samples from CO2 profile when it's too early to finish plateau |
| mehrnaz | 3:3d51f8870e91 | 73 | |
| mehrnaz | 2:ef98576cd67b | 74 | int fin=0; |
| mehrnaz | 2:ef98576cd67b | 75 | |
| mehrnaz | 3:3d51f8870e91 | 76 | |
| mehrnaz | 2:ef98576cd67b | 77 | |
| mehrnaz | 2:ef98576cd67b | 78 | while(1) |
| mehrnaz | 2:ef98576cd67b | 79 | { |
| mehrnaz | 3:3d51f8870e91 | 80 | led=1.00f; //an LED is fully turned on at the beginning, the brightness will be reduced when the plateau is detected. |
| mehrnaz | 5:3e17d7863de8 | 81 | ble.printf("temp:%f,flow:%f,co2:%f,s1:%f,s2:%f,s3:%f,s4:%f,s5:%f,s6:%f,s7:%f,s8:%f\n",getTemp(),flow(),carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8()); |
| mehrnaz | 3:3d51f8870e91 | 82 | |
| mehrnaz | 3:3d51f8870e91 | 83 | if (bf==0) //finding base flow before breath |
| mehrnaz | 2:ef98576cd67b | 84 | { |
| mehrnaz | 2:ef98576cd67b | 85 | for(i=0; i<4; i++) |
| mehrnaz | 2:ef98576cd67b | 86 | { |
| mehrnaz | 2:ef98576cd67b | 87 | bfArray[i]=flow(); |
| mehrnaz | 2:ef98576cd67b | 88 | sf+=bfArray[i]; |
| mehrnaz | 2:ef98576cd67b | 89 | } |
| mehrnaz | 2:ef98576cd67b | 90 | fv=sf/4; |
| mehrnaz | 2:ef98576cd67b | 91 | fv=fv+0.2; |
| mehrnaz | 5:3e17d7863de8 | 92 | //ble.printf("set\n"); |
| mehrnaz | 2:ef98576cd67b | 93 | bf=1; |
| mehrnaz | 2:ef98576cd67b | 94 | } |
| mehrnaz | 2:ef98576cd67b | 95 | |
| mehrnaz | 3:3d51f8870e91 | 96 | //Starts calculations when it detects breathing into the device: |
| mehrnaz | 3:3d51f8870e91 | 97 | |
| mehrnaz | 2:ef98576cd67b | 98 | if ((flow()>fv) and (measurement_started ==0)) |
| mehrnaz | 2:ef98576cd67b | 99 | { |
| mehrnaz | 2:ef98576cd67b | 100 | measurement_started = 1; |
| mehrnaz | 2:ef98576cd67b | 101 | } |
| mehrnaz | 2:ef98576cd67b | 102 | |
| mehrnaz | 3:3d51f8870e91 | 103 | //Starts detecting plateau: |
| mehrnaz | 3:3d51f8870e91 | 104 | |
| mehrnaz | 2:ef98576cd67b | 105 | if ((measurement_started == 1) and (solstart==0)) |
| mehrnaz | 2:ef98576cd67b | 106 | { |
| mehrnaz | 3:3d51f8870e91 | 107 | //Takes 9 samples of CO2: |
| mehrnaz | 3:3d51f8870e91 | 108 | //I have also included printing the values inside the loops so we don't loose any data during calculatins. |
| mehrnaz | 2:ef98576cd67b | 109 | for(m=0;m<9;m++) |
| mehrnaz | 2:ef98576cd67b | 110 | { |
| mehrnaz | 5:3e17d7863de8 | 111 | ble.printf("temp:%f,flow:%f,co2:%f,s1:%f,s2:%f,s3:%f,s4:%f,s5:%f,s6:%f,s7:%f,s8:%f\n",getTemp(),flow(),carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8()); |
| mehrnaz | 2:ef98576cd67b | 112 | myArray[m]=carbon(); |
| mehrnaz | 2:ef98576cd67b | 113 | } |
| mehrnaz | 2:ef98576cd67b | 114 | while(flags==0) |
| mehrnaz | 2:ef98576cd67b | 115 | { |
| mehrnaz | 3:3d51f8870e91 | 116 | //While "flags" is enabled, keeps calculating the standard deviation. |
| mehrnaz | 2:ef98576cd67b | 117 | for(int m=0;m<9;m++) |
| mehrnaz | 2:ef98576cd67b | 118 | { |
| mehrnaz | 5:3e17d7863de8 | 119 | ble.printf("temp:%f,flow:%f,co2:%f,s1:%f,s2:%f,s3:%f,s4:%f,s5:%f,s6:%f,s7:%f,s8:%f\n",getTemp(),flow(),carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8()); |
| mehrnaz | 2:ef98576cd67b | 120 | sum+=myArray[m]; |
| mehrnaz | 2:ef98576cd67b | 121 | } |
| mehrnaz | 2:ef98576cd67b | 122 | avg=sum/9; |
| mehrnaz | 2:ef98576cd67b | 123 | for(int m=0;m<9;m++) |
| mehrnaz | 2:ef98576cd67b | 124 | { |
| mehrnaz | 5:3e17d7863de8 | 125 | ble.printf("temp:%f,flow:%f,co2:%f,s1:%f,s2:%f,s3:%f,s4:%f,s5:%f,s6:%f,s7:%f,s8:%f\n",getTemp(),flow(),carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8()); |
| mehrnaz | 2:ef98576cd67b | 126 | difSum+=(myArray[m]-avg)*(myArray[m]-avg); //Find sum of difference between value X and mean |
| mehrnaz | 2:ef98576cd67b | 127 | } |
| mehrnaz | 2:ef98576cd67b | 128 | var=difSum/9; |
| mehrnaz | 2:ef98576cd67b | 129 | sigma=sqrt(var); |
| mehrnaz | 2:ef98576cd67b | 130 | if (sigma<0.02) |
| mehrnaz | 2:ef98576cd67b | 131 | { |
| mehrnaz | 3:3d51f8870e91 | 132 | |
| mehrnaz | 3:3d51f8870e91 | 133 | //if SD is less than 0.02 it means that it is too early to start the plateau |
| mehrnaz | 3:3d51f8870e91 | 134 | //So we shift all but the first sample and define the new set of arrays: |
| mehrnaz | 3:3d51f8870e91 | 135 | |
| mehrnaz | 2:ef98576cd67b | 136 | for(int m=0;m<8;m++) |
| mehrnaz | 2:ef98576cd67b | 137 | { |
| mehrnaz | 5:3e17d7863de8 | 138 | ble.printf("temp:%f,flow:%f,co2:%f,s1:%f,s2:%f,s3:%f,s4:%f,s5:%f,s6:%f,s7:%f,s8:%f\n",getTemp(),flow(),carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8()); |
| mehrnaz | 3:3d51f8870e91 | 139 | myArray[m]=myArray[m+1]; //Shift all CO2 values to the left by 1 value |
| mehrnaz | 2:ef98576cd67b | 140 | } |
| mehrnaz | 3:3d51f8870e91 | 141 | myArray[8]=carbon(); //assign a new value for the 9th sample |
| mehrnaz | 3:3d51f8870e91 | 142 | } |
| mehrnaz | 3:3d51f8870e91 | 143 | //The new set of arrays are now generated and is sent back to be used for preveious SD calculations. |
| mehrnaz | 3:3d51f8870e91 | 144 | //If sigma for the new set is still small, a newer set will be generated and replaced |
| mehrnaz | 3:3d51f8870e91 | 145 | //Otherwise, it's accepted and will turn on the solenoid: |
| mehrnaz | 3:3d51f8870e91 | 146 | else |
| mehrnaz | 2:ef98576cd67b | 147 | { |
| mehrnaz | 5:3e17d7863de8 | 148 | ble.printf("temp:%f,flow:%f,co2:%f,s1:%f,s2:%f,s3:%f,s4:%f,s5:%f,s6:%f,s7:%f,s8:%f\n",getTemp(),flow(),carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8()); |
| mehrnaz | 3:3d51f8870e91 | 149 | sol=1; //Solenoid is ON |
| mehrnaz | 3:3d51f8870e91 | 150 | led=0.50f; //The brightness is reduced to half during the plateau |
| mehrnaz | 3:3d51f8870e91 | 151 | flags=1; //breakes the while loop |
| mehrnaz | 2:ef98576cd67b | 152 | } |
| mehrnaz | 2:ef98576cd67b | 153 | } |
| mehrnaz | 3:3d51f8870e91 | 154 | solend=1; //prepares the next section for finishing the plateau |
| mehrnaz | 2:ef98576cd67b | 155 | solstart =1; |
| mehrnaz | 2:ef98576cd67b | 156 | } |
| mehrnaz | 2:ef98576cd67b | 157 | if ((measurement_started == 1) and (solend==1)) |
| mehrnaz | 2:ef98576cd67b | 158 | { |
| mehrnaz | 3:3d51f8870e91 | 159 | // same process happens for finishing the plateau: |
| mehrnaz | 2:ef98576cd67b | 160 | |
| mehrnaz | 2:ef98576cd67b | 161 | for(m=0;m<9;m++) |
| mehrnaz | 2:ef98576cd67b | 162 | { |
| mehrnaz | 5:3e17d7863de8 | 163 | ble.printf("temp:%f,flow:%f,co2:%f,s1:%f,s2:%f,s3:%f,s4:%f,s5:%f,s6:%f,s7:%f,s8:%f\n",getTemp(),flow(),carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8()); |
| mehrnaz | 2:ef98576cd67b | 164 | myArray[m]=carbon(); |
| mehrnaz | 2:ef98576cd67b | 165 | } |
| mehrnaz | 2:ef98576cd67b | 166 | while(flage==0) |
| mehrnaz | 2:ef98576cd67b | 167 | { |
| mehrnaz | 2:ef98576cd67b | 168 | for(int m=0;m<9;m++) |
| mehrnaz | 2:ef98576cd67b | 169 | { |
| mehrnaz | 5:3e17d7863de8 | 170 | ble.printf("temp:%f,flow:%f,co2:%f,s1:%f,s2:%f,s3:%f,s4:%f,s5:%f,s6:%f,s7:%f,s8:%f\n",getTemp(),flow(),carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8()); |
| mehrnaz | 2:ef98576cd67b | 171 | sum2+=myArray[m]; |
| mehrnaz | 2:ef98576cd67b | 172 | } |
| mehrnaz | 2:ef98576cd67b | 173 | avg2=sum2/9; |
| mehrnaz | 2:ef98576cd67b | 174 | for(int m=0;m<9;m++) |
| mehrnaz | 2:ef98576cd67b | 175 | { |
| mehrnaz | 5:3e17d7863de8 | 176 | ble.printf("temp:%f,flow:%f,co2:%f,s1:%f,s2:%f,s3:%f,s4:%f,s5:%f,s6:%f,s7:%f,s8:%f\n",getTemp(),flow(),carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8()); |
| mehrnaz | 3:3d51f8870e91 | 177 | difSum2+=(myArray[m]-avg2)*(myArray[m]-avg2); |
| mehrnaz | 2:ef98576cd67b | 178 | } |
| mehrnaz | 2:ef98576cd67b | 179 | var2=difSum2/9; |
| mehrnaz | 2:ef98576cd67b | 180 | sigma2=sqrt(var2); |
| mehrnaz | 2:ef98576cd67b | 181 | if (sigma2<0.05) |
| mehrnaz | 2:ef98576cd67b | 182 | { |
| mehrnaz | 3:3d51f8870e91 | 183 | // here we defined the end threshold to be 0.05, it can be changed later based on experiment results |
| mehrnaz | 2:ef98576cd67b | 184 | for(int m=0;m<8;m++) |
| mehrnaz | 2:ef98576cd67b | 185 | { |
| mehrnaz | 5:3e17d7863de8 | 186 | ble.printf("temp:%f,flow:%f,co2:%f,s1:%f,s2:%f,s3:%f,s4:%f,s5:%f,s6:%f,s7:%f,s8:%f\n",getTemp(),flow(),carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8()); |
| mehrnaz | 3:3d51f8870e91 | 187 | myArray[m]=myArray[m+1]; |
| mehrnaz | 2:ef98576cd67b | 188 | } |
| mehrnaz | 2:ef98576cd67b | 189 | myArray[8]=carbon(); |
| mehrnaz | 2:ef98576cd67b | 190 | }else |
| mehrnaz | 2:ef98576cd67b | 191 | { |
| mehrnaz | 5:3e17d7863de8 | 192 | ble.printf("temp:%f,flow:%f,co2:%f,s1:%f,s2:%f,s3:%f,s4:%f,s5:%f,s6:%f,s7:%f,s8:%f\n",getTemp(),flow(),carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8()); |
| mehrnaz | 3:3d51f8870e91 | 193 | sol=0; //Solenoid is OFF |
| mehrnaz | 3:3d51f8870e91 | 194 | flage=1; //breakes the loop |
| mehrnaz | 2:ef98576cd67b | 195 | } |
| mehrnaz | 2:ef98576cd67b | 196 | } |
| mehrnaz | 3:3d51f8870e91 | 197 | solend =0; //end of this section |
| mehrnaz | 3:3d51f8870e91 | 198 | led=1.00f; //LED is back to full brightness |
| mehrnaz | 3:3d51f8870e91 | 199 | bf=0; //reset the detecting base flow flag |
| mehrnaz | 3:3d51f8870e91 | 200 | fin=1; //enables the next section flag |
| mehrnaz | 2:ef98576cd67b | 201 | } |
| mehrnaz | 2:ef98576cd67b | 202 | if((carbon()<10000) and (fin ==1)) |
| mehrnaz | 2:ef98576cd67b | 203 | { |
| mehrnaz | 3:3d51f8870e91 | 204 | //User has to wait for the CO2 level to drop less than 1% before testing again. |
| mehrnaz | 3:3d51f8870e91 | 205 | //Once it is less than 1%, all the flags and parameters used in calculations are reset |
| mehrnaz | 2:ef98576cd67b | 206 | measurement_started =0; |
| mehrnaz | 2:ef98576cd67b | 207 | solstart=0; |
| mehrnaz | 2:ef98576cd67b | 208 | sum=0; |
| mehrnaz | 2:ef98576cd67b | 209 | var=0.0; |
| mehrnaz | 2:ef98576cd67b | 210 | sigma=0.0; |
| mehrnaz | 2:ef98576cd67b | 211 | difSum=0; |
| mehrnaz | 2:ef98576cd67b | 212 | sum2=0; |
| mehrnaz | 2:ef98576cd67b | 213 | var2=0.0; |
| mehrnaz | 2:ef98576cd67b | 214 | sigma2=0.0; |
| mehrnaz | 2:ef98576cd67b | 215 | difSum2=0; |
| mehrnaz | 2:ef98576cd67b | 216 | avg2=0; |
| mehrnaz | 2:ef98576cd67b | 217 | avg=0; |
| mehrnaz | 2:ef98576cd67b | 218 | flags=0; |
| mehrnaz | 2:ef98576cd67b | 219 | flage=0; |
| mehrnaz | 2:ef98576cd67b | 220 | fin=0; |
| mehrnaz | 2:ef98576cd67b | 221 | } |
| mehrnaz | 2:ef98576cd67b | 222 | } |
| mehrnaz | 2:ef98576cd67b | 223 | } |