![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Breath
Fork of Breath by
Revision 1:86d9b36d9132, committed 2016-12-01
- Comitter:
- jamesmsong
- Date:
- Thu Dec 01 03:04:38 2016 +0000
- Parent:
- 0:397523d4133e
- Commit message:
- Breath
Changed in this revision
diff -r 397523d4133e -r 86d9b36d9132 MPL3115.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MPL3115.cpp Thu Dec 01 03:04:38 2016 +0000 @@ -0,0 +1,90 @@ + /* Copyright (c) 2015 NXP Semiconductors. MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include "MPL3115.h" +#include "mbed.h" +#define REG_PRESSURE_MSB 0x01 + +MPL3115::MPL3115(PinName sda, PinName scl, int addr) : MPL3115_i2c(sda,scl), m_addr(addr) + { + + } + + void MPL3115::config(void) + { + char d[2]; + d[0] = MPL3115_CTRL_REG1; //Puts device in Standby mode + d[1] = 0x00; + MPL3115_i2c.write(MPL3115_I2C_ADDRESS, d,2); + + + d[0] = MPL3115_CTRL_REG1; //Puts device in Active mode and in altimeter mode + d[1] = 0x81; + MPL3115_i2c.write(MPL3115_I2C_ADDRESS, d, 2); + + } + + + float MPL3115::getPressure(void) +{ + float a; + + a = getPressure(REG_PRESSURE_MSB); + return a; +} + + float MPL3115::getPressure(unsigned char reg) +{ + unsigned char dt[3]; + unsigned int prs; + int tmp; + float fprs; + + /* + * dt[0] = Bits 12-19 of 20-bit real-time Pressure sample. (b7-b0) + * dt[1] = Bits 4-11 of 20-bit real-time Pressure sample. (b7-b0) + * dt[2] = Bits 0-3 of 20-bit real-time Pressure sample (b7-b4) + */ + readRegs( reg, &dt[0], 3); + prs = ((dt[0]<<10) | (dt[1]<<2) | (dt[2]>>6)); + // + if ( dt[0] > 0x7f) { + // negative number + if ( dt[0] & 0x80) + prs |= 0xFFFC0000; + else + prs |= 0xFFFE0000; + tmp = ~prs + 1; // make the complemets. At this point all the bits are inverted. + fprs = (float)tmp * -1.0f; + } else { + fprs = (float)prs * 1.0f; + } + + if ( dt[2] & 0x10) + fprs += 0.25f; + if ( dt[2] & 0x20) + fprs += 0.5f; + + return fprs; +} + void MPL3115::readRegs(int addr, uint8_t * data, int len) { + char t[1] = {addr}; + MPL3115_i2c.write(m_addr, t, 1, true); + MPL3115_i2c.read(m_addr, (char *)data, len); +} + \ No newline at end of file
diff -r 397523d4133e -r 86d9b36d9132 MPL3115.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MPL3115.h Thu Dec 01 03:04:38 2016 +0000 @@ -0,0 +1,49 @@ + /* Copyright (c) 2015 NXP Semiconductors. MIT License +* +* Permission is hereby granted, free of charge, to any person obtaining a copy of this software +* and associated documentation files (the "Software"), to deal in the Software without +* restriction, including without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the +* Software is furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all copies or +* substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING +* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef MPL3115_H +#define MPL3115_H +#include "mbed.h" + +#define MPL3115_I2C_ADDRESS (0x60<<1) + +#define MPL3115_STATUS 0x00 +#define MPL3115_WHO_AM_I 0x0C +#define MPL3115_CTRL_REG1 0x26 +#define MPL3115_CTRL_REG2 0x27 +#define MPL3115_WHO_AM_I_VALUE 0xC4 + +class MPL3115 +{ + public: + + MPL3115(PinName sda, PinName scl, int addr); + + void config(void); + + float getPressure(void); + float getPressure(unsigned char reg); + void readRegs(int addr, uint8_t * data, int len); + + private: + I2C MPL3115_i2c; + int m_addr; + +}; + +#endif \ No newline at end of file
diff -r 397523d4133e -r 86d9b36d9132 NeoStrip.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NeoStrip.lib Thu Dec 01 03:04:38 2016 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/aswild/code/NeoStrip/#f531a2be180d
diff -r 397523d4133e -r 86d9b36d9132 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Dec 01 03:04:38 2016 +0000 @@ -0,0 +1,13 @@ +#include "mbed.h" +#include "windSensor.h" +#include "NeoStrip.h" + +#define MPL3115A2_I2C_ADDRESS (0x60<<1) +NeoStrip strip(p20,2); +windSensor sensor(p15, &strip, p9, p10, MPL3115A2_I2C_ADDRESS); + +int main() { + while(1){ + sensor.give_breath(); + } +} \ No newline at end of file
diff -r 397523d4133e -r 86d9b36d9132 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Thu Dec 01 03:04:38 2016 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/552587b429a1 \ No newline at end of file
diff -r 397523d4133e -r 86d9b36d9132 windSensor.cpp --- a/windSensor.cpp Thu Dec 01 00:42:08 2016 +0000 +++ b/windSensor.cpp Thu Dec 01 03:04:38 2016 +0000 @@ -1,12 +1,16 @@ #include "windSensor.h" +#include "MPL3115.h" -windSensor :: windSensor(PinName p, NeoStrip *_strip) - : sensor(p), strip(_strip) +windSensor :: windSensor(PinName p1, NeoStrip *_strip, PinName p2, PinName p3, int addr) + : sensor(p1), strip(_strip), barometer(p2, p3, addr) { thresh = sensor.read()*1.4; isBreathing = false; breathCount = 0; - strip->setBrightness(0.1); + spike = false; + barometer.config(); + //strip->setBrightness(0.1); + } void windSensor::startReading() @@ -37,6 +41,11 @@ return isBreathing; //only return positive if we get the critical number of Breaths in the given time window } +//call this member function to see if there is a pressure spike +bool windSensor::pressureSpike() +{ + return spike; //return true if spike occured during give_breath. +} // THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE. // Timer 2 makes sure that we take a reading every 2 miliseconds @@ -66,21 +75,27 @@ float windSensor::give_breath(void) { - strip->initialize(); + spike = false; + //strip->initialize(); c.clear(); t.reset(); q.reset(); - //float a = 0.0; + float base = 0.0; float d = 0.0; //return time for fractional breathes float e = 0.0; int i; float thresh; - /*for(i = 0; i<20; i++) { - float val = sensor.read(); - a = a + val; + t.start(); + for(i = 0; i<10; i++) { + float tempPress = barometer.getPressure(); + base = base + tempPress; //printf("%12.5f\n",val); } - a = a/20.0; //get first baseline reading + t.stop(); + printf("%f\n", t.read()); + t.reset(); + base = base/10.0; //get first pressure baseline reading + printf("Baseline: %f\n", base); //thresh = a*3.0; //theshold to start breathe timer (ideal multiplier is between 2-3)*/ thresh = 0.63; //printf("thresh:%f\n",thresh); @@ -89,6 +104,7 @@ if(t.read() <= 3.0) { wait(0.1); //necessary to give sensor time to be polled float val = sensor.read(); + val = 0.7; //testing, delete after //printf("%15.5f\n",val); if(val > thresh) { //printf("Made it here\n"); @@ -100,8 +116,10 @@ e = e + c[i]; } e = e/10.0; //provides slope of 10 most recent samples + e = 1; //erase float oldTimerVal = 0; float timerVal = q.read(); + printf("Start Breath"); while( (e > thresh) && (timerVal < 1.0)) { pop_front(c);//remove the oldest element @@ -110,16 +128,23 @@ e = e + c[i]; } e = e/10.0; //provides slope of 10 most recent samples + e = 1; //erase later timerVal = q.read(); if(timerVal >= oldTimerVal + 0.25){ - strip->progress(timerVal); + //strip->progress(timerVal); oldTimerVal = timerVal; } + float pressure = barometer.getPressure(); + printf("Pressure: %f\n", pressure); + if(pressure < .96*base){ + spike = true; + printf("SPIKE"); + } } d = q.read(); if(q.read() > 1.0) { //breathe was greater than thresh and lasted more than 1 sec t.stop(); q.stop(); - strip->progress(1); + //strip->progress(1); return 1.0; //full breath } else { t.stop(); q.stop();
diff -r 397523d4133e -r 86d9b36d9132 windSensor.h --- a/windSensor.h Thu Dec 01 00:42:08 2016 +0000 +++ b/windSensor.h Thu Dec 01 03:04:38 2016 +0000 @@ -1,22 +1,25 @@ #include "mbed.h" +#include "MPL3115.h" #include "NeoStrip.h" #include <vector> class windSensor { public: - windSensor(PinName p, NeoStrip *_strip); + windSensor(PinName p, NeoStrip *_strip, PinName p2, PinName p3, int addr); /* Start victim breath */ void sample(); void startReading(); void stopReading(); void reset(); bool breathDetected(); - /* End vicim breath */ + bool pressureSpike(); + /* End victim breath */ /* start give breath */ float give_breath(void); /* end give breath */ + private: /* start vicim breath */ AnalogIn sensor; @@ -34,4 +37,7 @@ /* end give breath */ vector<float> c; NeoStrip *strip; + MPL3115 barometer; + + bool spike; }; \ No newline at end of file