Skip to content

Instantly share code, notes, and snippets.

@adlerweb
Last active January 1, 2025 23:12
Show Gist options
  • Save adlerweb/e4746997eb14b7ae1242011ed75c6e12 to your computer and use it in GitHub Desktop.
Save adlerweb/e4746997eb14b7ae1242011ed75c6e12 to your computer and use it in GitHub Desktop.

Revisions

  1. adlerweb revised this gist May 26, 2024. 1 changed file with 66 additions and 52 deletions.
    118 changes: 66 additions & 52 deletions esp32c3-ble-uart.c
    Original file line number Diff line number Diff line change
    @@ -38,85 +38,99 @@ const uint16_t led=8;

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

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

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

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

    Serial.print(rxValue[i]);
    Serial.println();
    }
    }
    };

    void setup() {
    Serial.begin(115200);
    pinMode(led, OUTPUT);

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

    // 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
    );
    Serial.begin(115200);
    pinMode(led, OUTPUT);

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

    // Create the BLE Server
    pServer = BLEDevice::createServer();
    if(!pServer) {
    Serial.println("Error creating BLE server");
    delay(1000);
    ESP.restart();
    }
    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
    );
    if(!pTxCharacteristic) {
    Serial.println("Error creating TX characteristic");
    delay(1000);
    ESP.restart();
    }

    pTxCharacteristic->addDescriptor(new BLE2902());

    BLECharacteristic * pRxCharacteristic = pService->createCharacteristic(
    CHARACTERISTIC_UUID_RX,
    BLECharacteristic::PROPERTY_WRITE
    );
    if(!pRxCharacteristic) {
    Serial.println("Error creating RX characteristic");
    delay(1000);
    ESP.restart();
    }

    pRxCharacteristic->setCallbacks(new MyCallbacks());
    pRxCharacteristic->setCallbacks(new MyCallbacks());

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

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

    void bleWrite(String out) {
    const uint8_t limit=20;

    if(!deviceConnected) return;

    if(out.length() > 20) {
    uint16_t blocks = (out.length()/limit)+1;
    for(uint16_t i=0; i<blocks; i++) {
    bleWrite(out.substring(i*limit, (i*limit)+limit));
    const uint8_t limit=20;

    if(!deviceConnected) return;

    if(out.length() > 20) {
    uint16_t blocks = (out.length()/limit)+1;
    for(uint16_t i=0; i<blocks; i++) {
    bleWrite(out.substring(i*limit, (i*limit)+limit));
    }
    }else{
    pTxCharacteristic->setValue(out.c_str());
    pTxCharacteristic->notify();
    delay(10);
    }
    }else{
    pTxCharacteristic->setValue(out.c_str());
    pTxCharacteristic->notify();
    delay(10);
    }
    }

    void bleWriteln(String out) {
    out += "\n";
    bleWrite(out);
    out += "\n";
    bleWrite(out);
    }

    void loop() {
  2. adlerweb revised this gist May 26, 2024. 1 changed file with 24 additions and 24 deletions.
    48 changes: 24 additions & 24 deletions esp32c3-ble-uart.c
    Original file line number Diff line number Diff line change
    @@ -2,21 +2,21 @@
    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.
    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 <Arduino.h>
    #include <BLEDevice.h>
    @@ -76,16 +76,16 @@ void setup() {

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

    pTxCharacteristic->addDescriptor(new BLE2902());

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

    pRxCharacteristic->setCallbacks(new MyCallbacks());

    @@ -128,8 +128,8 @@ void loop() {
    Serial.println(out);
    txValue++;
    digitalWrite(led, !digitalRead(led));
    delay(1000); // bluetooth stack will go into congestion, if too many packets are sent
    }
    delay(1000); // bluetooth stack will go into congestion, if too many packets are sent
    }

    // disconnecting
    if (!deviceConnected && oldDeviceConnected) {
    @@ -140,7 +140,7 @@ void loop() {
    }
    // connecting
    if (deviceConnected && !oldDeviceConnected) {
    // do stuff here on connecting
    // do stuff here on connecting
    oldDeviceConnected = deviceConnected;
    Serial.println("Connecting");
    }
  3. adlerweb created this gist May 26, 2024.
    153 changes: 153 additions & 0 deletions esp32c3-ble-uart.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,153 @@
    /*
    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 <Arduino.h>
    #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;

    const uint16_t led=8;

    #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) {
    std::string rxValue = pCharacteristic->getValue();

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

    Serial.println();
    }
    }
    };

    void setup() {
    Serial.begin(115200);
    pinMode(led, OUTPUT);

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

    // 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 bleWrite(String out) {
    const uint8_t limit=20;

    if(!deviceConnected) return;

    if(out.length() > 20) {
    uint16_t blocks = (out.length()/limit)+1;
    for(uint16_t i=0; i<blocks; i++) {
    bleWrite(out.substring(i*limit, (i*limit)+limit));
    }
    }else{
    pTxCharacteristic->setValue(out.c_str());
    pTxCharacteristic->notify();
    delay(10);
    }
    }

    void bleWriteln(String out) {
    out += "\n";
    bleWrite(out);
    }

    void loop() {
    if (deviceConnected) {
    String out = "Wert: ";
    out += txValue;
    out += " - 012345678901234567890123456789";
    bleWriteln(out);
    Serial.println(out);
    txValue++;
    digitalWrite(led, !digitalRead(led));
    delay(1000); // 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;
    Serial.println("Connecting");
    }

    digitalWrite(led, !digitalRead(led));
    delay(25);
    digitalWrite(led, !digitalRead(led));

    if(txValue > 200) txValue = 0;
    }