An mbed BLE-to-Cloud Gateway using Nucleo-F429ZI+X-Nucleo-IDB05A1 or Nucleo-L476RG+X-Nucleo-IDB05A1+X-Nucleo-IDW01M1.
Information
Nucleo- F429ZI configuration requires two hardware patches:
- on Nucleo-F429ZI open SB121 and close SB122
- on X-Nucleo-IDB05A1 move R4 to R6
The BLE client searches for and connects to a MotEnv node.
Revision 4:d5f5559b48f7, committed 2017-10-20
- Comitter:
- nikapov
- Date:
- Fri Oct 20 19:04:58 2017 +0200
- Parent:
- 3:39c8d17bed52
- Commit message:
- Add support to Nucleo_F429ZI and ethernet.
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
mbed_app.json | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Thu Oct 12 18:23:08 2017 +0200 +++ b/main.cpp Fri Oct 20 19:04:58 2017 +0200 @@ -52,7 +52,11 @@ // Status indication DigitalOut red_led(RED_LED); +#ifdef NUCLEO_F429ZI +DigitalOut green_led(NC); // avoid interference with SPI_CLK +#else DigitalOut green_led(GREEN_LED); +#endif DigitalOut blue_led(BLUE_LED); @@ -73,7 +77,7 @@ void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) { - // parse the advertising payload, looking for data type MANUFACTURER_SPECIFIC_DATA + // parse the advertising payload, looking for data type COMPLETE_LOCAL_NAME // The advertising payload is a collection of key/value records where // byte 0: length of the record excluding this byte // byte 1: The key, it is the type of the data @@ -98,27 +102,15 @@ devName[strLength] = '\0'; printf("Found a device with name: %s\n\r", devName); - if (memcmp(value, "BlueMbedOS", value_length) == 0) { + if (memcmp(value, "MotEnvMbed", 10) == 0) { // search for MotEnvMbedXX devices printf("Found an mbed device node\n"); BLEProtocol::AddressBytes_t devAddress; memcpy (devAddress, params->peerAddr,BLEProtocol::ADDR_LEN); - eventQueue.call(BLEConnect,devAddress); + BLEConnect(devAddress); break; } } -/* - if(type == GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA) { - printf("length: %d - mask: 0x%x\n\r", value_length, *((uint32_t*)(value+2))); - if (((value_length == 6) || (value_length == 12)) && (*((uint32_t*)(value+2)) & 0x00001C00) == 0x00001C00) { - printf("Found an ST device with environmental data\n"); - //BLE::Instance().gap().connect(params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL); - BLEProtocol::AddressBytes_t devAddress; - memcpy (devAddress, params->peerAddr,BLEProtocol::ADDR_LEN); - eventQueue.call(BLEConnect,devAddress); - break; - } - } -*/ + i += record_length; } } @@ -143,20 +135,19 @@ //printf("Reading environmental data\n\n"); envCharacteristic.read(); envDataAvailable = true; +#ifdef NUCLEO_F429ZI + red_led = LED_ON; +#else + green_led = LED_ON; +#endif } else { envDataAvailable = false; } - } void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) { - /* - printf(" C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast()); - if (characteristicP->getUUID().getShortUUID() == 0xA001) { /* !ALERT! Alter this filter to suit your device. */ - /* optCharacteristic = *characteristicP; - triggerLedCharacteristic = true; - }*/ + printf("Found environmental data\n"); envCharacteristic = *characteristicP; triggerEnvCharacteristic = true; @@ -168,7 +159,7 @@ if (triggerEnvCharacteristic) { triggerEnvCharacteristic = false; - eventQueue.call(updateEnvCharacteristic); + eventQueue.call_in(500, updateEnvCharacteristic); } } @@ -200,13 +191,35 @@ //printf("Humidity: %f\r\n", (uint32_t)((dataforClient[7]<<8) | dataforClient[6])/10.0); //printf("Pressure: %f\r\n\r\n\r\n", (uint32_t)((dataforClient[5]<<24) |(dataforClient[4]<<16) |(dataforClient[3]<<8) | dataforClient[2])/100.0); - eventQueue.call(updateEnvCharacteristic); // triggering BLE data read again + eventQueue.call_in(500, updateEnvCharacteristic); // triggering BLE data read again in 0.5s } } +void triggerNotify(const GattHVXCallbackParams *response) { + + if (response->handle == envCharacteristic.getValueHandle()) { + payload_length = response-> len; + for(int i=0; i< response-> len; i++) { +// printf("%02x", response->data[i]); + dataforClient[i] = response -> data[i]; + // printf("%d", dataforClient[i]); + } + + //printf("Temperature: %f\r\n", (uint32_t)((dataforClient[9]<<8) | dataforClient[8])/10.0); + //printf("Humidity: %f\r\n", (uint32_t)((dataforClient[7]<<8) | dataforClient[6])/10.0); + //printf("Pressure: %f\r\n\r\n\r\n", (uint32_t)((dataforClient[5]<<24) |(dataforClient[4]<<16) |(dataforClient[3]<<8) | dataforClient[2])/100.0); + + } +} + void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *) { printf("Got disconnected from the device!\r\n"); /* Start scanning and try to connect again */ +#ifdef NUCLEO_F429ZI + red_led = LED_OFF; +#else + green_led = LED_OFF; +#endif BLE::Instance().gap().startScan(advertisementCallback); } @@ -240,7 +253,7 @@ // On reading data, call triggerRead function. ble.gattClient().onDataRead(triggerRead); - + //ble.gattClient().onHVX(triggerNotify); // scan interval: 400ms and scan window: 400ms. // Every 400ms the device will scan for 400ms // This means that the device will scan continuously. @@ -412,6 +425,7 @@ srand(seed); red_led = LED_OFF; blue_led = LED_OFF; + green_led = LED_OFF; // Keep track of the main thread mainThread = osThreadGetId();
--- a/mbed_app.json Thu Oct 12 18:23:08 2017 +0200 +++ b/mbed_app.json Fri Oct 20 19:04:58 2017 +0200 @@ -2,7 +2,7 @@ "config": { "network-interface":{ "help": "Options are ETHERNET, WIFI_ESP8266, WIFI_ODIN, MESH_LOWPAN_ND, MESH_THREAD, CELLULAR_ONBOARD, WIFI_IDW01M1", - "value": "WIFI_IDW01M1" + "value": "ETHERNET" }, "mesh_radio_type": { "help": "options are ATMEL, MCR20, SPIRIT1, EFR32", @@ -55,6 +55,11 @@ "target.extra_labels_add": ["ST_BLUENRG"], "wifi-tx": "PA_9", "wifi-rx": "PA_10" + }, + "NUCLEO_F429ZI": { + "target.macros_add": ["BLUENRG_PIN_SPI_SCK=D13","BLUENRG_PIN_SPI_MOSI=PB_5"], + "target.features_add": ["BLE"], + "target.extra_labels_add": ["ST_BLUENRG"] } } }