BLE Primer for ESP32-S3 (LoRa v3)

Hi All,

I am new to any form or bluetooth, classic or BLE. Where can I pick up a primer for this subject as it relates to this board and it’s libraries. I’m trying to choose a sample to leverage for a demo I need to give in a couple of weeks.

My goal:
To broadcast(send) values from the ESP to a bluetooth terminal on an android phone or tablet. The procedure should be as follows; the user that’s interested in reading the values pairs to the ESP, opens a terminal and see the periodic updates. I currently have these values displaying on the ESP-LoRa 32 v3 board…that is my development target.

Also, this device will eventually be used for an industrial meter application, am I losing out on anything by only having BLE and not classic BT capability…I think not in this application.

Thanks in advance.

I´m looking for the same.
Any clue how to get BLE-UART to a smartphone while sending/receibing P2P lora sensor. Im working on a remote detection timer and need those times on oled and smartphone aswell.

if you are using the Arduino IDE have a look at File>Examples>BLE>UART
if using a Android smartphone connect to it using Serial Bluetooth Terminal which supports BLE

do you intend to implement your own smartphone app or just use an existing app?

This is the same application I’ve been using in my previous project. It’s the one I want to port to this LoRa platform, but I can’t find that sketch for V3, only on the WiFi Kit board. I also think I’ve downloaded an old library, because most of the examples don’t compile. I’ve had more success with the examples from the unofficial library, but it doesn’t include any BLE sketches.

My goal is to have the two modules that would act as LoRa, TX and RX, only point-to-point. The TX module is a remote sensor that sends a signal to the RX module (150 meters away), and this RX module is the one I want to have BLE enabled to send that signal to the phone in the app. Do you know if this is possible with a Bluetooth serial terminal? BLE+LoRa at the same time?

should be possible

initially try this BLE_chat program which is based on the File>Examples>BLE>UART

Using Arduino IDE V 2.3.5 ESP32 core 3.3.0 and running on a Heltec LoRa V3 with Tools>Board Heltec WiFi LoRa (V3) selected

// BLE chat program adapted from File>Examples>BLE>UART

// run terminal app on smartphone and exchange test messages
//  e.g. Android https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal&hl=en-US

/*
    Video: https://www.youtube.com/watch?v=oCMOYS71NIU
    Based on Neil Kolban example for IDF: https://github.com/nkolban/esp32-snippets/blob/master/cpp_utils/tests/BLE%20Tests/SampleNotify.cpp
    Ported to Arduino ESP32 by Evandro Copercini

   Create a BLE server that, once we receive a connection, will send periodic notifications.
   The service advertises itself as: 6E400001-B5A3-F393-E0A9-E50E24DCCA9E
   Has a characteristic of: 6E400002-B5A3-F393-E0A9-E50E24DCCA9E - used for receiving data with "WRITE" 
   Has a characteristic of: 6E400003-B5A3-F393-E0A9-E50E24DCCA9E - used to send data with  "NOTIFY"

   The design of creating the BLE server is:
   1. Create a BLE Server
   2. Create a BLE Service
   3. Create a BLE Characteristic on the Service
   4. Create a BLE Descriptor on the characteristic
   5. Start the service.
   6. Start advertising.

   In this example rxValue is the data received (only accessible inside that function).
   And txValue is the data to be sent, in this example just a byte incremented every second. 
*/
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

BLEServer *pServer = NULL;
BLECharacteristic *pTxCharacteristic;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint8_t txValue = 0;

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"  // UART service UUID
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"


class MyServerCallbacks : public BLEServerCallbacks {
  void onConnect(BLEServer *pServer) {
    deviceConnected = true;
  };

  void onDisconnect(BLEServer *pServer) {
    deviceConnected = false;
  }
};

class MyCallbacks : public BLECharacteristicCallbacks {
  void onWrite(BLECharacteristic *pCharacteristic) {
    String rxValue = pCharacteristic->getValue();

    if (rxValue.length() > 0) {
      Serial.println("*********");
      Serial.print("Received Value: ");
      for (int i = 0; i < rxValue.length(); i++)
        Serial.print(rxValue[i]);

      Serial.println();
      Serial.println("*********");
    }
  }
};


void setup() {
  Serial.begin(115200);

  // Create the BLE Device
  BLEDevice::init("UART Service");

  // Create the BLE Server
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  // Create the BLE Service
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // Create a BLE Characteristic
  pTxCharacteristic = pService->createCharacteristic(
    CHARACTERISTIC_UUID_TX,
    BLECharacteristic::PROPERTY_NOTIFY);

  pTxCharacteristic->addDescriptor(new BLE2902());

  BLECharacteristic *pRxCharacteristic = pService->createCharacteristic(
    CHARACTERISTIC_UUID_RX,
    BLECharacteristic::PROPERTY_WRITE);

  pRxCharacteristic->setCallbacks(new MyCallbacks());

  // Start the service
  pService->start();

  // Start advertising
  pServer->getAdvertising()->start();
  Serial.println("Waiting a client connection to notify...");
}

void loop() {

  if (deviceConnected) {
    if (Serial.available()) {
      byte text[100] = { 0 };
      int size = Serial.readBytes( text, 100);
      pTxCharacteristic->setValue(text, size);
      pTxCharacteristic->notify();
      txValue++;
      delay(10);  // bluetooth stack will go into congestion, if too many packets are sent
    }
  }

  // disconnecting
  if (!deviceConnected && oldDeviceConnected) {
    delay(500);                   // give the bluetooth stack the chance to get things ready
    pServer->startAdvertising();  // restart advertising
    Serial.println("start advertising");
    oldDeviceConnected = deviceConnected;
  }
  // connecting
  if (deviceConnected && !oldDeviceConnected) {
    // do stuff here on connecting
    oldDeviceConnected = deviceConnected;
  }
}

paired Android phone with “UART service” and ran Serial Bluetooth Terminal
under Devices select Bluetooth LE then UART Service, e.g. screen

the Heltec V3 serial monitor displays

      Waiting a client connection to notify...
    *********
    Received Value: fhgtyhghjuyyiyuuuui

    *********
    *********
    Received Value: fhgtyhghjuyyiyuuuui

    *********
    *********
    Received Value: hello from android

    *********
    *********
    Received Value: hello from android

will see if I can get it working with LoRa

Thanks Horace! A fresh install of Arduino IDE + single oficial library makes examples works for me. Now everything is smother. im running a sketch with BLE UART + Lora+ Oled just fine!