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:
edamame22
Date:
Fri Apr 14 02:51:57 2017 +0000
Revision:
0:f22fa5cc4d56
Child:
1:9d1a3835d884
Initial commit

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
edamame22 0:f22fa5cc4d56 13 #if defined(TARGET_LPC1768)
edamame22 0:f22fa5cc4d56 14 BME280 sensor(p28, p27);
edamame22 0:f22fa5cc4d56 15 #elif defined(TARGET_TY51822R3)
edamame22 0:f22fa5cc4d56 16 BME280 sensor(I2C_SDA0, I2C_SCL0);
edamame22 0:f22fa5cc4d56 17 #define SMALL_STACK_SIZE 960 //reduced thread stack size (default:2048)
edamame22 0:f22fa5cc4d56 18 #else
edamame22 0:f22fa5cc4d56 19 BME280 sensor(I2C_SDA, I2C_SCL);
edamame22 0:f22fa5cc4d56 20 #endif
edamame22 0:f22fa5cc4d56 21
edamame22 0:f22fa5cc4d56 22 const static char DEVICE_NAME[] = "BME280";
edamame22 0:f22fa5cc4d56 23 const static uint16_t uuid16_list[] = {GattService::UUID_ENVIRONMENTAL_SERVICE};
edamame22 0:f22fa5cc4d56 24 static EnvironmentalService *EvnSer=NULL;
edamame22 0:f22fa5cc4d56 25
edamame22 0:f22fa5cc4d56 26 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
edamame22 0:f22fa5cc4d56 27 {
edamame22 0:f22fa5cc4d56 28 BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising(); // restart advertising
edamame22 0:f22fa5cc4d56 29 }
edamame22 0:f22fa5cc4d56 30
edamame22 0:f22fa5cc4d56 31 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
edamame22 0:f22fa5cc4d56 32 {
edamame22 0:f22fa5cc4d56 33 BLE &ble = params->ble;
edamame22 0:f22fa5cc4d56 34 ble_error_t error = params->error;
edamame22 0:f22fa5cc4d56 35 EvnSer = new EnvironmentalService(ble);
edamame22 0:f22fa5cc4d56 36
edamame22 0:f22fa5cc4d56 37 printf("Inside BLE..starting payload creation..\r\n");
edamame22 0:f22fa5cc4d56 38
edamame22 0:f22fa5cc4d56 39 ble.gap().onDisconnection(disconnectionCallback);
edamame22 0:f22fa5cc4d56 40
edamame22 0:f22fa5cc4d56 41 /* Setup advertising. */
edamame22 0:f22fa5cc4d56 42 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
edamame22 0:f22fa5cc4d56 43 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
edamame22 0:f22fa5cc4d56 44 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
edamame22 0:f22fa5cc4d56 45 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
edamame22 0:f22fa5cc4d56 46
edamame22 0:f22fa5cc4d56 47 if (error == BLE_ERROR_NONE) led2 = 1;
edamame22 0:f22fa5cc4d56 48
edamame22 0:f22fa5cc4d56 49 ble.gap().setAdvertisingInterval(1000); /* 1000ms */
edamame22 0:f22fa5cc4d56 50 error = ble.gap().startAdvertising();
edamame22 0:f22fa5cc4d56 51 printf("ble.gap().startAdvertising() => %u\r\n", error);
edamame22 0:f22fa5cc4d56 52
edamame22 0:f22fa5cc4d56 53 /****************************************
edamame22 0:f22fa5cc4d56 54
edamame22 0:f22fa5cc4d56 55 TODO : Print the address of the server. The below is partially working.
edamame22 0:f22fa5cc4d56 56
edamame22 0:f22fa5cc4d56 57 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 58 ****************************************/
edamame22 0:f22fa5cc4d56 59
edamame22 0:f22fa5cc4d56 60 }
edamame22 0:f22fa5cc4d56 61
edamame22 0:f22fa5cc4d56 62 /************************ Thread #1 for light sensor ************************/
edamame22 0:f22fa5cc4d56 63
edamame22 0:f22fa5cc4d56 64 void read_sensor(void) {
edamame22 0:f22fa5cc4d56 65 float tmp_t, tmp_p, tmp_h;
edamame22 0:f22fa5cc4d56 66 while(true) {
edamame22 0:f22fa5cc4d56 67 if(EvnSer!=NULL) {
edamame22 0:f22fa5cc4d56 68 tmp_t=sensor.getTemperature();
edamame22 0:f22fa5cc4d56 69 tmp_p=sensor.getPressure(); tmp_h=sensor.getHumidity();
edamame22 0:f22fa5cc4d56 70 EvnSer->updatePressure(tmp_p); EvnSer->updateTemperature(tmp_t);
edamame22 0:f22fa5cc4d56 71 EvnSer->updateHumidity(tmp_h);
edamame22 0:f22fa5cc4d56 72 printf("%04.2f hPa, %2.2f degC, %2.2f %%\r\n", tmp_p, tmp_t, tmp_h );
edamame22 0:f22fa5cc4d56 73 }
edamame22 0:f22fa5cc4d56 74 Thread::wait(1000);
edamame22 0:f22fa5cc4d56 75 }
edamame22 0:f22fa5cc4d56 76 }
edamame22 0:f22fa5cc4d56 77
edamame22 0:f22fa5cc4d56 78 /************************ Thread #2 for BLE activities ************************/
edamame22 0:f22fa5cc4d56 79
edamame22 0:f22fa5cc4d56 80 void Bluetooth_LE_server(void) {
edamame22 0:f22fa5cc4d56 81
edamame22 0:f22fa5cc4d56 82 ble.init(bleInitComplete);
edamame22 0:f22fa5cc4d56 83
edamame22 0:f22fa5cc4d56 84 while(1) {
edamame22 0:f22fa5cc4d56 85 ble.processEvents();
edamame22 0:f22fa5cc4d56 86 }
edamame22 0:f22fa5cc4d56 87 //This statement might be un-reachable...??
edamame22 0:f22fa5cc4d56 88 Thread::wait(1000);
edamame22 0:f22fa5cc4d56 89 }
edamame22 0:f22fa5cc4d56 90
edamame22 0:f22fa5cc4d56 91 /************************ Thread #3 main() ************************/
edamame22 0:f22fa5cc4d56 92
edamame22 0:f22fa5cc4d56 93 int main() {
edamame22 0:f22fa5cc4d56 94 // printf("Inside main\r\n");
edamame22 0:f22fa5cc4d56 95 // reduced following stack size to 960 x 2 (default stack size: 2048 x 2)
edamame22 0:f22fa5cc4d56 96 Thread thread1(osPriorityNormal,SMALL_STACK_SIZE,NULL);
edamame22 0:f22fa5cc4d56 97 Thread thread2(osPriorityNormal,SMALL_STACK_SIZE,NULL);
edamame22 0:f22fa5cc4d56 98
edamame22 0:f22fa5cc4d56 99 EvnSer=NULL;
edamame22 0:f22fa5cc4d56 100 thread1.start(read_sensor);
edamame22 0:f22fa5cc4d56 101 thread2.start(Bluetooth_LE_server);
edamame22 0:f22fa5cc4d56 102
edamame22 0:f22fa5cc4d56 103 while(true) {
edamame22 0:f22fa5cc4d56 104 led1 = !led1;
edamame22 0:f22fa5cc4d56 105 Thread::wait(500);
edamame22 0:f22fa5cc4d56 106 }
edamame22 0:f22fa5cc4d56 107 }