AND / Mbed 2 deprecated HandHeld_Yudhi

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }