j'essaie d'allumer une led dès que je suis connecter au bluetooth de mon esp32 et de l'éteindre une fois déconnecter mais dès que je me déconnecte, impossible de me reconnecter ensuite (esp32 non visible ).
Bonjour J-M-L
voici le code que j'utilise et j'essaie de me connecter avec mon smartphone (oneplus android) avec les appli BLE scanner, nrf connect ou serial bluetooth terminal
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
BLEServer *pServer;
BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
const int ledPin = 13; // Broche de la LED que vous souhaitez contrôler
class MyServerCallbacks : public BLEServerCallbacks {
void onConnect(BLEServer* pServer) {
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
}
};
void setup() {
pinMode(ledPin, OUTPUT);
BLEDevice::init("ESP32 BLE Server");
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks());
BLEService *pService = pServer->createService(BLEUUID("4fafc201-1fb5-459e-8fcc-c5c9c331914b"));
pCharacteristic = pService->createCharacteristic(
BLEUUID("beb5483e-36e1-4688-b7f5-ea07361b26a8"),
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY
);
pCharacteristic->addDescriptor(new BLE2902());
pService->start();
BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();
}
void loop() {
if (deviceConnected) {
digitalWrite(ledPin, HIGH); // Allume la LED lorsque le périphérique est connecté
} else {
digitalWrite(ledPin, LOW); // Éteint la LED lorsque le périphérique est déconnecté
}
delay(1000); // Attend 1 seconde avant de vérifier à nouveau
}
vous pourriez mettre la pin comme paramètre de votre classe callback comme cela vous l'activez et désactivez directement dans le callback et il n'y a pas de latence
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
BLEServer *pServer;
BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
constexpr byte ledPin = 2; // Broche de la LED que vous souhaitez contrôler
template <const byte pin>
class MyServerCallbacks : public BLEServerCallbacks {
public:
MyServerCallbacks() : BLEServerCallbacks() {
pinMode(pin, OUTPUT);
}
private:
void onConnect(BLEServer* pServer) {
digitalWrite(ledPin, HIGH); // Allume la LED lorsque le périphérique est connecté
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
digitalWrite(ledPin, LOW); // Éteint la LED lorsque le périphérique est déconnecté
deviceConnected = false;
pServer->getAdvertising()->start();
}
};
void setup() {
BLEDevice::init("ESP32 BLE Server");
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks<ledPin>());
BLEService *pService = pServer->createService(BLEUUID("4fafc201-1fb5-459e-8fcc-c5c9c331914b"));
pCharacteristic = pService->createCharacteristic(
BLEUUID("beb5483e-36e1-4688-b7f5-ea07361b26a8"),
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY
);
pCharacteristic->addDescriptor(new BLE2902());
pService->start();
BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();
}
void loop() {
delay(1000);
}
une autre petite question J-M-L, je n'arrive pas a mettre une led qui fait l'inverse de celle qui s'allume quand on se connecte (je debute dans l'arduino).
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
BLEServer *pServer;
BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
constexpr byte ledPin = 21; // Broche de la LED que vous souhaitez contrôler
constexpr byte ledPin2 = 22;
template <const byte pin>
class MyServerCallbacks : public BLEServerCallbacks {
public:
MyServerCallbacks() : BLEServerCallbacks() {
pinMode(pin, OUTPUT);
pinMode(pin2, OUTPUT);
}
private:
void onConnect(BLEServer* pServer) {
digitalWrite(ledPin, HIGH); // Allume la LED lorsque le périphérique est connecté
digitalWrite(ledPin2, LOW);
deviceConnected = true;
};
void onDisconnect(BLEServer* pServer) {
digitalWrite(ledPin, LOW); // Éteint la LED lorsque le périphérique est déconnecté
digitalWrite(ledPin2, HIGH);
deviceConnected = false;
pServer->getAdvertising()->start();
}
};
void setup() {
BLEDevice::init("ESP32 BLE Server");
pServer = BLEDevice::createServer();
pServer->setCallbacks(new MyServerCallbacks<ledPin>());
BLEService *pService = pServer->createService(BLEUUID("4fafc201-1fb5-459e-8fcc-c5c9c331914b"));
pCharacteristic = pService->createCharacteristic(
BLEUUID("beb5483e-36e1-4688-b7f5-ea07361b26a8"),
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_WRITE |
BLECharacteristic::PROPERTY_NOTIFY
);
pCharacteristic->addDescriptor(new BLE2902());
pService->start();
BLEAdvertising *pAdvertising = pServer->getAdvertising();
pAdvertising->start();
}
void loop() {
delay(1000);
}
il faut que les 2 pins soient connues dans la classe MyServerCallbacks. ce n'est pas top qu'une classe dépende de variables globales, c'est pour cela que je passais le N° de pin dans le type de MyServerCallbacks sous forme de template, mais on peut aussi les mettre en paramètres et pour faire propre rajouter un begin.
ça donnerait un truc comme cela (tapé ici par copier coller de votre code et quelques modifs donc il se peut qu'il y ait des bugs)