ESP32/Arduino BLE UART Client Connect To Raspberry Pi Pico ...

Wednesday, May 19, 2021

ESP32/Arduino BLE UART Client connect to Raspberry Pi Pico/CircuitPython + ESP32/nina-fw

It's a BLE UART Client exercise run on ESP2-DevKitC using arduino-esp32 framework. Connect to cpyPico_ESP32_BLE.py in Raspberry Pi Pico/CircuitPython + ESP32/adafruit nina-fw (act as WiFi/BLE Co-Processor).

It search BLE device with specified service UUID, and characteristics for TX and RX. Then sending something every 5 seconds. In the Pico/CircuitPython +ESP32/nina-fw server side, receive and echo back every bytes. This client then print the received byte on Terminal.

ESP32_BLE_client.ino /* Modify from Arduino Examples for ESP32 Dev Module: > ESP32 BLE Arduino > BLE_client */ #include "BLEDevice.h" //#include "BLEScan.h" #define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID #define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" // RX Characteristic #define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" // TX Characteristic static BLEUUID serviceUUID(SERVICE_UUID); static BLEUUID charUUID_RX(CHARACTERISTIC_UUID_RX); static BLEUUID charUUID_TX(CHARACTERISTIC_UUID_TX); static boolean doConnect = false; static boolean connected = false; static boolean doScan = false; static BLERemoteCharacteristic* pTXCharacteristic; static BLERemoteCharacteristic* pRXCharacteristic; static BLEAdvertisedDevice* myDevice; static void notifyCallback( BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify) { /* Serial.print("Notify callback for characteristic "); Serial.print(pBLERemoteCharacteristic->getUUID().toString().c_str()); Serial.print(" of data length "); Serial.println(length); Serial.print("data: "); Serial.println((char*)pData); */ Serial.print((char*)pData); } class MyClientCallback : public BLEClientCallbacks { void onConnect(BLEClient* pclient) { } void onDisconnect(BLEClient* pclient) { connected = false; Serial.println("onDisconnect"); } }; bool connectToServer() { Serial.print("Forming a connection to "); Serial.println(myDevice->getAddress().toString().c_str()); BLEClient* pClient = BLEDevice::createClient(); Serial.println(" - Created client"); pClient->setClientCallbacks(new MyClientCallback()); // Connect to the remove BLE Server. pClient->connect(myDevice); // if you pass BLEAdvertisedDevice instead of address, // it will be recognized type of peer device address (public or private) Serial.println(" - Connected to server"); // Obtain a reference to the service we are after in the remote BLE server. BLERemoteService* pRemoteService = pClient->getService(serviceUUID); if (pRemoteService == nullptr) { Serial.print("Failed to find our service UUID: "); Serial.println(serviceUUID.toString().c_str()); pClient->disconnect(); return false; } Serial.println(" - Found our service"); // ================================================================================= // Obtain a reference to the characteristic in the service of the remote BLE server. // charUUID_TX pTXCharacteristic = pRemoteService->getCharacteristic(charUUID_TX); if (pTXCharacteristic == nullptr) { Serial.print("Failed to find our characteristic UUID: "); Serial.println(charUUID_TX.toString().c_str()); pClient->disconnect(); return false; } Serial.println(" - Found charUUID_TX characteristic"); // Read the value of the characteristic. if(pTXCharacteristic->canRead()) { std::string value = pTXCharacteristic->readValue(); Serial.print("The characteristic value was: "); Serial.println(value.c_str()); } if(pTXCharacteristic->canNotify()) pTXCharacteristic->registerForNotify(notifyCallback); // ================================================================================= // Obtain a reference to the characteristic in the service of the remote BLE server. // charUUID_RX pRXCharacteristic = pRemoteService->getCharacteristic(charUUID_RX); if (pRXCharacteristic == nullptr) { Serial.print("Failed to find our characteristic UUID: "); Serial.println(charUUID_RX.toString().c_str()); pClient->disconnect(); return false; } Serial.println(" - Found charUUID_RX characteristic"); String helloValue = "Hello Remote Server"; pRXCharacteristic->writeValue(helloValue.c_str(), helloValue.length()); // ================================================================================= connected = true; return true; } /** * Scan for BLE servers and find the first one that * advertises the service we are looking for. */ class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { /** * Called for each advertising BLE server. */ void onResult(BLEAdvertisedDevice advertisedDevice) { Serial.print("BLE Advertised Device found: "); Serial.println(advertisedDevice.toString().c_str()); // We have found a device, // let us now see if it contains the service we are looking for. if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(serviceUUID)) { BLEDevice::getScan()->stop(); myDevice = new BLEAdvertisedDevice(advertisedDevice); doConnect = true; doScan = true; } // Found our server } // onResult }; // MyAdvertisedDeviceCallbacks void setup() { Serial.begin(115200); Serial.println("Starting Arduino BLE Client application..."); BLEDevice::init(""); // Retrieve a Scanner and set the callback we want to use to be informed when we // have detected a new device. Specify that we want active scanning and start the // scan to run for 5 seconds. BLEScan* pBLEScan = BLEDevice::getScan(); pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); pBLEScan->setInterval(1349); pBLEScan->setWindow(449); pBLEScan->setActiveScan(true); pBLEScan->start(5, false); } // End of setup. // This is the Arduino main loop function. void loop() { // If the flag "doConnect" is true then we have scanned for and found the desired // BLE Server with which we wish to connect. Now we connect to it. Once we are // connected we set the connected flag to be true. if (doConnect == true) { if (connectToServer()) { Serial.println("We are now connected to the BLE Server."); } else { Serial.println("We have failed to connect to the server; there is nothin more we will do."); } doConnect = false; } // If we are connected to a peer BLE Server, // update the characteristic each time we are reached // with the current time since boot. if (connected) { //String newValue = "Time since boot: " + String(millis()/1000 + "\n"); //Serial.println("Setting new characteristic value to \"" + newValue + "\""); String newValue = " " + String(millis()/1000); // Set the characteristic's value to be the array of bytes that is actually a string. pRXCharacteristic->writeValue(newValue.c_str(), newValue.length()); }else if(doScan){ BLEDevice::getScan()->start(0); // this is just example to start scan after disconnect, // most likely there is better way to do it in arduino } delay(5000); // Delay a second between loops. } // End of loop

No comments:

Post a Comment

Newer Post Older Post Home Subscribe to: Post Comments (Atom)

My youtube playlist about Arduino

Follow me on Twitter

Follow @rpiiconnect

Popular Posts

  • ESP32 + 1.3 inch 240x240 IPS LCD (ST7789 SPI interface), using TFT_eSPI library
  • Arduino IDE error - avrdude: ser_open(): can't open device "/dev/ttyACM0": Permission denied
  • ESP32-DevKitC + 2.8inch 240x320 SPI TFT (ILI9341) using TFT_eSPI library
  • Beating Heart animation on 8x8 LED Matrix + Arduino Uno
  • Arduino Due + ESP8266 web server controlled LED
  • ESP32 + 2.4" 320X240 Display (SPI ILI9341), using TFT_eSPI, prepare user setup file.
  • ESP32 display with 0.96" 80x160 SPI ST7735 IPS Display, using TFT_eSPI lib
  • Arduino Due + ESP8266: Web Control LED
  • NodeMCU/ESP8266 act as AP (Access Point) and web server to control GPIO
  • NodeMCU (ESP8266) to display on 128x64 I2C OLED, using Adafruit SSD1306 library

Blog Archive

  • ▼  2021 (28)
    • ▼  May (1)
      • ESP32/Arduino BLE UART Client connect to Raspberry...

Twitter

Tweets by rpiiconnect

Tag » Arduino Ble Uart Example