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"]
}
}
}