This is an example to broadcast measured value of BME280 through BLE GATT service.
please refer detail information at GitHub. https://github.com/soramame21/BLE_Server_BME280
source/main.cpp@1:9d1a3835d884, 2017-07-13 (annotated)
- Committer:
- Ren Boting
- Date:
- Thu Jul 13 14:00:52 2017 +0900
- Revision:
- 1:9d1a3835d884
- Parent:
- 0:f22fa5cc4d56
- Child:
- 3:4b41a1ba65c8
removed shields/TARGET_ST_BLUENRG/ directory.
enabled a smaller thread stack size for all targets
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
edamame22 | 0:f22fa5cc4d56 | 1 | #include "mbed.h" |
edamame22 | 0:f22fa5cc4d56 | 2 | #include "rtos.h" |
edamame22 | 0:f22fa5cc4d56 | 3 | #include "stdio.h" |
edamame22 | 0:f22fa5cc4d56 | 4 | #include "BME280.h" |
edamame22 | 0:f22fa5cc4d56 | 5 | #include "ble/BLE.h" |
edamame22 | 0:f22fa5cc4d56 | 6 | #include "ble/Gap.h" |
edamame22 | 0:f22fa5cc4d56 | 7 | #include "EnvironmentalService.h" |
edamame22 | 0:f22fa5cc4d56 | 8 | |
edamame22 | 0:f22fa5cc4d56 | 9 | BLE &ble = BLE::Instance(); |
edamame22 | 0:f22fa5cc4d56 | 10 | DigitalOut led1(LED1); |
edamame22 | 0:f22fa5cc4d56 | 11 | DigitalOut led2(LED2); |
edamame22 | 0:f22fa5cc4d56 | 12 | |
Ren Boting | 1:9d1a3835d884 | 13 | #define SMALL_STACK_SIZE 960 //reduced thread stack size (default:2048) |
Ren Boting | 1:9d1a3835d884 | 14 | |
edamame22 | 0:f22fa5cc4d56 | 15 | #if defined(TARGET_LPC1768) |
edamame22 | 0:f22fa5cc4d56 | 16 | BME280 sensor(p28, p27); |
edamame22 | 0:f22fa5cc4d56 | 17 | #elif defined(TARGET_TY51822R3) |
edamame22 | 0:f22fa5cc4d56 | 18 | BME280 sensor(I2C_SDA0, I2C_SCL0); |
edamame22 | 0:f22fa5cc4d56 | 19 | #else |
edamame22 | 0:f22fa5cc4d56 | 20 | BME280 sensor(I2C_SDA, I2C_SCL); |
edamame22 | 0:f22fa5cc4d56 | 21 | #endif |
edamame22 | 0:f22fa5cc4d56 | 22 | |
edamame22 | 0:f22fa5cc4d56 | 23 | const static char DEVICE_NAME[] = "BME280"; |
edamame22 | 0:f22fa5cc4d56 | 24 | const static uint16_t uuid16_list[] = {GattService::UUID_ENVIRONMENTAL_SERVICE}; |
edamame22 | 0:f22fa5cc4d56 | 25 | static EnvironmentalService *EvnSer=NULL; |
edamame22 | 0:f22fa5cc4d56 | 26 | |
edamame22 | 0:f22fa5cc4d56 | 27 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
edamame22 | 0:f22fa5cc4d56 | 28 | { |
edamame22 | 0:f22fa5cc4d56 | 29 | BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising(); // restart advertising |
edamame22 | 0:f22fa5cc4d56 | 30 | } |
edamame22 | 0:f22fa5cc4d56 | 31 | |
edamame22 | 0:f22fa5cc4d56 | 32 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) |
edamame22 | 0:f22fa5cc4d56 | 33 | { |
edamame22 | 0:f22fa5cc4d56 | 34 | BLE &ble = params->ble; |
edamame22 | 0:f22fa5cc4d56 | 35 | ble_error_t error = params->error; |
edamame22 | 0:f22fa5cc4d56 | 36 | EvnSer = new EnvironmentalService(ble); |
edamame22 | 0:f22fa5cc4d56 | 37 | |
edamame22 | 0:f22fa5cc4d56 | 38 | printf("Inside BLE..starting payload creation..\r\n"); |
edamame22 | 0:f22fa5cc4d56 | 39 | |
edamame22 | 0:f22fa5cc4d56 | 40 | ble.gap().onDisconnection(disconnectionCallback); |
edamame22 | 0:f22fa5cc4d56 | 41 | |
edamame22 | 0:f22fa5cc4d56 | 42 | /* Setup advertising. */ |
edamame22 | 0:f22fa5cc4d56 | 43 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
edamame22 | 0:f22fa5cc4d56 | 44 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); |
edamame22 | 0:f22fa5cc4d56 | 45 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
edamame22 | 0:f22fa5cc4d56 | 46 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
edamame22 | 0:f22fa5cc4d56 | 47 | |
edamame22 | 0:f22fa5cc4d56 | 48 | if (error == BLE_ERROR_NONE) led2 = 1; |
edamame22 | 0:f22fa5cc4d56 | 49 | |
edamame22 | 0:f22fa5cc4d56 | 50 | ble.gap().setAdvertisingInterval(1000); /* 1000ms */ |
edamame22 | 0:f22fa5cc4d56 | 51 | error = ble.gap().startAdvertising(); |
edamame22 | 0:f22fa5cc4d56 | 52 | printf("ble.gap().startAdvertising() => %u\r\n", error); |
edamame22 | 0:f22fa5cc4d56 | 53 | |
edamame22 | 0:f22fa5cc4d56 | 54 | /**************************************** |
edamame22 | 0:f22fa5cc4d56 | 55 | |
edamame22 | 0:f22fa5cc4d56 | 56 | TODO : Print the address of the server. The below is partially working. |
edamame22 | 0:f22fa5cc4d56 | 57 | |
edamame22 | 0:f22fa5cc4d56 | 58 | printf("Hello..My addr is: [%02x %02x %02x %02x %02x %02x] \r\n", params_advCallback->peerAddr[5], params_advCallback->peerAddr[4], params_advCallback->peerAddr[3], params_advCallback->peerAddr[2], params_advCallback->peerAddr[1], params_advCallback->peerAddr[0]); |
edamame22 | 0:f22fa5cc4d56 | 59 | ****************************************/ |
edamame22 | 0:f22fa5cc4d56 | 60 | |
edamame22 | 0:f22fa5cc4d56 | 61 | } |
edamame22 | 0:f22fa5cc4d56 | 62 | |
edamame22 | 0:f22fa5cc4d56 | 63 | /************************ Thread #1 for light sensor ************************/ |
edamame22 | 0:f22fa5cc4d56 | 64 | |
edamame22 | 0:f22fa5cc4d56 | 65 | void read_sensor(void) { |
edamame22 | 0:f22fa5cc4d56 | 66 | float tmp_t, tmp_p, tmp_h; |
edamame22 | 0:f22fa5cc4d56 | 67 | while(true) { |
edamame22 | 0:f22fa5cc4d56 | 68 | if(EvnSer!=NULL) { |
edamame22 | 0:f22fa5cc4d56 | 69 | tmp_t=sensor.getTemperature(); |
edamame22 | 0:f22fa5cc4d56 | 70 | tmp_p=sensor.getPressure(); tmp_h=sensor.getHumidity(); |
edamame22 | 0:f22fa5cc4d56 | 71 | EvnSer->updatePressure(tmp_p); EvnSer->updateTemperature(tmp_t); |
edamame22 | 0:f22fa5cc4d56 | 72 | EvnSer->updateHumidity(tmp_h); |
edamame22 | 0:f22fa5cc4d56 | 73 | printf("%04.2f hPa, %2.2f degC, %2.2f %%\r\n", tmp_p, tmp_t, tmp_h ); |
edamame22 | 0:f22fa5cc4d56 | 74 | } |
Ren Boting | 1:9d1a3835d884 | 75 | Thread::wait(1000); |
edamame22 | 0:f22fa5cc4d56 | 76 | } |
edamame22 | 0:f22fa5cc4d56 | 77 | } |
edamame22 | 0:f22fa5cc4d56 | 78 | |
edamame22 | 0:f22fa5cc4d56 | 79 | /************************ Thread #2 for BLE activities ************************/ |
edamame22 | 0:f22fa5cc4d56 | 80 | |
edamame22 | 0:f22fa5cc4d56 | 81 | void Bluetooth_LE_server(void) { |
edamame22 | 0:f22fa5cc4d56 | 82 | |
edamame22 | 0:f22fa5cc4d56 | 83 | ble.init(bleInitComplete); |
edamame22 | 0:f22fa5cc4d56 | 84 | |
edamame22 | 0:f22fa5cc4d56 | 85 | while(1) { |
edamame22 | 0:f22fa5cc4d56 | 86 | ble.processEvents(); |
edamame22 | 0:f22fa5cc4d56 | 87 | } |
edamame22 | 0:f22fa5cc4d56 | 88 | //This statement might be un-reachable...?? |
edamame22 | 0:f22fa5cc4d56 | 89 | Thread::wait(1000); |
edamame22 | 0:f22fa5cc4d56 | 90 | } |
edamame22 | 0:f22fa5cc4d56 | 91 | |
edamame22 | 0:f22fa5cc4d56 | 92 | /************************ Thread #3 main() ************************/ |
edamame22 | 0:f22fa5cc4d56 | 93 | |
edamame22 | 0:f22fa5cc4d56 | 94 | int main() { |
Ren Boting | 1:9d1a3835d884 | 95 | // printf("Inside main\r\n"); |
edamame22 | 0:f22fa5cc4d56 | 96 | // reduced following stack size to 960 x 2 (default stack size: 2048 x 2) |
edamame22 | 0:f22fa5cc4d56 | 97 | Thread thread1(osPriorityNormal,SMALL_STACK_SIZE,NULL); |
edamame22 | 0:f22fa5cc4d56 | 98 | Thread thread2(osPriorityNormal,SMALL_STACK_SIZE,NULL); |
edamame22 | 0:f22fa5cc4d56 | 99 | |
edamame22 | 0:f22fa5cc4d56 | 100 | EvnSer=NULL; |
edamame22 | 0:f22fa5cc4d56 | 101 | thread1.start(read_sensor); |
edamame22 | 0:f22fa5cc4d56 | 102 | thread2.start(Bluetooth_LE_server); |
edamame22 | 0:f22fa5cc4d56 | 103 | |
edamame22 | 0:f22fa5cc4d56 | 104 | while(true) { |
edamame22 | 0:f22fa5cc4d56 | 105 | led1 = !led1; |
edamame22 | 0:f22fa5cc4d56 | 106 | Thread::wait(500); |
edamame22 | 0:f22fa5cc4d56 | 107 | } |
edamame22 | 0:f22fa5cc4d56 | 108 | } |