class using the modern device windsensor rev. c to detect faint breathing above a user programed threshold using non-blocking interrupt service routines.

Dependencies:   mbed

Committer:
dehrlich
Date:
Thu Nov 24 19:32:41 2016 +0000
Revision:
0:031f7beccd55
Class using the modern device windsensor rev. c to detect faint breathing above a programed threshold using a non-blocking interrupt service routine.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dehrlich 0:031f7beccd55 1 #include "victimBreath.h"
dehrlich 0:031f7beccd55 2 #include "mbed.h"
dehrlich 0:031f7beccd55 3
dehrlich 0:031f7beccd55 4 AnalogIn windSensor(p17);
dehrlich 0:031f7beccd55 5 DigitalOut myLED(LED1);
dehrlich 0:031f7beccd55 6 Ticker breathReader;
dehrlich 0:031f7beccd55 7
dehrlich 0:031f7beccd55 8 volatile float thresh = windSensor*1.4;
dehrlich 0:031f7beccd55 9 //volatile bool Breath = false; // set on each visit to interrupt routine
dehrlich 0:031f7beccd55 10 volatile bool isBreathing = false;
dehrlich 0:031f7beccd55 11 volatile int breathCount = 0; //increment if breath is above thresh on each visit to interrupt routine
dehrlich 0:031f7beccd55 12
dehrlich 0:031f7beccd55 13 victimBreath :: victimBreath(){
dehrlich 0:031f7beccd55 14 }
dehrlich 0:031f7beccd55 15
dehrlich 0:031f7beccd55 16 void victimBreath :: startReading(){
dehrlich 0:031f7beccd55 17 breathReader.attach(this, &victimBreath::sample, .002f);
dehrlich 0:031f7beccd55 18 //volatile float a = windSensor;
dehrlich 0:031f7beccd55 19 //printf("\nwindsensor reads: %f", a);
dehrlich 0:031f7beccd55 20 //printf("\nthresh is: %f", thresh);
dehrlich 0:031f7beccd55 21 }
dehrlich 0:031f7beccd55 22
dehrlich 0:031f7beccd55 23 void victimBreath :: stopReading(){
dehrlich 0:031f7beccd55 24 breathReader.detach();
dehrlich 0:031f7beccd55 25 __enable_irq();
dehrlich 0:031f7beccd55 26 }
dehrlich 0:031f7beccd55 27
dehrlich 0:031f7beccd55 28 void victimBreath :: reset() {
dehrlich 0:031f7beccd55 29 //thresh = windSensor*1.2; //set thresh to an appropraite percent above the baseline reading
dehrlich 0:031f7beccd55 30 //Breath = false; // true victims breath crosses thresh
dehrlich 0:031f7beccd55 31 isBreathing = false; //true if we get 3 'Breaths' in the calling programs time window-->means victim is breathing
dehrlich 0:031f7beccd55 32 breathCount = 0;
dehrlich 0:031f7beccd55 33 }
dehrlich 0:031f7beccd55 34
dehrlich 0:031f7beccd55 35 //call this member function to see if victim is breathing
dehrlich 0:031f7beccd55 36 bool victimBreath :: breathDetected() {
dehrlich 0:031f7beccd55 37 return isBreathing; //only return positive if we get the critical number of Breaths in the given time window
dehrlich 0:031f7beccd55 38 }
dehrlich 0:031f7beccd55 39
dehrlich 0:031f7beccd55 40
dehrlich 0:031f7beccd55 41 // THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE.
dehrlich 0:031f7beccd55 42 // Timer 2 makes sure that we take a reading every 2 miliseconds
dehrlich 0:031f7beccd55 43 void victimBreath :: sample() { // triggered when Timer2 counts to 124
dehrlich 0:031f7beccd55 44 __disable_irq();
dehrlich 0:031f7beccd55 45 float readVal = windSensor; // sample
dehrlich 0:031f7beccd55 46
dehrlich 0:031f7beccd55 47
dehrlich 0:031f7beccd55 48 //check to see if victim is breathing at all above natural variation in sensor noise
dehrlich 0:031f7beccd55 49 if(readVal >= thresh){
dehrlich 0:031f7beccd55 50 breathCount++; //increment global counter
dehrlich 0:031f7beccd55 51 }
dehrlich 0:031f7beccd55 52 if(breathCount >= 3){ //should set this higher if want more certainty in victim breathing
dehrlich 0:031f7beccd55 53 isBreathing = true;
dehrlich 0:031f7beccd55 54 }
dehrlich 0:031f7beccd55 55 __enable_irq(); // enable interrupts again
dehrlich 0:031f7beccd55 56 //return;
dehrlich 0:031f7beccd55 57 }
dehrlich 0:031f7beccd55 58
dehrlich 0:031f7beccd55 59