Heart Rate Monitor example for the BLE API using ST BlueNRG native drivers
Dependencies: BLE_API X_NUCLEO_IDB0XA1 mbed
Getting started with X-NUCLEO-IDB05A1
This example demonstrates how to use the X-NUCLEO-IDB05A1 component with one of the STM32 Nucleo platforms tested with the to obtain heart rate information:
First, attach the X-NUCLEO-IDB05A1 to the STM32 Nucleo platform as shown here:
Next, connect the STM32 Nucleo platform to your PC with a USB-mini USB cable.
Now return to the BLE_HeartRate_IDB0XA1 project homepage and import the project into your mbed compiler:
Click “Import” button on the pop up window shown below
Compile and load the image onto the STM32 Nucleo platform
Upon a successful compilation, a binary image will be created and a dialog box will ask you where to save it.
Now you can load the compiled code onto your Nucleo platform by saving the newly created binary file to your STM32 Nucleo drive.
Open a terminal window to display the status of your Bluetooth stack. For this example, set the terminal BAUD rate to 9600
Note
Included within the USB interface of the STM32 Nucleo platform is a Virtual COM port that can be used to send back messages to your PC within your embedded code.
You need a terminal emulator installed on your PC to perform serial communications with your STM32 Nucleo platform. If you do not have a terminal emulation program on your PC we recommend you download and install one of the following terminal emulation programs:
Upon a successful serial connection, you should now see the various Bluetooth stack status displayed on your console output.
Test your application with an Android or iOS device
- Install STM32 BLE Profiles available on Google Play and iTunes App Store
- On the STM32 BLE Profiles app select HeartRateSensor
- Select Heart Rate
Diff: main.cpp
- Revision:
- 13:227a0149b677
- Parent:
- 3:a51ca6313ad2
- Child:
- 14:f715c13eb84f
--- a/main.cpp Fri Feb 19 15:14:19 2016 +0000 +++ b/main.cpp Thu Feb 25 10:05:05 2016 +0000 @@ -17,20 +17,18 @@ #include "mbed.h" #include "ble/BLE.h" #include "ble/services/HeartRateService.h" -#include "ble/services/BatteryService.h" -#include "ble/services/DeviceInformationService.h" -BLE ble; -DigitalOut led1(LED1); +DigitalOut led1(LED1, 1); const static char DEVICE_NAME[] = "HRM1"; -static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE, - GattService::UUID_DEVICE_INFORMATION_SERVICE}; +static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE}; + static volatile bool triggerSensorPolling = false; void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) { - ble.gap().startAdvertising(); // restart advertising + (void)params; + BLE::Instance().gap().startAdvertising(); // restart advertising } void periodicCallback(void) @@ -41,22 +39,33 @@ triggerSensorPolling = true; } -int main(void) +void onBleInitError(BLE &ble, ble_error_t error) +{ + (void)ble; + (void)error; + /* Initialization error handling should go here */ +} + +void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) { - led1 = 1; - Ticker ticker; - ticker.attach(periodicCallback, 1); // blink LED every second + BLE& ble = params->ble; + ble_error_t error = params->error; - ble.init(); + if (error != BLE_ERROR_NONE) { + onBleInitError(ble, error); + return; + } + + if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { + return; + } + ble.gap().onDisconnection(disconnectionCallback); /* Setup primary service. */ uint8_t hrmCounter = 100; // init HRM to 100bps HeartRateService hrService(ble, hrmCounter, HeartRateService::LOCATION_FINGER); - /* Setup auxiliary service. */ - DeviceInformationService deviceInfo(ble, "ARM", "Model1", "SN1", "hw-rev1", "fw-rev1", "soft-rev1"); - /* Setup advertising. */ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); @@ -67,7 +76,7 @@ ble.gap().startAdvertising(); // infinite loop - while (1) { + while (true) { // check for trigger from periodicCallback() if (triggerSensorPolling && ble.getGapState().connected) { triggerSensorPolling = false; @@ -88,3 +97,11 @@ } } } + +int main(void) +{ + Ticker ticker; + ticker.attach(periodicCallback, 1); // blink LED every second + + BLE::Instance().init(bleInitComplete); +}