The WMG is an alert system for patients with high or low BPM, as well as falling detection. WMG consists of a wearable device prototype and an Android application. The prototype collects information from sensors about the heartbeat of a patient, the outside temperature, and the atmospheric pressure and sends it over the Bluetooth to the mobile app. The WMG android application is a companion to an alert system that contacts a caregiver via SMS when high/low BPM or falling is detected. Caregiver receives an alert text message with the current location of the patient.

Dependencies:   BMP180 DigitDisplay PulseSensor beep mbed

PowerPoint slides with detailed description is available here -> /media/uploads/mkkharel/wmg.pptx

main.cpp

Committer:
mkkharel
Date:
2016-09-09
Revision:
0:024c65131457

File content as of revision 0:024c65131457:

// WMG aka Wearable Medical Gaurdian by Milan Kkharel. 
// Cortex-M3 Processor - ARM is main heart of the device 
// Perefirals used: BMP_180 Temperature and Pressure sensor
//                  Adafruit EZ-link BT module 
//                  Amped Pulse Sensor
//                  4-Digit 7 segment display 
//                  Buzzer , Pull-Up push button                      

#include "mbed.h"
#include "BMP180.h"
#include "PulseSensor.h"
#include "DigitDisplay.h"
#include "beep.h"
#include <string>
#include <sstream>
#include <iomanip>
#include <iostream>

#define PIN_SDA p9  // BPM_180 DataAvailable
#define PIN_SCL p10 // clock for BPM180

// fadeout effect constants macros
#define PWM_STEPS   35
#define PWM_SPEED   50
#define LED_ON      1
#define LED_OFF     0

// pins
Beep buzzer (p21);
DigitDisplay display(p27, p28);
Serial pc(USBTX, USBRX);
Serial bt(p13,p14);
InterruptIn pb(p8);
DigitalOut led1 (LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);
DigitalOut led4(LED4);


//global variables and pointers
PulseSensor* pSensor;
int bpm = 0;   // current reading for bpm
bool received = false;
bool set = false;
float temperature;
int minimum,maximum,counter;
string temp,pres,puls,sent,bpm_Min, bpm_Max, city;
string SOS;  // push button
ostringstream stream_t,stream_bpm, stream_p; // float to string vars
int heat_freq=30, bpm_freq=130;  // converted values from the string
const unsigned char msg_set[] = { 0x00, 0x00, 0x00, 0x06d, 0x79, 0x78,0x3e, 0x73, 0x00, 0x00,0x00};
const unsigned char msg_act[] = { 0x77, 0x39, 0x78, 0x30, 0x1e, 0x79, 0x00, 0x00, 0x00 };
const unsigned char msg_wait[] = { 0x00, 0x01,0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x3f, 0x40, 0xff, 0x00 };
int active = 0, flag_heat=0, flag_bpm = 0;  // triggers
int city_index =8;  // North bay by default
int temps[] = { 24,25,26,26,27,28,32,34,30,26,27,28,28 };


// ===================FUNCTIONs======================
void heat_alert (void)
{
    wait(0.5);
        if(temperature > temps[city_index]*0.1) {
            buzzer.beep (heat_freq, 0.25);
            flag_heat = 1;
            }
    wait(0.5);
    }
    
void blink_led(int from, int to)
{
    for (int i = 0; i < PWM_STEPS; i++) {
        led1 = from;
        led2=from;
        led3=from;
        led4=from;
        wait_us(i * PWM_SPEED);

        led1 = to;
        led2 = to;
        led3 = to;
        led4 = to;
        wait_us((PWM_STEPS - i) * PWM_SPEED);
    }
}
void sos(void)
{
    if ((flag_heat == 1) and (heat_freq>0)){
        heat_freq=0;
        }
    else if((flag_bpm == 1)and(bpm_freq>0)){
        bpm_freq=0;
        }
    else
       SOS="1"; 
}
void sendDataToProcessing(char symbol, int data)
{
    //regestiring and collecting data in real-time
    if(symbol == 'B') {
        bpm = data;
        //pc.printf("%c %d\r\n", symbol, data);
        //pc.printf("bpm = %d \r\n S= %6.3f \r\n Q= %6.3f \r\n", bpm , S ,Q );

        //  4 leds on the beep
        //blink_led(LED_OFF, LED_ON);
        //blink_led(LED_ON, LED_OFF);
    }
// BT <=
    while(bt.readable()) {
        received = true;
        sent += bt.getc();
    }
     if(sent.length() == 2 ) {
            heat_freq = atoi(sent.c_str());
            if(heat_freq == 10)
                heat_freq=0;
            buzzer.beep(heat_freq,0.5);
            sent.assign("");
            pc.printf("heat");
            
        }
        if(sent.length() == 3) {
            bpm_freq = atoi(sent.c_str());
            buzzer.beep(bpm_freq,0.5);
            sent.assign("");
            pc.printf("bpm");
        }
}

int main()
{
    pb.mode(PullUp);
    pb.rise(&sos);
    pSensor = new PulseSensor(p20, sendDataToProcessing , 20);
    pSensor->start();  //global pointer is used

    BMP180 bmp180(PIN_SDA, PIN_SCL);
    float pressure;
    // float temperature;
    bmp180.Initialize(32, BMP180_OSS_ULTRA_LOW_POWER); // 64m altitude compensation and low power oversampling
    display.setBrightness(2);

    while(1) {
        if (bmp180.ReadData(&temperature, &pressure))
            //if(temperature>30 && temperature <35) {
            //pc.printf("Temp %6.2f \r\n", temperature);
            //  }
            //pc.printf("temp : %6.2f",temperature);
            //pc.printf("printin  %d",bt.getc());
            //bt.printf("Pressure(hPa): %6.2f \t   Temperature(C): %6.2f \t Pulse(BPM): %d \r\n", pressure, temperature, bpm);//,S,Q);
            //bt.printf("Pressure(hPa): %6.2f \t   Temperature(C): %6.2f \t Pulse(BPM): %d \r\n", pressure, temperature, bpm);//,S,Q);
            //pc.printf("bpm = %d \r\n S= %6.3f \r\n Q= %6.3f \r\n", bpm , S ,Q );

            //if(bpm>100)
            //    bt.printf("xx");

            // if(bpm<=100)
            //    bt.printf("ok");

            // if ( !checked && received  ) {
            //        checked = true;
            //        }
            // pc.printf("length of temp %d value %s / is at %d \n\r", temp.length(), temp.c_str(),comma);

            // pc.printf("min %s  and max is %s \r\n",restMin.c_str(),restMax.c_str());

// Check recieved data
        if(sent.length() == 1) {
            printf("mode %s \r\n",sent.c_str());
            active = atoi(sent.c_str());
            sent.assign("");

        }

        if(sent.length() > 6) {
            size_t comma = sent.find(",");
            size_t dot = sent.find(".");
            city.assign(sent.begin(),comma);
            bpm_Min.assign(sent.begin()+comma+1,sent.begin()+dot);
            bpm_Max.assign(sent.begin()+dot+1,sent.end());
            minimum = atoi(bpm_Min.c_str());
            maximum = atoi(bpm_Max.c_str());
            city_index = atoi(city.c_str());
            sent.assign("");
            pc.printf("recieved: min %s and max is %s city index = %s\r\n",bpm_Min.c_str(),bpm_Max.c_str(),city.c_str());
        }
    
// IF SET !    
    if(minimum> 0)
    {
//when resting
        if(active == 0) {
            counter++;
            if (counter < 12) {
                display.writeRaw(0,msg_wait[counter]);
                display.writeRaw(1,msg_wait[counter]);
                display.writeRaw(2,msg_wait[counter]);
                display.writeRaw(3,msg_wait[counter]);
                heat_alert();
                }
    // reached the count, monitoring mode         
            else 
            { 
                // displaing on 4digit 7 seg
                if (bpm<100) {
                    display.write(0,0xff);
                    display.write(1,0xc0);
                    display.write(2,bpm / 10);
                    display.write(3,bpm % 10);
                }
                if(bpm>=100) {
                    display.write(0,0xc0);
                    display.write(1,bpm/100);
                    display.write(2,(bpm/10)%10);
                    display.write(3,bpm % 10);
                }
                
                if( ((0.85*minimum) > bpm) || ((1.15*maximum) < bpm)) {
                    buzzer.beep(bpm_freq,0.25);
                        flag_bpm = 1;
                }
                heat_alert();
            }
     //     
 }
 // Is active
        else if ( active == 1) 
            {
            counter =0;
            set=true; 
                display.writeRaw(0,msg_act[0]);
                display.writeRaw(1,msg_act[1]);
                display.writeRaw(2,msg_act[2]);
                display.writeRaw(3,msg_act[3]);
                
                heat_alert();
            }
//HEAT ALERT
            
   }/*end of received*/
   
// Please set-up message if BPM is not received 
        else{
                for (int at=0; at < 8; at++) 
                    {
                    display.writeRaw(0,msg_set[at]);
                    display.writeRaw(1,msg_set[at+1]);
                    display.writeRaw(2,msg_set[at+2]);
                    display.writeRaw(3,msg_set[at+3]);
                    wait_ms(140);
                    }   
                    //total wait time is 1040 ms
            }
                stream_t << fixed << setprecision(1) << temperature;
                temp = stream_t.str();

                stream_bpm << fixed << setprecision(2) << bpm;
                puls = stream_bpm.str();
                if (puls.length() == 2 )
                    puls.insert(0,"0");
                if(puls.length() == 1)
                    puls.insert(0,"00");

                stream_p << fixed << setprecision(1) << pressure;
                pres = stream_p.str();
            //BT =>
                if( pres.length() == 6)
                    bt.printf("%s,%s,%s,%s",puls,temp,pres,SOS);
                else
                    bt.printf("%s,%s,%s0,%s",puls,temp,pres,SOS);
                    
                pc.printf("%s,%s,%s,%s,sent: %d \n\r",puls,temp,pres,SOS,pres.length());
            
                stream_t.str("");
                stream_bpm.str("");
                stream_p.str("");
                SOS="0";   
    }
}