Hy everybody! I would like to connect my Particle Argon to an STM32WB55 dev board via Bluetooth to send commands to it from the cloud. The wifi part works, but I am stuck with the BLE part. I would like to ask your help to find a way to connect and communicate with the STM32WB55. I tried to blink the LED in the workshop example: https://www.st.com/content/st_com/en/support/learning/stm32-education/stm32-moocs/STM32WB_workshop_MOOC.html You can find the bluetooth LED blink project after installation of the software used on the ws. The project is located in the HandsOn_3 folder in the zip file.
Here is my code:
#include "Particle.h"
// This example does not require the cloud so you can run it in manual mode or
// normal cloud-connected mode
const size_t UART_TX_BUF_SIZE = 20;
int new_message=0;
String message="";
bool BLE_previously_connected=false;
uint8_t txBuf[UART_TX_BUF_SIZE];
size_t txLen = 0;
void onDataReceived(const uint8_t* data, size_t len, const BlePeerDevice& peer, void* context);
// These UUIDs were defined by Nordic Semiconductor and are now the defacto standard for
// UART-like services over BLE. Many apps support the UUIDs now, like the Adafruit Bluefruit app.
const unsigned long SCAN_PERIOD_MS = 2000;
unsigned long lastScan = 0;
const size_t SCAN_RESULT_COUNT = 20;
BleScanResult scanResults[SCAN_RESULT_COUNT];
BlePeerDevice peer;
BleCharacteristic peerTxCharacteristic;
BleCharacteristic peerRxCharacteristic;
const BleUuid serviceUuid("0000FE40-CC7A-482A-984A-7F2ED5B3E58F");
const BleUuid rxUuid("0000FE42-8E22-4541-9D4C-21EDAE82ED19");
const BleUuid txUuid("0000FE41-8E22-4541-9D4C-21EDAE82ED19");
void onDataReceived(const uint8_t* data, size_t len, const BlePeerDevice& peer, void* context) {
Particle.publish("Message Receive",String((char *) data,len),PUBLIC);
}
void setup() {
size_t offset = 0;
uint8_t buf[BLE_MAX_ADV_DATA_LEN];
peerTxCharacteristic.onDataReceived(onDataReceived, &peerTxCharacteristic);
Particle.function("MSG",messageHandler);
}
void loop() {
if (BLE.connected()) {
txLen = 0;
if(!BLE_previously_connected) //new connection
{
Particle.publish("Connected","True");
}
if(new_message)
{
new_message=0;
for(int i=0;i<message.length();i++)
{
txBuf[txLen++]=message.charAt(i);
}
//txBuf[txLen++]='\n';
//Particle.publish("MsgR",message,PUBLIC);
}
if (txLen > 0) {
peerRxCharacteristic.setValue(txBuf, txLen);
}
BLE_previously_connected=true;
}
else
{
BLE_previously_connected=false;
if (millis() - lastScan >= SCAN_PERIOD_MS) {
// Time to scan
lastScan = millis();
size_t count = BLE.scan(scanResults, SCAN_RESULT_COUNT);
Particle.publish("Scanning","True");
if (count > 0) {
for (uint8_t ii = 0; ii < count; ii++) {
BleUuid foundServiceUuid;
size_t svcCount = scanResults[ii].advertisingData.serviceUUID(&foundServiceUuid, 1);
if(svcCount > 0 && foundServiceUuid == serviceUuid){
Particle.publish("Found service, trying to connect...","True");
peer = BLE.connect(scanResults[ii].address);
//debug
Particle.publish("Peer",String(scanResults[ii].address[5],HEX)+":"+String(scanResults[ii].address[4],HEX)+":"+String(scanResults[ii].address[3],HEX)+":"+String(scanResults[ii].address[2],HEX)+":"+String(scanResults[ii].address[1],HEX)+":"+String(scanResults[ii].address[0],HEX),PUBLIC);
//end of debug
if (peer.connected()) {
peerTxCharacteristic = peer.getCharacteristicByUUID(txUuid);
peerRxCharacteristic = peer.getCharacteristicByUUID(rxUuid);
}
break;
}
}
}
}
}
}
int messageHandler(String s)
{
new_message=1;
message=s;
return 0;
}