Это сценарий. Arduino A имеет кнопку A прилагается. Когда кнопка A нажата, светодиод A включается, а светодиод B выключается. При повторном нажатии светодиод A выключен, а светодиод B включен. У меня есть это вместе с некоторыми другими аспектами, полностью контролируемыми и работающими. Следующий шаг, который я пытаюсь выполнить, - включить BLE Notify в arduino. При нажатии кнопки и включении светодиода A я бы хотел, чтобы BLE-уведомление отправляло что-то (например, «G»). Затем, если кнопка нажата снова, уведомление BLE отправляет что-то другое ('R').
Я попытался объединить пример Sketch 'BLE_Notify' в своем коде, но когда я подключаю Arduino к приложению BLE для телефона, я получаю бесконечное количество измененных уведомлений, ничего не делая. Ниже мой комбинированный код.
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint32_t value = 0;
#define SERVICE_UUID "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"
class MyServerCallbacks: public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};
const int bt1 = 27;
boolean bt1g = true;
int bt1t = 0;
void setup() {
pinMode(33, OUTPUT);
pinMode(15, OUTPUT);
pinMode(bt1, INPUT_PULLUP);
Serial.begin(9600);
BLEDevice::init("ESP32");
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService(SERVICE_UUID);
pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY |
BLECharacteristic::PROPERTY_INDICATE
);
pCharacteristic->addDescriptor(new BLE2902());
pService->start();
BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
pAdvertising->addServiceUUID(SERVICE_UUID);
pAdvertising->setScanResponse(false);
pAdvertising->setMinPreferred(0x0);
BLEDevice::startAdvertising();
Serial.println("Waiting a client connection to notify...");
}
void loop()
{
if (deviceConnected) {
pCharacteristic->setValue((uint8_t*)&value, 4);
pCharacteristic->notify();
value++;
delay(3); /
}
if (!deviceConnected && oldDeviceConnected) {
delay(500);
pServer->startAdvertising();
Serial.println("start advertising");
oldDeviceConnected = deviceConnected;
}
if (deviceConnected && !oldDeviceConnected) {
oldDeviceConnected = deviceConnected;
}
if (bt1g) {
if (digitalRead(bt1) == LOW ) {
bt1t = (bt1t + 1) % 2;
Serial.println(bt1t);
bt1g = false;
}
}
if (!bt1g) {
if (digitalRead(bt1) == HIGH) {
bt1g = true;
}
}
if (bt1t == 0) {
digitalWrite(33, LOW);
digitalWrite(15, HIGH);
pCharacteristic->setValue(0);
pCharacteristic->notify();
value++;
}
if (bt1t == 1) {
digitalWrite(33, HIGH);
digitalWrite(15, LOW);
pCharacteristic->setValue(1);
pCharacteristic->notify();
value++;
}
delay(50);
}
Я очень плохо знаком с Arduino и средой C ++, поэтому извините, если мой код плохой.