Transmit temperature data via BLE

Dependencies:   BLE_API mbed nRF51822

Committer:
wgd8700
Date:
Fri Aug 14 10:57:32 2015 +0000
Revision:
1:d64b82b9d615
Parent:
0:ac4c040491f9
Child:
2:580d838ba0cb
Update BLE_API, nRF51822, and mbed libs to sync throughout all sample code, work for 32KB RAM revision platform;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Marcomissyou 0:ac4c040491f9 1 #include "mbed.h"
wgd8700 1:d64b82b9d615 2 #include "BLE.h"
Marcomissyou 0:ac4c040491f9 3 #include "BatteryService.h"
Marcomissyou 0:ac4c040491f9 4 #include "DeviceInformationService.h"
Marcomissyou 0:ac4c040491f9 5 #include "HealthThermometerService.h"
Marcomissyou 0:ac4c040491f9 6 #include "hts221.h"
Marcomissyou 0:ac4c040491f9 7
Marcomissyou 0:ac4c040491f9 8 #define UPDATE_PARAMS_FOR_LONGER_CONNECTION_INTERVAL 0
Marcomissyou 0:ac4c040491f9 9
Marcomissyou 0:ac4c040491f9 10 BLEDevice ble;
Marcomissyou 0:ac4c040491f9 11 DigitalOut led1(p1);
Marcomissyou 0:ac4c040491f9 12 DigitalOut led2(p2);
Marcomissyou 0:ac4c040491f9 13
Marcomissyou 0:ac4c040491f9 14 const static char DEVICE_NAME[] = "BLEThermo";
Marcomissyou 0:ac4c040491f9 15 static const uint16_t uuid16_list[] = {GattService::UUID_BATTERY_SERVICE,
Marcomissyou 0:ac4c040491f9 16 GattService::UUID_DEVICE_INFORMATION_SERVICE,
Marcomissyou 0:ac4c040491f9 17 GattService::UUID_HEALTH_THERMOMETER_SERVICE,};
Marcomissyou 0:ac4c040491f9 18
Marcomissyou 0:ac4c040491f9 19 static volatile bool triggerSensorPolling = false;
Marcomissyou 0:ac4c040491f9 20
Marcomissyou 0:ac4c040491f9 21 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
Marcomissyou 0:ac4c040491f9 22 {
Marcomissyou 0:ac4c040491f9 23 ble.startAdvertising(); // restart advertising
Marcomissyou 0:ac4c040491f9 24 }
Marcomissyou 0:ac4c040491f9 25
Marcomissyou 0:ac4c040491f9 26 void onConnectionCallback(Gap::Handle_t handle, Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr, const Gap::ConnectionParams_t *params)
Marcomissyou 0:ac4c040491f9 27 {
Marcomissyou 0:ac4c040491f9 28 #if UPDATE_PARAMS_FOR_LONGER_CONNECTION_INTERVAL
Marcomissyou 0:ac4c040491f9 29
Marcomissyou 0:ac4c040491f9 30 #define MIN_CONN_INTERVAL 250 /**< Minimum connection interval (250 ms) */
Marcomissyou 0:ac4c040491f9 31 #define MAX_CONN_INTERVAL 350 /**< Maximum connection interval (350 ms). */
Marcomissyou 0:ac4c040491f9 32 #define CONN_SUP_TIMEOUT 6000 /**< Connection supervisory timeout (6 seconds). */
Marcomissyou 0:ac4c040491f9 33 #define SLAVE_LATENCY 4
Marcomissyou 0:ac4c040491f9 34
Marcomissyou 0:ac4c040491f9 35 Gap::ConnectionParams_t gap_conn_params;
Marcomissyou 0:ac4c040491f9 36 gap_conn_params.minConnectionInterval = Gap::MSEC_TO_GAP_DURATION_UNITS(MIN_CONN_INTERVAL);
Marcomissyou 0:ac4c040491f9 37 gap_conn_params.maxConnectionInterval = Gap::MSEC_TO_GAP_DURATION_UNITS(MAX_CONN_INTERVAL);
Marcomissyou 0:ac4c040491f9 38 gap_conn_params.connectionSupervisionTimeout = Gap::MSEC_TO_GAP_DURATION_UNITS(CONN_SUP_TIMEOUT);
Marcomissyou 0:ac4c040491f9 39 gap_conn_params.slaveLatency = SLAVE_LATENCY;
Marcomissyou 0:ac4c040491f9 40 ble.updateConnectionParams(handle, &gap_conn_params);
Marcomissyou 0:ac4c040491f9 41 #endif /* #if UPDATE_PARAMS_FOR_LONGER_CONNECTION_INTERVAL */
Marcomissyou 0:ac4c040491f9 42 }
Marcomissyou 0:ac4c040491f9 43
Marcomissyou 0:ac4c040491f9 44 void periodicCallback(void)
Marcomissyou 0:ac4c040491f9 45 {
Marcomissyou 0:ac4c040491f9 46 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
Marcomissyou 0:ac4c040491f9 47 triggerSensorPolling = true;
Marcomissyou 0:ac4c040491f9 48 }
Marcomissyou 0:ac4c040491f9 49
Marcomissyou 0:ac4c040491f9 50 float tempCelsius = 25.50;
Marcomissyou 0:ac4c040491f9 51 float humi = 55;
Marcomissyou 0:ac4c040491f9 52 int humiMax = 100;
Marcomissyou 0:ac4c040491f9 53
Marcomissyou 0:ac4c040491f9 54 int main(void)
Marcomissyou 0:ac4c040491f9 55 {
Marcomissyou 0:ac4c040491f9 56 led2 = 0;
Marcomissyou 0:ac4c040491f9 57 led1 = 0;
Marcomissyou 0:ac4c040491f9 58 if (hts221_init())
Marcomissyou 0:ac4c040491f9 59 {
Marcomissyou 0:ac4c040491f9 60 HTS221_Calib();
Marcomissyou 0:ac4c040491f9 61
Marcomissyou 0:ac4c040491f9 62 Ticker ticker;
Marcomissyou 0:ac4c040491f9 63 ticker.attach(periodicCallback, 1);
Marcomissyou 0:ac4c040491f9 64
Marcomissyou 0:ac4c040491f9 65 ble.init();
Marcomissyou 0:ac4c040491f9 66 ble.onDisconnection(disconnectionCallback);
Marcomissyou 0:ac4c040491f9 67 #if UPDATE_PARAMS_FOR_LONGER_CONNECTION_INTERVAL
Marcomissyou 0:ac4c040491f9 68 ble.onConnection(onConnectionCallback);
Marcomissyou 0:ac4c040491f9 69 #endif /* #if UPDATE_PARAMS_FOR_LONGER_CONNECTION_INTERVAL */
Marcomissyou 0:ac4c040491f9 70
Marcomissyou 0:ac4c040491f9 71
Marcomissyou 0:ac4c040491f9 72 HealthThermometerService ThermoService(ble, tempCelsius , HealthThermometerService::LOCATION_EAR);
Marcomissyou 0:ac4c040491f9 73 BatteryService battery(ble);
Marcomissyou 0:ac4c040491f9 74 DeviceInformationService deviceInfo(ble, "Cyntec", "Combo module", "SN1", "hw-rev1", "fw-rev1", "soft-rev1");
Marcomissyou 0:ac4c040491f9 75
Marcomissyou 0:ac4c040491f9 76 /* Setup advertising. */
Marcomissyou 0:ac4c040491f9 77 /* Setting advertising string*/
Marcomissyou 0:ac4c040491f9 78 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
Marcomissyou 0:ac4c040491f9 79 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
Marcomissyou 0:ac4c040491f9 80 ble.accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_TAG);
Marcomissyou 0:ac4c040491f9 81 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
Marcomissyou 0:ac4c040491f9 82 /* Setting advertising parameters*/
Marcomissyou 0:ac4c040491f9 83 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
wgd8700 1:d64b82b9d615 84 ble.setAdvertisingInterval(1000);
Marcomissyou 0:ac4c040491f9 85 ble.setAdvertisingTimeout(0x1e); //Timeout, stop advertising after 30sec
Marcomissyou 0:ac4c040491f9 86 ble.startAdvertising();
Marcomissyou 0:ac4c040491f9 87
Marcomissyou 0:ac4c040491f9 88 while (true) {
Marcomissyou 0:ac4c040491f9 89 if (triggerSensorPolling && ble.getGapState().connected) {
Marcomissyou 0:ac4c040491f9 90 triggerSensorPolling = false;
Marcomissyou 0:ac4c040491f9 91
Marcomissyou 0:ac4c040491f9 92 HTS221_ReadTempHumi(&tempCelsius, &humi);
Marcomissyou 0:ac4c040491f9 93 ThermoService.updateTemperature(tempCelsius);
Marcomissyou 0:ac4c040491f9 94
Marcomissyou 0:ac4c040491f9 95 } else {
Marcomissyou 0:ac4c040491f9 96 ble.waitForEvent();
Marcomissyou 0:ac4c040491f9 97 }
Marcomissyou 0:ac4c040491f9 98 }
Marcomissyou 0:ac4c040491f9 99 } else {
Marcomissyou 0:ac4c040491f9 100 while(true)
Marcomissyou 0:ac4c040491f9 101 {
Marcomissyou 0:ac4c040491f9 102 led2 = !led2;
Marcomissyou 0:ac4c040491f9 103 wait(1);
Marcomissyou 0:ac4c040491f9 104 }
Marcomissyou 0:ac4c040491f9 105 }
Marcomissyou 0:ac4c040491f9 106 }