BLE

Dependencies:   ADT7410 BLE_API mbed nRF51822

See https://developer.mbed.org/users/yasuyuki/notebook/BLE/

Committer:
yasuyuki
Date:
Fri Jul 10 15:19:15 2015 +0000
Revision:
1:6458709fb459
Parent:
0:1dbfda43d8b4
Child:
2:d5bdd080d451
mbed=rev.101,BLE_API=rev.738,nRF51822=rev.385

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yasuyuki 0:1dbfda43d8b4 1 //**********************
yasuyuki 0:1dbfda43d8b4 2 // BLE demo for mbed_HRM1017
yasuyuki 0:1dbfda43d8b4 3 //
yasuyuki 1:6458709fb459 4 // successful combination
yasuyuki 1:6458709fb459 5 // mbed=rev.97/BLE_API=rev.341/nRF51822=rev.111
yasuyuki 1:6458709fb459 6 // mbed=rev.101/BLE_API=rev.738/nRF51822=rev.385
yasuyuki 1:6458709fb459 7 //
yasuyuki 0:1dbfda43d8b4 8 // (C)Copyright 2015 All rights reserved by Y.Onodera
yasuyuki 0:1dbfda43d8b4 9 // http://einstlab.web.fc2.com
yasuyuki 0:1dbfda43d8b4 10 //**********************
yasuyuki 0:1dbfda43d8b4 11 #if defined(TARGET_HRM1017)
yasuyuki 0:1dbfda43d8b4 12 #include "mbed.h"
yasuyuki 0:1dbfda43d8b4 13 #include "ADT7410.h"
yasuyuki 1:6458709fb459 14 //#include "BLEDevice.h" // BLEライブラリのヘッダ BLE_API=rev.341
yasuyuki 1:6458709fb459 15 #include "BLE.h" // BLEライブラリのヘッダ BLE_API=rev.738
yasuyuki 0:1dbfda43d8b4 16 #include "BatteryService.h" // BatteryServiceのヘッダ
yasuyuki 0:1dbfda43d8b4 17 #include "HeartRateService.h" // HeartRateServiceのヘッダ
yasuyuki 0:1dbfda43d8b4 18 #include "HealthThermometerService.h" // HealthThermometerServiceのヘッダ
yasuyuki 0:1dbfda43d8b4 19
yasuyuki 0:1dbfda43d8b4 20 #define THERMO
yasuyuki 0:1dbfda43d8b4 21 //#define HEART
yasuyuki 0:1dbfda43d8b4 22 //#define BATTERY
yasuyuki 0:1dbfda43d8b4 23
yasuyuki 0:1dbfda43d8b4 24 BLEDevice ble; // BLEのインスタンス生成
yasuyuki 0:1dbfda43d8b4 25 DigitalOut led1(LED1);
yasuyuki 0:1dbfda43d8b4 26 DigitalOut led2(LED2);
yasuyuki 0:1dbfda43d8b4 27 DigitalOut sw(P0_0);
yasuyuki 0:1dbfda43d8b4 28 Ticker tick;
yasuyuki 0:1dbfda43d8b4 29 #ifdef THERMO
yasuyuki 0:1dbfda43d8b4 30 I2C i2c(P0_22,P0_20);
yasuyuki 0:1dbfda43d8b4 31 ADT7410 temperature(i2c);
yasuyuki 0:1dbfda43d8b4 32 #endif
yasuyuki 0:1dbfda43d8b4 33
yasuyuki 0:1dbfda43d8b4 34 #define DEVICE_NAME "mbed_BLE"
yasuyuki 0:1dbfda43d8b4 35 // UUIDリスト
yasuyuki 0:1dbfda43d8b4 36 #ifdef THERMO
yasuyuki 0:1dbfda43d8b4 37 uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE, GattService::UUID_BATTERY_SERVICE};
yasuyuki 0:1dbfda43d8b4 38 #endif
yasuyuki 0:1dbfda43d8b4 39 #ifdef HEART
yasuyuki 0:1dbfda43d8b4 40 uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE, GattService::UUID_BATTERY_SERVICE};
yasuyuki 0:1dbfda43d8b4 41 #endif
yasuyuki 0:1dbfda43d8b4 42 #ifdef BATTERY
yasuyuki 0:1dbfda43d8b4 43 uint16_t uuid16_list[] = {GattService::UUID_BATTERY_SERVICE};
yasuyuki 0:1dbfda43d8b4 44 #endif
yasuyuki 0:1dbfda43d8b4 45 bool tickFlag = false;
yasuyuki 0:1dbfda43d8b4 46
yasuyuki 0:1dbfda43d8b4 47
yasuyuki 0:1dbfda43d8b4 48 // インターバルタイマー
yasuyuki 0:1dbfda43d8b4 49 void tickerCallback(void)
yasuyuki 0:1dbfda43d8b4 50 {
yasuyuki 0:1dbfda43d8b4 51 led1 = !led1;
yasuyuki 0:1dbfda43d8b4 52 tickFlag = true;
yasuyuki 0:1dbfda43d8b4 53 }
yasuyuki 0:1dbfda43d8b4 54
yasuyuki 0:1dbfda43d8b4 55
yasuyuki 0:1dbfda43d8b4 56 // BLE接続処理
yasuyuki 1:6458709fb459 57 //#define OLD
yasuyuki 0:1dbfda43d8b4 58 #ifdef OLD
yasuyuki 1:6458709fb459 59 // BLE_API=rev.341
yasuyuki 0:1dbfda43d8b4 60 void connectionCallback(
yasuyuki 0:1dbfda43d8b4 61 Gap::Handle_t handle,
yasuyuki 0:1dbfda43d8b4 62 Gap::addr_type_t peerAddrType, const Gap::address_t peerAddr,
yasuyuki 0:1dbfda43d8b4 63 const Gap::ConnectionParams_t *params)
yasuyuki 0:1dbfda43d8b4 64 #else
yasuyuki 1:6458709fb459 65 // BLE_API=rev.738
yasuyuki 0:1dbfda43d8b4 66 void connectionCallback(
yasuyuki 1:6458709fb459 67 const Gap::ConnectionCallbackParams_t *params)
yasuyuki 0:1dbfda43d8b4 68 #endif
yasuyuki 0:1dbfda43d8b4 69 {
yasuyuki 0:1dbfda43d8b4 70 led2 = 1;
yasuyuki 0:1dbfda43d8b4 71 ble.stopAdvertising();
yasuyuki 0:1dbfda43d8b4 72 }
yasuyuki 0:1dbfda43d8b4 73
yasuyuki 0:1dbfda43d8b4 74
yasuyuki 0:1dbfda43d8b4 75 // BLE切断処理
yasuyuki 0:1dbfda43d8b4 76 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
yasuyuki 0:1dbfda43d8b4 77 {
yasuyuki 0:1dbfda43d8b4 78 led2 = 0;
yasuyuki 0:1dbfda43d8b4 79 ble.startAdvertising();
yasuyuki 0:1dbfda43d8b4 80 }
yasuyuki 0:1dbfda43d8b4 81
yasuyuki 0:1dbfda43d8b4 82
yasuyuki 0:1dbfda43d8b4 83 // BLE接続タイムアウト処理
yasuyuki 1:6458709fb459 84 #ifdef OLD
yasuyuki 1:6458709fb459 85 // BLE_API=rev.341
yasuyuki 0:1dbfda43d8b4 86 void connectTimeoutCallback(void)
yasuyuki 0:1dbfda43d8b4 87 {
yasuyuki 0:1dbfda43d8b4 88 // to do
yasuyuki 0:1dbfda43d8b4 89 // Sleep
yasuyuki 0:1dbfda43d8b4 90 // __WFE();
yasuyuki 0:1dbfda43d8b4 91 // __SEV();
yasuyuki 0:1dbfda43d8b4 92 // __WFE();
yasuyuki 0:1dbfda43d8b4 93 // System-off
yasuyuki 0:1dbfda43d8b4 94 // NRF_POWER->SYSTEMOFF = 1;
yasuyuki 0:1dbfda43d8b4 95 }
yasuyuki 1:6458709fb459 96 #else
yasuyuki 1:6458709fb459 97 // BLE_API rev.738
yasuyuki 1:6458709fb459 98 void connectTimeoutCallback(Gap::TimeoutSource_t source)
yasuyuki 1:6458709fb459 99 {
yasuyuki 1:6458709fb459 100 }
yasuyuki 1:6458709fb459 101 #endif
yasuyuki 0:1dbfda43d8b4 102
yasuyuki 0:1dbfda43d8b4 103
yasuyuki 0:1dbfda43d8b4 104 void initAdvertising(void)
yasuyuki 0:1dbfda43d8b4 105 {
yasuyuki 0:1dbfda43d8b4 106
yasuyuki 0:1dbfda43d8b4 107 // フラグを設定
yasuyuki 0:1dbfda43d8b4 108 // LE_LIMITED_DISCOVERABLE = 期間限定で検出可能デバイス
yasuyuki 0:1dbfda43d8b4 109 // LE_GENERAL_DISCOVERABLE = 検出可能デバイス
yasuyuki 0:1dbfda43d8b4 110 // BREDR_NOT_SUPPORTED = Bluetooth Classicは未サポート, BLEオンリー
yasuyuki 0:1dbfda43d8b4 111 ble.accumulateAdvertisingPayload(
yasuyuki 0:1dbfda43d8b4 112 GapAdvertisingData::LE_GENERAL_DISCOVERABLE | GapAdvertisingData::BREDR_NOT_SUPPORTED);
yasuyuki 0:1dbfda43d8b4 113 // UUIDリストを設定
yasuyuki 0:1dbfda43d8b4 114 ble.accumulateAdvertisingPayload(
yasuyuki 0:1dbfda43d8b4 115 GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS,
yasuyuki 0:1dbfda43d8b4 116 (uint8_t *)uuid16_list,
yasuyuki 0:1dbfda43d8b4 117 sizeof(uuid16_list));
yasuyuki 0:1dbfda43d8b4 118 // デバイス名を設定(for GAP), default Device Name="nRF5x"
yasuyuki 0:1dbfda43d8b4 119 // ble.setDeviceName(DEVICE_NAME);
yasuyuki 0:1dbfda43d8b4 120 // デバイス名を設定(for Advertising)
yasuyuki 0:1dbfda43d8b4 121 ble.accumulateAdvertisingPayload(
yasuyuki 0:1dbfda43d8b4 122 GapAdvertisingData::COMPLETE_LOCAL_NAME,
yasuyuki 0:1dbfda43d8b4 123 (const uint8_t *)DEVICE_NAME,
yasuyuki 0:1dbfda43d8b4 124 // strlen(DEVICE_NAME));
yasuyuki 0:1dbfda43d8b4 125 sizeof(DEVICE_NAME));
yasuyuki 0:1dbfda43d8b4 126
yasuyuki 0:1dbfda43d8b4 127 // ADV_CONNECTABLE_UNDIRECTED = 接続可能デバイスに設定
yasuyuki 0:1dbfda43d8b4 128 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
yasuyuki 0:1dbfda43d8b4 129
yasuyuki 0:1dbfda43d8b4 130 // アドバタイジング間隔の設定=100ms, 0.625ms単位
yasuyuki 0:1dbfda43d8b4 131 ble.setAdvertisingInterval(160); // 0.625ms * 160 = 100ms
yasuyuki 0:1dbfda43d8b4 132 // ble.setAdvertisingInterval(1600); // 0.625ms * 1600 = 1000ms
yasuyuki 0:1dbfda43d8b4 133
yasuyuki 0:1dbfda43d8b4 134 // Appearance
yasuyuki 0:1dbfda43d8b4 135 #ifdef THERMO
yasuyuki 0:1dbfda43d8b4 136 ble.accumulateAdvertisingPayload(GapAdvertisingData::THERMOMETER_EAR);
yasuyuki 0:1dbfda43d8b4 137 #endif
yasuyuki 0:1dbfda43d8b4 138 #ifdef HEART
yasuyuki 0:1dbfda43d8b4 139 // ble.setAppearance(ENERIC_HEART_RATE_SENSOR);
yasuyuki 0:1dbfda43d8b4 140 ble.accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR);
yasuyuki 0:1dbfda43d8b4 141 #endif
yasuyuki 0:1dbfda43d8b4 142 // アドバタイジングタイムアウト=180sec(デフォルトは0でタイムアウトなし)
yasuyuki 0:1dbfda43d8b4 143 // ble.setAdvertisingTimeout(180);
yasuyuki 0:1dbfda43d8b4 144 // アドバタイジング開始
yasuyuki 0:1dbfda43d8b4 145 ble.startAdvertising();
yasuyuki 0:1dbfda43d8b4 146
yasuyuki 0:1dbfda43d8b4 147 }
yasuyuki 0:1dbfda43d8b4 148
yasuyuki 0:1dbfda43d8b4 149
yasuyuki 0:1dbfda43d8b4 150 int main(void)
yasuyuki 0:1dbfda43d8b4 151 {
yasuyuki 0:1dbfda43d8b4 152 led1 = 0;
yasuyuki 0:1dbfda43d8b4 153 led2 = 0;
yasuyuki 0:1dbfda43d8b4 154 sw = 1; // off
yasuyuki 0:1dbfda43d8b4 155
yasuyuki 0:1dbfda43d8b4 156 ble.init(); // BLE(nRF51822)の初期化
yasuyuki 0:1dbfda43d8b4 157 // Valid values are -40, -20, -16, -12, -8, -4, 0, 4)
yasuyuki 0:1dbfda43d8b4 158 if(ble.setTxPower(-40)!=BLE_ERROR_NONE)
yasuyuki 0:1dbfda43d8b4 159 led2 = 1;
yasuyuki 0:1dbfda43d8b4 160
yasuyuki 0:1dbfda43d8b4 161 // バッテリ残量のイベント関数を設定
yasuyuki 0:1dbfda43d8b4 162 tick.attach(&tickerCallback, 1);
yasuyuki 0:1dbfda43d8b4 163
yasuyuki 0:1dbfda43d8b4 164 // BLEのイベント関数を設定
yasuyuki 0:1dbfda43d8b4 165 ble.onConnection(connectionCallback);
yasuyuki 0:1dbfda43d8b4 166 ble.onDisconnection(disconnectionCallback);
yasuyuki 0:1dbfda43d8b4 167 ble.onTimeout(connectTimeoutCallback);
yasuyuki 0:1dbfda43d8b4 168
yasuyuki 0:1dbfda43d8b4 169 // BatteryServiceのインスタンス生成=サービスを登録
yasuyuki 0:1dbfda43d8b4 170 uint8_t batt=0;
yasuyuki 0:1dbfda43d8b4 171 BatteryService bs(ble);
yasuyuki 0:1dbfda43d8b4 172
yasuyuki 0:1dbfda43d8b4 173 #ifdef THERMO
yasuyuki 0:1dbfda43d8b4 174 // HeathTermometerServiceのインスタンス生成=サービスを登録
yasuyuki 0:1dbfda43d8b4 175 float currentTemperature = 0.0;
yasuyuki 0:1dbfda43d8b4 176 HealthThermometerService ts(ble, currentTemperature, HealthThermometerService::LOCATION_EAR);
yasuyuki 0:1dbfda43d8b4 177 #endif
yasuyuki 0:1dbfda43d8b4 178 #ifdef HEART
yasuyuki 0:1dbfda43d8b4 179 // HeartRateServiceのインスタンス生成=サービスを登録
yasuyuki 0:1dbfda43d8b4 180 uint8_t hrmCounter = 100;
yasuyuki 0:1dbfda43d8b4 181 HeartRateService hr(ble, hrmCounter, HeartRateService::LOCATION_FINGER);
yasuyuki 0:1dbfda43d8b4 182 #endif
yasuyuki 0:1dbfda43d8b4 183
yasuyuki 0:1dbfda43d8b4 184 // アドバタイジングの設定
yasuyuki 0:1dbfda43d8b4 185 initAdvertising();
yasuyuki 0:1dbfda43d8b4 186
yasuyuki 0:1dbfda43d8b4 187 // イベント待ちループ
yasuyuki 0:1dbfda43d8b4 188 while(true) {
yasuyuki 0:1dbfda43d8b4 189 ble.waitForEvent();
yasuyuki 0:1dbfda43d8b4 190 if(tickFlag){
yasuyuki 0:1dbfda43d8b4 191 // バッテリ残量の取り込み
yasuyuki 0:1dbfda43d8b4 192 if(++batt>100)batt=0;
yasuyuki 0:1dbfda43d8b4 193 // バッテリ残量のデータ更新
yasuyuki 0:1dbfda43d8b4 194 bs.updateBatteryLevel(batt);
yasuyuki 0:1dbfda43d8b4 195 #ifdef THERMO
yasuyuki 0:1dbfda43d8b4 196 sw = 0; // on
yasuyuki 0:1dbfda43d8b4 197 // currentTemperature-=0.1;
yasuyuki 0:1dbfda43d8b4 198 wait_ms(100);
yasuyuki 0:1dbfda43d8b4 199 currentTemperature=temperature.value()/128.0;
yasuyuki 0:1dbfda43d8b4 200 ts.updateTemperature(currentTemperature);
yasuyuki 0:1dbfda43d8b4 201 sw = 1; // off
yasuyuki 0:1dbfda43d8b4 202 #endif
yasuyuki 0:1dbfda43d8b4 203 #ifdef HEART
yasuyuki 0:1dbfda43d8b4 204 hr.updateHeartRate(hrmCounter);
yasuyuki 0:1dbfda43d8b4 205 #endif
yasuyuki 0:1dbfda43d8b4 206 tickFlag = false;
yasuyuki 0:1dbfda43d8b4 207 }
yasuyuki 0:1dbfda43d8b4 208 }
yasuyuki 0:1dbfda43d8b4 209 }
yasuyuki 0:1dbfda43d8b4 210
yasuyuki 0:1dbfda43d8b4 211 #endif
yasuyuki 0:1dbfda43d8b4 212