From ca3419a99206f71d0d013a12cf607aa42b5b3326 Mon Sep 17 00:00:00 2001 From: Wolfgang Neudert Date: Mon, 29 Oct 2018 09:41:46 +0100 Subject: [PATCH] Beispiel LED Test --- BLE_uart_coderacer.ino | 167 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 BLE_uart_coderacer.ino diff --git a/BLE_uart_coderacer.ino b/BLE_uart_coderacer.ino new file mode 100644 index 0000000..fcb4174 --- /dev/null +++ b/BLE_uart_coderacer.ino @@ -0,0 +1,167 @@ +#include + +/* + 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 +#include +#include +#include + + +#define LED_VORWAERTS 26 // Pin an dem die VORWÄRTS LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. +#define LED_STOP 25 // Pin an dem die STOP LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. +#define LED_LINKS 27 // Pin an dem die LINKS LED angeschlossen ist. 'GPIO' muss man weglassen -> also z.B. nicht GPIO88 sondern nur 88. +#define LED_RECHTS 33 + +BLECharacteristic *pCharacteristic; +bool deviceConnected = false; +uint8_t txValue = 0; +char CRstatus = 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) { + std::string rxValue = pCharacteristic->getValue(); + + if (rxValue.length() > 0) { + Serial.println("*********"); + Serial.print("Received Value: "); + for (int i = 0; i < rxValue.length(); i++) + { + + CRstatus = rxValue[i]; + Serial.print(CRstatus); + + }; + + Serial.println(); + Serial.println("*********"); + } + } +}; + + +void setup() { + Serial.begin(115200); + pinMode(LED_VORWAERTS, OUTPUT); // LED Vorwärts ist ein Ausgang + pinMode(LED_STOP, OUTPUT); // LED Stop ist ein Ausgang + pinMode(LED_LINKS, OUTPUT); // LED Links ist ein Ausgang + pinMode(LED_RECHTS, OUTPUT); // LED Rechts ist ein Ausgang + // alle LEDS aus + digitalWrite(LED_VORWAERTS, LOW); + digitalWrite(LED_STOP, LOW); + digitalWrite(LED_LINKS, LOW); + digitalWrite(LED_RECHTS, LOW); + // Create the BLE Device + BLEDevice::init("UART Service"); + + // Create the BLE Server + BLEServer *pServer = BLEDevice::createServer(); + pServer->setCallbacks(new MyServerCallbacks()); + + // Create the BLE Service + BLEService *pService = pServer->createService(SERVICE_UUID); + + // Create a BLE Characteristic + pCharacteristic = pService->createCharacteristic( + CHARACTERISTIC_UUID_TX, + BLECharacteristic::PROPERTY_NOTIFY + ); + + pCharacteristic->addDescriptor(new BLE2902()); + + BLECharacteristic *pCharacteristic = pService->createCharacteristic( + CHARACTERISTIC_UUID_RX, + BLECharacteristic::PROPERTY_WRITE + ); + + pCharacteristic->setCallbacks(new MyCallbacks()); + + // Start the service + pService->start(); + + // Start advertising + pServer->getAdvertising()->start(); + Serial.println("Waiting a client connection to notify..."); +} + +void loop() { + + + switch (CRstatus) { //(toInt(CRstatus)) { + case '0': // + Serial.println("STOP"); + digitalWrite(LED_STOP, HIGH); + break; + case '1': + Serial.println("VOR"); + digitalWrite(LED_VORWAERTS, HIGH); + break; + case '2': + Serial.println("LINKS"); + digitalWrite(LED_LINKS, HIGH); + break; + case '3': + Serial.println("RECHTS"); + digitalWrite(LED_RECHTS, HIGH); + break; + case '4': + Serial.println("ZURUECK"); // hier gibt es keine LED + break; + default: + Serial.println("Kommando unbekannt"); + + } + + + + if (deviceConnected) { + Serial.printf("*** Sent Value: %d ***\n", txValue); + pCharacteristic->setValue(&txValue, 1); + pCharacteristic->notify(); + txValue++; + } + delay(1000); + + digitalWrite(LED_VORWAERTS, LOW); + digitalWrite(LED_STOP, LOW); + digitalWrite(LED_LINKS, LOW); + digitalWrite(LED_RECHTS, LOW); + +}