Hallo Leute,
ich habe mit meinem Projekt ein kleines Problem und hoffe mir kann jemand helfen.
Ich habe einen ESP32 an den ein MotorTreiber und Endschalter angeschlossen sind.
Ich möchte eine BLE Characteristic beschreiben (Property::write) zur Motorsteuerung und eine Characteristic als Notification (Property::notify) die meiner App mittelt wenn der Endschalter getriggert wurde. Beide natürlich im gleichen Service.
Ich nutze die examples von Neil Kolban, seperat für sich komme ich mit den Programmen soweit auch klar.
Jedoch bekomme ich stets einen Reboot sobald ich eine Notification senden möchte.
Fragen beantworte ich gerne und für Tips bin ich sehr dankbar.
Hier ist mein Code:
/*
Based on Neil Kolban example
*/
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#include <BLE2902.h> //Wirklich nötig?
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define FLAGCHAR_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
#define STATECHAR_UUID "330d4132-3754-43ec-b16c-f3e0a7a89090"
BLEServer* pServer = NULL;
BLEService* pService = NULL;
BLECharacteristic* pFlagchar = NULL;
BLECharacteristic* pStatechar = NULL;
uint32_t SecureState = 0;
uint32_t CloseFlag = 0;
class MyCallbacks: public BLECharacteristicCallbacks {
void onWrite(BLECharacteristic *pFlagChar) {
std::string value = pFlagChar->getValue();
String str_value = value.c_str(); //Umwandlung zu String
if (str_value == "0") {
CloseFlag = 0;
}
if (str_value == "1") {
CloseFlag = 1;
}
if (str_value != "0" && str_value != "1") {
Serial.println("Nur 0 / 1 erlaubt");
}
}
};
void setup() {
Serial.begin(115200);
BLEDevice::init("MyESP32");
pServer = BLEDevice::createServer();
pService = pServer->createService(SERVICE_UUID);
BLECharacteristic* pFlagchar = pService->createCharacteristic(
FLAGCHAR_UUID,
BLECharacteristic::PROPERTY_WRITE
);
BLECharacteristic* pStatechar = pService->createCharacteristic(
STATECHAR_UUID,
BLECharacteristic::PROPERTY_NOTIFY
);
pFlagchar->setCallbacks(new MyCallbacks());
pService->start();
BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();
}
void loop() {
if (CloseFlag == 1 && SecureState == 0) {
//MotorClose();
Serial.println("Close");
SecureState = 1;
pStatechar->setValue("1");
pStatechar->notify();
}
if (CloseFlag == 0 && SecureState == 1) {
//MotorOpen();
Serial.println("Open");
SecureState = 0;
pStatechar->setValue("0");
pStatechar->notify();
}
delay(500);
}