David Ehrlich / breath_test
Committer:
dehrlich
Date:
Wed Nov 02 02:11:24 2016 +0000
Revision:
0:dd2e484220ac
test for a 1 second rescue breath using modern device windsensor rev. c

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dehrlich 0:dd2e484220ac 1 #include "mbed.h"
dehrlich 0:dd2e484220ac 2 #include <vector> //added for Lab1 part 3
dehrlich 0:dd2e484220ac 3 #include <algorithm> //added for Lab1 part 3
dehrlich 0:dd2e484220ac 4 #include <assert.h> /* assert */
dehrlich 0:dd2e484220ac 5 AnalogIn windSensor(p17);
dehrlich 0:dd2e484220ac 6 DigitalOut myled(LED1);
dehrlich 0:dd2e484220ac 7 Timer t, q;
dehrlich 0:dd2e484220ac 8 vector<float> b;
dehrlich 0:dd2e484220ac 9 vector<float> c;
dehrlich 0:dd2e484220ac 10 template<typename T>
dehrlich 0:dd2e484220ac 11
dehrlich 0:dd2e484220ac 12 void pop_front(std::vector<T>& vec)
dehrlich 0:dd2e484220ac 13 {
dehrlich 0:dd2e484220ac 14 assert(!vec.empty());
dehrlich 0:dd2e484220ac 15 vec.erase(vec.begin());
dehrlich 0:dd2e484220ac 16 }
dehrlich 0:dd2e484220ac 17
dehrlich 0:dd2e484220ac 18 float give_breath(void) {
dehrlich 0:dd2e484220ac 19 float a = 0.0;
dehrlich 0:dd2e484220ac 20 float d = 0.0; //return time for fractional breathes
dehrlich 0:dd2e484220ac 21 float e = 0.0;
dehrlich 0:dd2e484220ac 22 int i;
dehrlich 0:dd2e484220ac 23 float thresh;
dehrlich 0:dd2e484220ac 24 for(i = 0; i<20; i++){
dehrlich 0:dd2e484220ac 25 a = a + windSensor;
dehrlich 0:dd2e484220ac 26 }
dehrlich 0:dd2e484220ac 27 a = a/20.0; //get first baseline reading
dehrlich 0:dd2e484220ac 28 thresh = a*3.0; //theshold to start breathe timer (ideal multiplier is between 2-3)
dehrlich 0:dd2e484220ac 29 t.start();
dehrlich 0:dd2e484220ac 30 while(1){
dehrlich 0:dd2e484220ac 31 if(t.read() <= 3.0){
dehrlich 0:dd2e484220ac 32 wait(0.1); //necessary to give sensor time to be polled
dehrlich 0:dd2e484220ac 33 if(windSensor > thresh){
dehrlich 0:dd2e484220ac 34 q.start();
dehrlich 0:dd2e484220ac 35 myled = 1;
dehrlich 0:dd2e484220ac 36 for(i = 0; i<10; i++){
dehrlich 0:dd2e484220ac 37 c.push_back(windSensor);
dehrlich 0:dd2e484220ac 38 }
dehrlich 0:dd2e484220ac 39 for(i=0; i<10; i++){
dehrlich 0:dd2e484220ac 40 e = e + c[i];
dehrlich 0:dd2e484220ac 41 }
dehrlich 0:dd2e484220ac 42 e = e/10.0; //provides slope of 10 most recent samples
dehrlich 0:dd2e484220ac 43 while( (e > thresh) && (q.read() < 1.0)){
dehrlich 0:dd2e484220ac 44
dehrlich 0:dd2e484220ac 45 pop_front(c);//remove the oldest element
dehrlich 0:dd2e484220ac 46 c.push_back(windSensor);
dehrlich 0:dd2e484220ac 47 for(i=0; i<10; i++){
dehrlich 0:dd2e484220ac 48 e = e + c[i];
dehrlich 0:dd2e484220ac 49 }
dehrlich 0:dd2e484220ac 50 e = e/10.0; //provides slope of 10 most recent samples
dehrlich 0:dd2e484220ac 51
dehrlich 0:dd2e484220ac 52 }
dehrlich 0:dd2e484220ac 53 d = q.read();
dehrlich 0:dd2e484220ac 54 if(q.read() > 1.0){ //breathe was greater than thresh and lasted more than 1 sec
dehrlich 0:dd2e484220ac 55 return 1.0; //full breath
dehrlich 0:dd2e484220ac 56 }
dehrlich 0:dd2e484220ac 57 else{
dehrlich 0:dd2e484220ac 58 return d; //partial breath
dehrlich 0:dd2e484220ac 59 }
dehrlich 0:dd2e484220ac 60 }
dehrlich 0:dd2e484220ac 61 }
dehrlich 0:dd2e484220ac 62 else{
dehrlich 0:dd2e484220ac 63 return 0.0; //no breath in 3 seconds
dehrlich 0:dd2e484220ac 64 }
dehrlich 0:dd2e484220ac 65 }
dehrlich 0:dd2e484220ac 66
dehrlich 0:dd2e484220ac 67 }