![](/media/cache/group/ST_logo_2020_blue_V_cmyk.jpg.50x50_q85.jpg)
BLE Thermometer example
Dependencies: BSP_B-L475E-IOT01
This example is a fork of the following mbed-os example:
https://developer.mbed.org/teams/mbed-os-examples/code/mbed-os-example-ble-Thermometer/
Please read the documentation in this page.
source/main.cpp
- Committer:
- bcostm
- Date:
- 2017-07-26
- Revision:
- 39:ac224f69256b
- Parent:
- 27:0c99c4b33d56
File content as of revision 39:ac224f69256b:
/* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <events/mbed_events.h> #include "mbed.h" #include "ble/BLE.h" #include "ble/services/HealthThermometerService.h" // Uncomment this line if you want to use the board temperature sensor instead of // a simulated one. #define USE_BOARD_TEMP_SENSOR #ifdef USE_BOARD_TEMP_SENSOR #include "stm32l475e_iot01_tsensor.h" #endif DigitalOut led1(LED1, 1); const static char DEVICE_NAME[] = "Therm"; static const uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE}; static float currentTemperature = 39.6; static HealthThermometerService *thermometerServicePtr; static EventQueue eventQueue(/* event count */ 16 * EVENTS_EVENT_SIZE); /* Restart Advertising on disconnection*/ void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *) { BLE::Instance().gap().startAdvertising(); } void updateSensorValue(void) { /* Do blocking calls or whatever is necessary for sensor polling. In our case, we simply update the Temperature measurement. */ #ifdef USE_BOARD_TEMP_SENSOR currentTemperature = BSP_TSENSOR_ReadTemp(); #else currentTemperature = (currentTemperature + 0.1 > 43.0) ? 39.6 : currentTemperature + 0.1; #endif thermometerServicePtr->updateTemperature(currentTemperature); } void periodicCallback(void) { led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */ if (BLE::Instance().gap().getState().connected) { eventQueue.call(updateSensorValue); } } void onBleInitError(BLE &ble, ble_error_t error) { /* Initialization error handling should go here */ } void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) { BLE& ble = params->ble; ble_error_t error = params->error; if (error != BLE_ERROR_NONE) { onBleInitError(ble, error); return; } if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { return; } ble.gap().onDisconnection(disconnectionCallback); /* Setup primary service. */ thermometerServicePtr = new HealthThermometerService(ble, currentTemperature, HealthThermometerService::LOCATION_EAR); /* 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)); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::THERMOMETER_EAR); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); ble.gap().setAdvertisingInterval(1000); /* 1000ms */ ble.gap().startAdvertising(); } void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { BLE &ble = BLE::Instance(); eventQueue.call(Callback<void()>(&ble, &BLE::processEvents)); } int main() { #ifdef USE_BOARD_TEMP_SENSOR BSP_TSENSOR_Init(); #endif eventQueue.call_every(500, periodicCallback); BLE &ble = BLE::Instance(); ble.onEventsToProcess(scheduleBleEventsProcessing); ble.init(bleInitComplete); eventQueue.dispatch_forever(); return 0; }