Connexion impossible après une déconnexion du bluetooth ble d'un ESP32

Bonjour à tous,

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 ).

Auriez-vous une idée ?

Merci a vous

postez le code et donnez des infos sur l'appareil qui se connecte / méthode de connexion

1 Like

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
}

Merci de ta reponse

dans onDisconnect() mettez

      pServer->getAdvertising()->start();

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);
}

Merci pour ton aide J-M-L ça fonctionne correctement

cool

bonne continuation

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)

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>

BLEServer *pServer;
BLECharacteristic *pCharacteristic;
bool deviceConnected = false;
constexpr byte connectedPin    = 21;
constexpr byte disconnectedPin = 22;


class MyServerCallbacks : public BLEServerCallbacks {
  public:
    MyServerCallbacks(const byte pinOn, const byte pinOff) : BLEServerCallbacks(), pinOn_(pinOn), pinOff_(pinOff) {}

    void begin() {
      pinMode(pinOn_, OUTPUT);
      pinMode(pinOff_, OUTPUT);
      digitalWrite(pinOn_, LOW);
      digitalWrite(pinOff_, HIGH);
    }

  private:
    const byte pinOn_;
    const byte pinOff_;

    void onConnect(BLEServer* pServer) {
      digitalWrite(pinOn_, HIGH);
      digitalWrite(pinOff_, LOW);
      deviceConnected = true;
    };

    void onDisconnect(BLEServer* pServer) {
      digitalWrite(pinOn_, LOW);
      digitalWrite(pinOff_, HIGH);
      deviceConnected = false;
      pServer->getAdvertising()->start();
    }
};

MyServerCallbacks serverCallback(connectedPin, disconnectedPin);

void setup() {
  BLEDevice::init("ESP32 BLE Server");
  pServer = BLEDevice::createServer();
  serverCallback.begin();
  pServer->setCallbacks(&serverCallback);
  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);
}

Merci de ton aide J-M-L
Bonne continuation a toi

est-ce que ça fonctionne ?

oui ca fonctionne correctement
merci de ton aide

cool

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.