BLE sending Heart Rate
Dependencies: BLE_API X_NUCLEO_IDB0XA1 mbed
Fork of BLE_HeartRate_IDB0XA1 by
Diff: main.cpp
- Revision:
- 4:8db13bccccb5
- Parent:
- 3:a51ca6313ad2
--- a/main.cpp Tue Sep 29 15:06:46 2015 +0000 +++ b/main.cpp Wed Feb 10 13:03:19 2016 +0000 @@ -19,31 +19,137 @@ #include "ble/services/HeartRateService.h" #include "ble/services/BatteryService.h" #include "ble/services/DeviceInformationService.h" +#define N 1000 +#define Pas 0.01 BLE ble; DigitalOut led1(LED1); +Serial pc (SERIAL_TX,SERIAL_RX); +AnalogIn hb(A0); -const static char DEVICE_NAME[] = "HRM1"; +int tab[N]; +int periode[N]; +int seuil=0; + +const static char DEVICE_NAME[] = "Nucleo"; static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE, GattService::UUID_DEVICE_INFORMATION_SERVICE}; static volatile bool triggerSensorPolling = false; -void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) -{ + + +/************ Fonctions liées au BLE ************/ + +void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) { ble.gap().startAdvertising(); // restart advertising -} + } -void periodicCallback(void) -{ + +void periodicCallback(void) { led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */ /* Note that the periodicCallback() executes in interrupt context, so it is safer to do * heavy-weight sensor polling from the main thread. */ triggerSensorPolling = true; -} + } + + +/************ Fonctions liées au calcul du BPM ************/ + +void acquisition() { + for (int i=0;i<N;i++) { + // Récupération de la valeur du capteur + unsigned short signal=hb.read_u16(); + // Stockage dans un tableau + tab[i]=signal; + // On affiche chaque valeur. Ou pas. + //pc.printf("%d\n\r",signal); + + wait(Pas); + } + } + +// Retourne un entier qui correspond au seuil +void calcul_Moyenne() { + + int somme=0; + int moyenne=0; + + for (int i=0;i<N;i++) { + somme+=tab[i]; + } + moyenne=somme/N; + + seuil=moyenne+moyenne*10/100; + + } + + +// Retourne un tableau composé de chacune des périodes trouvées +void calcul_Periode() { -int main(void) -{ + int flag1=0; + int flag2=0; + int compteur=0; + int j=0; + for(int i=0;i<N;i++) { + periode[i]=0; + } + + + for (int i=0;i<N;i++) { + + //Premier flag dans la montée ? + if(flag1==0 && tab[i]>=seuil){ + flag1=1; + } + // On démarre le compteur + if(flag1==1){ + compteur++; + } + + // Deuxième flag dans la descente ? + if(flag2==0 && tab[i]<seuil && flag1==1){ + flag2=1; + } + + // On a les deux flags, et si on repasse le seuil ensuite, alors on a une période + if(flag1==1 && flag2==1 && tab[i]>=seuil){ + periode[j]=compteur; + //Reset les flags et compteur + compteur=0; + flag1=0; + flag2=0; + j++; + } + } + } + + +// Calcule la durée moyenne des périodes durant l'acquisition +int moyenne_Periode() { + int somme=0; + int i=0; + + while (i<N) { + somme+=periode[i]; + if(periode[i]==0) break; + i++; + } + + return somme/(i-1); + } + + +// Calcul le BPM +int heart_Rate () { + return Pas*moyenne_Periode()*60; + } + + + +int main(void) { led1 = 1; + //int i=0; Ticker ticker; ticker.attach(periodicCallback, 1); // blink LED every second @@ -65,26 +171,44 @@ ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); ble.gap().setAdvertisingInterval(1000); /* 1000ms */ ble.gap().startAdvertising(); - + + + // Where the magic happens + pc.printf("Placez le doigt sur le capteur. Debut de la mesure dans 5 sec\n\r"); + wait(5); + + acquisition(); + pc.printf("Test fini\n\r"); + calcul_Moyenne(); + calcul_Periode(); + hrmCounter=heart_Rate(); + pc.printf("Le bpm moyen est de %d\n\r",hrmCounter); + // infinite loop while (1) { // check for trigger from periodicCallback() if (triggerSensorPolling && ble.getGapState().connected) { triggerSensorPolling = false; - - // Do blocking calls or whatever is necessary for sensor polling. - // In our case, we simply update the HRM measurement. - hrmCounter++; - - // 100 <= HRM bps <=175 - if (hrmCounter == 175) { - hrmCounter = 100; - } - + + // + pc.printf("Placez le doigt sur le capteur. Debut de la mesure dans 5 sec\n\r"); + wait(5); + + acquisition(); + pc.printf("Test fini\n\r"); + calcul_Moyenne(); + calcul_Periode(); + hrmCounter=heart_Rate(); + pc.printf("Le bpm moyen est de %d\n\r",hrmCounter); + + // update bps hrService.updateHeartRate(hrmCounter); - } else { - ble.waitForEvent(); // low power wait for event + + wait(60); + } + else { + ble.waitForEvent(); // low power wait for event + } } } -}