tmeperature to mobile phone

Dependencies:   BLE_API MPU6050 mbed nRF51822

Fork of BLE_HeartRate by Bluetooth Low Energy

Revision:
7:c08bcc5e6537
Parent:
5:b0baff4a124f
diff -r 3a49b577f2ae -r c08bcc5e6537 main.cpp
--- a/main.cpp	Thu Jun 05 09:17:59 2014 +0000
+++ b/main.cpp	Tue Jun 10 04:56:06 2014 +0000
@@ -16,23 +16,33 @@
 
 #include "mbed.h"
 #include "nRF51822n.h"
+#include "MPU6050.h"
 
 nRF51822n  nrf;                 /* BLE radio driver */
 
-DigitalOut led1(LED1);
-DigitalOut led2(LED2);
-Ticker     flipper;
 Serial     pc(USBTX, USBRX);
+MPU6050 mpu(P0_22, P0_20);
 
 /* Battery Level Service */
-uint8_t            batt      = 72; /* Battery level */
-uint8_t            read_batt = 0; /* Variable to hold battery level reads */
+uint8_t            batt      = 88; /* Battery level */
+
 GattService        battService (GattService::UUID_BATTERY_SERVICE);
 GattCharacteristic battLevel   (GattCharacteristic::UUID_BATTERY_LEVEL_CHAR,
                                 1,
                                 1,
                                 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY |
                                 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
+                                
+GattService        tempService (GattService::UUID_HEALTH_THERMOMETER_SERVICE);
+GattCharacteristic  tempLevel  (GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR,
+                                2,
+                                3,
+                                GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
+GattCharacteristic tempLocation (
+                                GattCharacteristic::UUID_BODY_SENSOR_LOCATION_CHAR,
+                                1,
+                                1,
+                                GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
 
 /* Heart Rate Service */
 /* Service:  https://developer.bluetooth.org/gatt/services/Pages/ServiceViewer.aspx?u=org.bluetooth.service.heart_rate.xml */
@@ -51,7 +61,7 @@
     GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
 
 /* Device Information service */
-uint8_t deviceName[4] = {'m', 'b', 'e', 'd'};
+uint8_t deviceName[] = {'Y', 'o', 'u','Y', 'o', 'u'};
 GattService        deviceInformationService (
     GattService::UUID_DEVICE_INFORMATION_SERVICE);
 GattCharacteristic deviceManufacturer (
@@ -59,6 +69,12 @@
     sizeof(deviceName),
     sizeof(deviceName),
     GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
+uint8_t version[]={'Y', 'o', 'u','Y', 'o', 'u',' ','1','.','0'};
+GattCharacteristic firmwareVersion (
+    GattCharacteristic::UUID_FIRMWARE_REVISION_STRING_CHAR,
+    sizeof(version),
+    sizeof(version),
+    GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
 
 /* Advertising data and parameters */
 GapAdvertisingData advData;
@@ -66,9 +82,8 @@
 GapAdvertisingParams advParams (GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
 uint16_t           uuid16_list[] = {GattService::UUID_BATTERY_SERVICE,
                                     GattService::UUID_DEVICE_INFORMATION_SERVICE,
-                                    GattService::UUID_HEART_RATE_SERVICE};
-
-void tickerCallback(void);
+                                    GattService::UUID_HEART_RATE_SERVICE,
+                                    GattService::UUID_HEALTH_THERMOMETER_SERVICE};
 
 /**************************************************************************/
 /*!
@@ -80,20 +95,20 @@
 {
     virtual void onTimeout(void)
     {
-        pc.printf("Advertising Timeout!\n\r");
+        pc.printf("Advertising Timeout!\r\n");
         // Restart the advertising process with a much slower interval,
         // only start advertising again after a button press, etc.
     }
 
     virtual void onConnected(void)
     {
-        pc.printf("Connected!\n\r");
+        pc.printf("Connected!\r\n");
     }
 
     virtual void onDisconnected(void)
     {
-        pc.printf("Disconnected!\n\r");
-        pc.printf("Restarting the advertising process\n\r");
+        pc.printf("Disconnected!\r\n");
+        pc.printf("Restarting the advertising process\r\n");
         nrf.getGap().startAdvertising(advParams);
     }
 };
@@ -112,14 +127,20 @@
     virtual void onUpdatesEnabled(uint16_t charHandle)
     {
         if (charHandle == hrmRate.getHandle()) {
-            pc.printf("Heart rate notify enabled\n\r");
+            pc.printf("Heart rate notify enabled\r\n");
+        }
+        if (charHandle == tempLevel.getHandle()) {
+            pc.printf("Temperature notify enabled\r\n");
         }
     }
 
     virtual void onUpdatesDisabled(uint16_t charHandle)
     {
         if (charHandle == hrmRate.getHandle()) {
-            pc.printf("Heart rate notify disabled\n\r");
+            pc.printf("Heart rate notify disabled\r\n");
+        }
+         if (charHandle == tempLevel.getHandle()) {
+            pc.printf("Temperature notify disabled\r\n");
         }
     }
 
@@ -133,17 +154,17 @@
 /**************************************************************************/
 int main(void)
 {
-    /* Setup blinky: led1 is toggled in main, led2 is toggled via Ticker */
-    led1 = 1;
-    led2 = 1;
-    flipper.attach(&tickerCallback, 1.0);
-
+    float accdata[3];
+    uint16_t time=0;
+    wait(1);
+    pc.baud(38400);
+    
     /* Setup the local GAP/GATT event handlers */
     nrf.getGap().setEventHandler(new GapEventHandler());
     nrf.getGattServer().setEventHandler(new GattServerEventHandler());
 
     /* Initialise the nRF51822 */
-    pc.printf("Initialising the nRF51822\n\r");
+    pc.printf("Initialising the nRF51822...\r\n");
     nrf.init();
 
     /* Make sure we get a clean start */
@@ -162,22 +183,47 @@
 
     /* Add the Device Information service */
     deviceInformationService.addCharacteristic(deviceManufacturer);
+    deviceInformationService.addCharacteristic(firmwareVersion);
     nrf.getGattServer().addService(deviceInformationService);
 
     /* Add the Heart Rate service */
     hrmService.addCharacteristic(hrmRate);
     hrmService.addCharacteristic(hrmLocation);
     nrf.getGattServer().addService(hrmService);
+    
+    tempService.addCharacteristic(tempLevel);
+    tempService.addCharacteristic(tempLocation);
+    nrf.getGattServer().addService(tempService);
 
     /* Start advertising (make sure you've added all your data first) */
     nrf.getGap().startAdvertising(advParams);
+    
+    
+    mpu.setFrequency(100000);
+    wait_ms(10); 
+    if (mpu.testConnection())
+    {
+        pc.printf("MPU connection succeeded!\r\n");
+    }
+    else
+    {
+        pc.printf("MPU connection failed!\r\n"); //Todo: If connection fails, retry a couple times. Try resetting MPU (this would need another wire?)
+    }
+    wait(2);
+    mpu.setSleepMode(false);
+    mpu.setBW(MPU6050_BW_20); 
+    mpu.setGyroRange(MPU6050_GYRO_RANGE_500);
+    mpu.setAcceleroRange(MPU6050_ACCELERO_RANGE_2G);
+    
 
     /* Wait until we are connected to a central device before updating
      * anything */
-    pc.printf("Waiting for a connection ...");
+    pc.printf("Waiting for a connection ...\r\n");
     while (!nrf.getGap().state.connected) {
     }
-    pc.printf("Connected!\n\r");
+    wait(3);
+    
+    pc.printf("Connected!\r\n");
 
     /* Now that we're live, update the battery level characteristic, and */
     /* change the device manufacturer characteristic to 'mbed' */
@@ -186,7 +232,10 @@
     nrf.getGattServer().updateValue(deviceManufacturer.getHandle(),
                                     deviceName,
                                     sizeof(deviceName));
-
+    nrf.getGattServer().updateValue(firmwareVersion.getHandle(),
+                                    version,
+                                    sizeof(version));
+                                    
     /* Set the heart rate monitor location (one time only) */
     /* See --> https://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.body_sensor_location.xml */
     uint8_t location = 0x03; /* Finger */
@@ -194,20 +243,23 @@
     nrf.getGattServer().updateValue(hrmLocation.getHandle(),
                                     (uint8_t *)&location,
                                     sizeof(location));
+    nrf.getGattServer().updateValue(tempLocation.getHandle(),
+                                    (uint8_t *)&location,
+                                    sizeof(location));     
 
-    /* Do blinky on LED1 while we're waiting for BLE events */
-    for (;; ) {
-        led1 = !led1;
+    
+    for (;; ) 
+    {
         wait(1);
 
-        /* Update battery level */
+        /* Update battery level 
         batt++;
         if (batt > 100) {
             batt = 72;
         }
         nrf.getGattServer().updateValue(battLevel.getHandle(),
                                         (uint8_t *)&batt,
-                                        sizeof(batt));
+                                        sizeof(batt));  */
 
       /* Update the HRM measurement */
       /* First byte = 8-bit values, no extra info, Second byte = uint8_t HRM value */
@@ -218,15 +270,21 @@
         }
         uint8_t bpm[2] = {0x00, hrmCounter};
         nrf.getGattServer().updateValue(hrmRate.getHandle(), bpm, sizeof(bpm));
+        
+        float f =mpu.getTemp();
+        int t = f;
+        uint8_t temper[2];
+        temper[0]=t>>8;
+        temper[1]=t;
+        nrf.getGattServer().updateValue(tempLevel.getHandle(), temper, sizeof(temper));
+        
+        pc.printf("HRM:");
+        pc.printf("%d",hrmCounter);
+        pc.printf("    Temperature:");
+        pc.printf("%.2f",f);
+        pc.printf("    ");
+        mpu.getAccelero(accdata);
+        time++;
+        pc.printf("X:%.2f  Y:%.2f  Z:%.2f  Time:%ds\r\n",accdata[0], accdata[1], accdata[2],time);     
     }
-}
-
-/**************************************************************************/
-/*!
-    @brief  Ticker callback to switch led2 state
-*/
-/**************************************************************************/
-void tickerCallback(void)
-{
-    led2 = !led2;
-}
+}
\ No newline at end of file