This is an example to broadcast measured value of BME280 through BLE GATT service.

Dependencies:   BME280

please refer detail information at GitHub. https://github.com/soramame21/BLE_Server_BME280

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?

UserRevisionLine numberNew 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 }