BLE sending Heart Rate

Dependencies:   BLE_API X_NUCLEO_IDB0XA1 mbed

Fork of BLE_HeartRate_IDB0XA1 by ST

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
+            }
         }
     }
-}