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.
Diff: main.cpp
- Revision:
- 3:3d51f8870e91
- Parent:
- 2:ef98576cd67b
- Child:
- 5:44f7dbc5c75d
diff -r ef98576cd67b -r 3d51f8870e91 main.cpp
--- a/main.cpp Fri Jul 12 15:58:11 2019 +0000
+++ b/main.cpp Thu Jul 25 11:17:46 2019 +0000
@@ -2,55 +2,84 @@
#include "flow.h"
/////////////////////////
-// In this version of the program developed for the Breath project, flow and CO2
+// In this version of the program developed for the Breath project, flow and CO2, as well as 8 channel sensors,
// are measured in a separate .h file called: "flow.h" which is included in the
-// main code. Data is streamed using a serial connection (TTL cable or Bluetooth)
-// without any intruption because of loop calculations.
+// main code. So 10 sets of data is streamed using a serial connection (TTL cable or Bluetooth)
+// without any intruption.
// This version is especially suitable to be used for KST.
// Also, a solenoid would be turned on and off based on calculating the standard deviation in CO2 profile.
//
+// START POINT: calculates SD for 9 samples of CO2, if it's grater than 0.02 it enables the solenoid.
+// END POINT: calculates SD for 9 samples of CO2, if it's grater thatn 0.05 it disables the solenoid.
+//
+// You can easily change the threshold of Standard deviation to detect plateau
+//
// Generated by: Mehrnaz Javadipour
//////////////////////////
-Serial ttl(PA_2,PA_3); //TTL cable TX,RX
+Serial ttl(PC_12,PD_2); //TTL cable TX,RX
DigitalOut sol(PC_5); //Solenoid: Digital Output
+PwmOut led(PB_6);
+
+
int main()
{
ttl.baud(9600); //baudrate for the serial connection
flow(); //calling flow from flow.h
carbon(); //calling CO2 from flow.h
- int bf=0;
+ s1(); //calling 8 channels from flow.h
+ s2();
+ s3();
+ s4();
+ s5();
+ s6();
+ s7();
+ s8();
+ getTemp(); //calling Temperature from flow.h
+
+ //////////////////////////////
+ // I defined a flag for each section of specific functions, so by enabling the
+ // flag the section starts and by disabling the flag it finishes the section.
+ // at the end of the program, I reset the flags so it would be ready for the next loop.
+ /////////////////////////////
+
+ int bf=0; //FLAG for detecting base flow
int i=0;
- float bfArray[4];
- float sf=0;
- float fv=0;
- int myArray[9];
- int measurement_started=0;
- unsigned int sum=0;
- long double var=0.0;
- float sigma=0.0;
- int difSum=0;
- unsigned int sum2=0;
+ float bfArray[4]; //sampling flow for finding the average base flow
+ float sf=0; //sum of flow samples for calculating base flow
+ float fv=0; //final value of base flow
+
+ int measurement_started=0; //FLAG for starting calculations after detecting breath
+
+ int solstart=0; //FLAG for starting calculations for detecting plateau
+ int m=0;
+ int myArray[9]; //sampling 9 values of CO2
+ unsigned int sum=0; //sum of 9 samples of CO2
+ int avg=0; //average of 9 samples of CO2
+ int difSum=0; //used for the Standard deviation algorithm
+ long double var=0.0; //used for the Standard deviation algorithm
+ float sigma=0.0; //final value for standar deviation
+ int flags=0; //FLAG for keep taking samples from CO2 profile when it's too early to detect plateau
+
+ int solend=0; //FLAG for ending calculations for detecting plateau
+ unsigned int sum2=0; //same as before; used for finding standard deviation
long double var2=0.0;
float sigma2=0.0;
int difSum2=0;
- int avg2=0;
- int avg=0;
- int m=0;
- int flags=0;
- int flage=0;
- int solstart=0;
- int solend=0;
+ int avg2=0;
+ int flage=0; //FLAG for keep taking samples from CO2 profile when it's too early to finish plateau
+
int fin=0;
- //float CO_2;
+
while(1)
{
- //CO_2=(float)carbon()/10000;
- ttl.printf("%f,%f\n",flow(), carbon());
- if (bf==0)
+ led=1.00f; //an LED is fully turned on at the beginning, the brightness will be reduced when the plateau is detected.
+ ttl.printf("%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",getTemp(),flow(), carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8());
+
+ if (bf==0) //finding base flow before breath
{
for(i=0; i<4; i++)
{
@@ -63,105 +92,116 @@
bf=1;
}
+ //Starts calculations when it detects breathing into the device:
+
if ((flow()>fv) and (measurement_started ==0))
{
- // ttl.printf("ready to detect plateau \n");
measurement_started = 1;
}
+ //Starts detecting plateau:
+
if ((measurement_started == 1) and (solstart==0))
{
- //ttl.printf("starting...\n");
-
+ //Takes 9 samples of CO2:
+ //I have also included printing the values inside the loops so we don't loose any data during calculatins.
for(m=0;m<9;m++)
{
- ttl.printf("%f,%f\n",flow(), carbon());
+ ttl.printf("%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",getTemp(),flow(), carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8());
myArray[m]=carbon();
}
while(flags==0)
{
+ //While "flags" is enabled, keeps calculating the standard deviation.
for(int m=0;m<9;m++)
{
- ttl.printf("%f,%f\n",flow(), carbon());
+ ttl.printf("%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",getTemp(),flow(), carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8());
sum+=myArray[m];
}
avg=sum/9;
for(int m=0;m<9;m++)
{
- ttl.printf("%f,%f\n",flow(), carbon());
+ ttl.printf("%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",getTemp(),flow(), carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8());
difSum+=(myArray[m]-avg)*(myArray[m]-avg); //Find sum of difference between value X and mean
}
var=difSum/9;
sigma=sqrt(var);
if (sigma<0.02)
{
- //ttl.printf("sol didnt turn on\n");
+
+ //if SD is less than 0.02 it means that it is too early to start the plateau
+ //So we shift all but the first sample and define the new set of arrays:
+
for(int m=0;m<8;m++)
{
- ttl.printf("%f,%f\n",flow(), carbon());
- myArray[m]=myArray[m+1]; //Shift all carbon to left by 1
+ ttl.printf("%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",getTemp(),flow(), carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8());
+ myArray[m]=myArray[m+1]; //Shift all CO2 values to the left by 1 value
}
- myArray[8]=carbon();
- }else
+ myArray[8]=carbon(); //assign a new value for the 9th sample
+ }
+ //The new set of arrays are now generated and is sent back to be used for preveious SD calculations.
+ //If sigma for the new set is still small, a newer set will be generated and replaced
+ //Otherwise, it's accepted and will turn on the solenoid:
+ else
{
- ttl.printf("%f,%f\n",flow(), carbon());
- // ttl.printf("sol on\n");
- sol=1;
- flags=1;
+ ttl.printf("%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",getTemp(),flow(), carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8());
+ sol=1; //Solenoid is ON
+ led=0.50f; //The brightness is reduced to half during the plateau
+ flags=1; //breakes the while loop
}
}
- solend=1;
+ solend=1; //prepares the next section for finishing the plateau
solstart =1;
}
if ((measurement_started == 1) and (solend==1))
{
- // ttl.printf("ending...\n");
+ // same process happens for finishing the plateau:
for(m=0;m<9;m++)
{
- ttl.printf("%f,%f\n",flow(), carbon());
+ ttl.printf("%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",getTemp(),flow(), carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8());
myArray[m]=carbon();
}
while(flage==0)
{
for(int m=0;m<9;m++)
{
- ttl.printf("%f,%f\n",flow(), carbon());
+ ttl.printf("%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",getTemp(),flow(), carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8());
sum2+=myArray[m];
}
avg2=sum2/9;
for(int m=0;m<9;m++)
{
- ttl.printf("%f,%f\n",flow(), carbon());
- difSum2+=(myArray[m]-avg2)*(myArray[m]-avg2); //Find sum of difference between value X and mean
+ ttl.printf("%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",getTemp(),flow(), carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8());
+ difSum2+=(myArray[m]-avg2)*(myArray[m]-avg2);
}
var2=difSum2/9;
sigma2=sqrt(var2);
if (sigma2<0.05)
{
- // ttl.printf("sol didnt turn on\n");
+ // here we defined the end threshold to be 0.05, it can be changed later based on experiment results
for(int m=0;m<8;m++)
{
- ttl.printf("%f,%f\n",flow(), carbon());
- myArray[m]=myArray[m+1]; //Shift all carbon to left by 1
+ ttl.printf("%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",getTemp(),flow(), carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8());
+ myArray[m]=myArray[m+1];
}
myArray[8]=carbon();
}else
{
- ttl.printf("%f,%f\n",flow(), carbon());
- // ttl.printf("sol off\n");
- sol=0;
- flage=1;
+ ttl.printf("%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",getTemp(),flow(), carbon(),s1(),s2(),s3(),s4(),s5(),s6(),s7(),s8());
+ sol=0; //Solenoid is OFF
+ flage=1; //breakes the loop
}
}
- solend =0;
- bf=0;
- fin=1;
+ solend =0; //end of this section
+ led=1.00f; //LED is back to full brightness
+ bf=0; //reset the detecting base flow flag
+ fin=1; //enables the next section flag
}
if((carbon()<10000) and (fin ==1))
{
-
- //ttl.printf("ready\n");
+ //User has to wait for the CO2 level to drop less than 1% before testing again.
+ //Once it is less than 1%, all the flags and parameters used in calculations are reset
measurement_started =0;
solstart=0;
sum=0;