BLE Syntaxe entre différents onglets

Hello la communauté, suis toujours dans mes tracas en BLE en utilisant un ESP32-S3 Super mini.

c’est incroyable comment on peut créer des circuits aussi petit, bref. Je reprends un code que j’ai fais il y a bien longtemps et pour être franc avec le recul c’était vraiment merdique (comme les premières bases dans Satisfactory) du pur copier-coller spaghetti… avec le temps quelques livres, beaucoup de vidéo et des forums (où je reste bloquer à lire des passages passionnants sur les pointeurs sans trouver réponse à mes questions) ça s’améliore. Je n’ai pas de formation dite académique mais sans vouloir coder un OS j’arrive à faire de petits projets. Donc je m’efforce à plus de rigueur, le code est plus lisible et enfin j’utilise les ONGLETS (début des problèmes), bien faire les fichier .h et les .cpp sans oublier de faire les #include mais avec des variables utilisées un peu partout qui ne peuvent pas être déclarées plusieurs fois (c’est l’erreur qui revenait tout le temps), l’utilisation des extern mais pas plusieurs fois sinon il faut que la variable soit volatile pouquoi ??? ne pouvant/ne devant pas déclarer toutes les variables en tant que globales… ça à été très laborieux de nettoyer le croquis en question? maintenant j’ai plein d’onglets (Sensor_A, Sensor_B, GFX, Config, Ino et BLE), c’est pour les fonctions BLE (les callbacks, characteristics, etc.) où je n’arrive pas à faire référence pour les utiliser d’un onglet à l’autre; la plus part des exemples, et tutos relatent surtout les cas usuels en prenant l’exemple de l’accès d’une variable, d’une fonction, etc. pas vraiment de ce cas précis des callbacks, je me suis résigné afin de continuer mon projet de mettre toute la partie BLE dans le .ino

pour la création du serveur BLE sur l’ESP32 la syntaxe est déjà velue avec les flèches et double points, quelqu’un aurait des infos sur comment accéder à cette class et ses éléments quand il sont dans un autre onglet depuis le .ino, n’hésitez pas à me dire que c’est simple et que je suis qu’un novice tant que l’on me montre comment faire oui l’important c’est d’apprendre. si besoin je mettrais un bout du code.

merci la communauté.

vous ne faites sans doute pas encore tout bien alors...

cherchez vous à mettre en callback une méthode d'une instance particulière ?

merci de me consacrer un peu de temps… voilà comme expliquer je mets de l’ordre avec les onglets (ça fait son effet et quand je debug un truc qui marche pas je regard au bon endroit); l’histoire de la variable en volatile c’est surement quelques chose que je n’ai pas bien fait (mais bon pour l’instant en faisant ça le problème de la variable est résolu, je devrais rectifier plus tard)…

pour les callbacks et le BLE dans le Bluetooth_BLE.cpp j’ai vraiment tout ce qui est de plus classique dans les exemples de mise en place d’un serveur BLE:

l'onglet Bluetooth_BLE.h

#ifndef _Bluetooth_BLE_H_
#define _Bluetooth_BLE_H_

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

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

void BLEconnection();
void sendSMSAlerte();

#endif

l'onglet Bluetooth_BLE.cpp

#include "BLEServer.h"
#include "BLECharacteristic.h"
#include "BLEDevice.h"
#include "Arduino.h"
#include "WString.h"
#include "Bluetooth_BLE.h"

BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic = NULL;
BLEDescriptor *pDescr;
BLE2902 *pBLE2902;

bool deviceConnected = false;
bool oldDeviceConnected = false;

suivi de ce qui n’est pas ni dans le setup ni dans le loop

l'onglet Bluetooth_BLE.cpp (suite)

class MyServerCallbacks: public BLEServerCallbacks {
    void onConnect(BLEServer* pServer) {
      deviceConnected = true;
      Serial.println("Connected !!!");
    };
    void onDisconnect(BLEServer* pServer) {
      deviceConnected = false;
      Serial.println("disconnected ...");
    }
};

ce qui se trouvait dans le setup dans les exemples que j’ai vu, je l’ai mis dans une fonction BLEconnection que j’appel depuis le .ino (si j’ai bien compris à la compilation tous les onglets vont être fusionnés donc si cette partie se trouve initialement dans le setup et que maintenant je l’appel toujours depuis le setup, pas d’erreur et ça fait propre)…

l'onglet Bluetooth_BLE.cpp (suite)

void BLEconnection(){  //appeler depuis le setup du .ino
  // Create the BLE Device
  BLEDevice::init("ESP32_BLE_TEST");

  // Create the BLE Server
  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,
    BLECharacteristic::PROPERTY_NOTIFY);

  // Create a BLE Descriptor

  pDescr = new BLEDescriptor((uint16_t)0x2901);
  pDescr->setValue("Type of Alert Code");
  pCharacteristic->addDescriptor(pDescr);

  pBLE2902 = new BLE2902();
  pBLE2902->setNotifications(true);
  pCharacteristic->addDescriptor(pBLE2902);

  // Start the service
  pService->start();

  // Start advertising
  BLEAdvertising* pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(false);
  pAdvertising->setMinPreferred(0x0);  // set value to 0x00 to not advertise this parameter
  BLEDevice::startAdvertising();
  Serial.println("Waiting a client connection to notify...");

ensuite le Bluetooth_BLE.h Bluetooth_BLE.cpp se termine par une fonction sendSMSAlerte() qui est appeler par le .ino à l’intérieur du loop()

    
 void sendSMSAlert(int code){   // appeler depuis le loop du .ino
     if (deviceConnected) {
        pCharacteristic->setValue(code);  // envoie le nombre qui défini l'alerte
        pCharacteristic->notify();        // 18 pompier / 17 police / 15 samu
        delay(1000);                      
     }
 }

en l’état ça marche pas, donc j’ai pris toute la partie BLE pour le mettre dans le .ino, en faisant cela ça fonctionne et je reçois sur le téléphone le numéro correspondant (ça communique).

suis persuadé que cela viens de l’accès/déclaration aux varaiables, callbacks et à la class qui me fais penser à un problème de syntaxe bon en même temps j’ai pas l’expertise… en espérant avoir été clair pour exposer mon problème.

c’est pourquoi je post ici (tout en continuant à chercher)…

➜ il ne faut pas. quand vous allez inclure le .h dans le .ino ça va définir la fonction puis avec le .cpp ça va la redéfinir

On ne met pas de code dans un .h.

le .h devrait avoir aussi la définition du prototype de cette fonction (comme les 2 autres)

void sendSMSAlert(int code);

et l'implémentation devrait être dans le .cpp

vous avez mis la fonction dans le .h ??

non la fonction est bien dans le .cpp, c’est moi qui a mal recopier mon explication (le .h c’est uniquement le premier paragraphe)… je corrige tout de suite…

Faudrait voir tout le code … (ou au moins comment vous appelez tout cela dans le setup et la dynamique du code)

Grand merci pour votre aide, voici le code (pas tout le code le .ino et le BLE c’est là que ça coince sur les autres onglets les requêtes ne renvoient pas de problèmes de compilation).

avant tout je me pose deux questions:

→ est ce que l’IDE peut lui même modifier le croquis? à force de tout nettoyer et de mettre au propre je remarque qu’il y a des #include qui sont “apparut” alors que je ne me rappel pas les avoir ajoutés…

→ que pensez vous de l’ouvrage “La boite à outils Arduino” ISBN 978-2-10-080764-2…

bref voici le fichier:

le fichier SL_002_BLE_draft.ino
 
/**
***   @Filename : SL_002_BLE_draft
***   @Brief    : 
***               
***   @Auteur   : Luan SALJA
***   @Date     : 
**/



//  -->   include libraries / librairies incluses

#include <Wire.h>
#include <FastLED.h>
#include <OneButton.h>
#include "custom.h"
#include "Graphics_GFX.h"
#include "Light_Sensor.h"
#include "Axis_Sensor.h"
#include "Bluetooth_BLE.h"



int code;
float lux = 0.0;
float threshold = 50.0;
boolean alarmEvent = false;
bool deviceConnected = false;
bool oldDeviceConnected = false;
BLEServer* pServer = NULL;
BLECharacteristic* pCharacteristic;
BLEDescriptor* pDescr;
BLE2902* pBLE2902;

CRGB leds[NUM_LEDS];

OneButton bouton(BUTTON_PIN);


//  -->   defines and constants / défintions et constantes

//  -->   global variables / variables globales

//  -->   user defined functions / fonctions définies par l'utilisateur
void debugSerialMessage() {
  Serial.printf("AutoMode = %d | Light = %d | Lux = %.2f | Fall Alarm = %d | Code = %d\n", HSState.autoMode, HSState.lightState, lux, fallC.fall, code);
}


void fonctionSimpleClick() {
  HSState.lightState = !HSState.lightState;
  HSState.autoMode = false;
  fallC.fall = false;
  code = 0;
  HSState.connected = true;
  debugSerialMessage();
}
void fonctionDoubleClick() {
  HSState.autoMode = !HSState.autoMode;
  debugSerialMessage();
}
void clickLong() {
  fallC.fall = true;
  HSState.connected = true;
  code = 17;
  debugSerialMessage();
}

//  -->   setup / setup
void setup() {
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  FastLED.setBrightness(128);
  leds[0] = CRGB::Red;
  FastLED.show();

  bouton.setup(3, INPUT_PULLUP, true);
  bouton.attachClick(fonctionSimpleClick);
  bouton.attachDoubleClick(fonctionDoubleClick);
  bouton.attachLongPressStop(clickLong);

  Serial.begin(115200);
  Wire.begin(I2C_SDA, I2C_SCL);  //(I2C_SDA, I2C_SCL) Bus I2C
  pinMode(LIGHT_PIN, OUTPUT);
  pinMode(WAKEUP_PIN, INPUT_PULLUP);
  esp_sleep_enable_ext0_wakeup((gpio_num_t)WAKEUP_PIN, RISING);
  pinMode(BUTTON_PIN, INPUT);
  //attachInterrupt(BUTTON_PIN, buttonAction, CHANGE);

  //Starting Sensors...
  lightSensorInit();
  mpuSensorReset();
  mpuSensorInit();
  mpuSensorSettings();

  //Checking Connectivity...
  BLEconnection();
  //Starting Display...

  //Initial Settings
  HSState.autoMode = false;
  HSState.lightState = false;
  HSState.buttonState = false;

  lux = lightSensorRead();
  debugSerialMessage();
}

//  -->   loop / loop
void loop() {

  //BLE
  if (!deviceConnected && oldDeviceConnected) {  // disconnecting
    delay(500);                                  // give the bluetooth stack the chance to get things ready
    BLEDevice::startAdvertising();               // pServer->startAdvertising();  // restart advertising
    Serial.println("start advertising");
    oldDeviceConnected = deviceConnected;
  }

  if (deviceConnected && !oldDeviceConnected) {  // connecting
    // do stuff here on connecting
    oldDeviceConnected = deviceConnected;
  }


  // Check Sensors...

  // Light Mode
  if (HSState.autoMode == true) {  // Auto ON
    leds[0] = CRGB::Red;
    FastLED.show();
    lux = lightSensorRead();
    if (lux < threshold) {
      HSState.lightState = true;
    } else if (lux > threshold) {
      HSState.lightState = false;
    }
  } else if (HSState.autoMode == false) {  // Auto OFF
    leds[0] = CRGB::Blue;
    FastLED.show();  // send Manual statements...
  }

  // Light State update
  if (HSState.lightState == true) {
    digitalWrite(LIGHT_PIN, HIGH);
    leds[0] = CRGB::Green;
    FastLED.show();  // Light ON
  } else if (HSState.lightState == false) {
    digitalWrite(LIGHT_PIN, LOW);
  }

  // MPU
  mpuRead();  // Readings

  bouton.tick();

if ((HSState.connected == true) || (fallC.fall == true)){
  sendSMSAlert(code);
}


  // Check Button...
  bouton.tick();
}

et les deux onglets de BLE

le Bluetooth_BLE.h

#ifndef _Bluetooth_BLE_H_
#define _Bluetooth_BLE_H_

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

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

void BLEconnection();
void sendSMSAlert();

#endif
le Bluetooth_BLE.cpp

#include "BLEServer.h"
#include "BLECharacteristic.h"
#include "BLEDevice.h"
#include "Arduino.h"
#include "WString.h"
#include "Bluetooth_BLE.h"

extern BLEServer* pServer;
extern BLECharacteristic* pCharacteristic;
extern BLEDescriptor* pDescr;
extern BLE2902* pBLE2902;

//extern boolean fallEvent;
extern bool deviceConnected;
extern bool oldDeviceConnected;
uint32_t value = 0;

class MyServerCallbacks : public BLEServerCallbacks {
  void onConnect(BLEServer* pServer) {
    deviceConnected = true;
    Serial.println("Connected !!!");
  };

  void onDisconnect(BLEServer* pServer) {
    deviceConnected = false;
    Serial.println("disconnected ...");
  }
};

void BLEconnection(){
  // Create the BLE Device
  BLEDevice::init("ESP32_BLE_TEST");

  // Create the BLE Server
  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,
    BLECharacteristic::PROPERTY_NOTIFY);

  // Create a BLE Descriptor

  pDescr = new BLEDescriptor((uint16_t)0x2901);
  pDescr->setValue("Type of Alert Code");
  pCharacteristic->addDescriptor(pDescr);

  pBLE2902 = new BLE2902();
  pBLE2902->setNotifications(true);
  pCharacteristic->addDescriptor(pBLE2902);

  // Start the service
  pService->start();

  // Start advertising
  BLEAdvertising* pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(false);
  pAdvertising->setMinPreferred(0x0);  // set value to 0x00 to not advertise this parameter
  BLEDevice::startAdvertising();
  Serial.println("Waiting a client connection to notify...");
}

void sendSMSAlert(int code){   // appeler depuis le loop du .ino
     if (deviceConnected) {
        pCharacteristic->setValue(code);  // envoie le nombre qui défini l'alerte
        pCharacteristic->notify();        // 18 pompier / 17 police / 15 samu
        delay(1000);                      
     }
}

voici aussi l’erreur de compilation:

C:\Users\luan\Documents\Arduino\SL_BLE_002_draft\SL_BLE_002_draft.ino: In function 'void loop()':
C:\Users\luan\Documents\Arduino\SL_BLE_002_draft\SL_BLE_002_draft.ino:163:15: error: too many arguments to function 'void sendSMSAlert()'
  163 |   sendSMSAlert(code);
      |   ~~~~~~~~~~~~^~~~~~
In file included from C:\Users\luan\Documents\Arduino\SL_BLE_002_draft\SL_BLE_002_draft.ino:26:
C:\Users\luan\Documents\Arduino\SL_BLE_002_draft\Bluetooth_BLE.h:13:6: note: declared here
   13 | void sendSMSAlert();
      |      ^~~~~~~~~~~~
Utilisation de la bibliothèque Wire version 3.2.1 dans le dossier: C:\Users\luan\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.2.1\libraries\Wire 
Utilisation de la bibliothèque FastLED version 3.10.3 dans le dossier: C:\Users\luan\Documents\Arduino\libraries\FastLED 
Utilisation de la bibliothèque OneButton version 2.6.1 dans le dossier: C:\Users\luan\Documents\Arduino\libraries\OneButton 
Utilisation de la bibliothèque Adafruit GFX Library version 1.12.3 dans le dossier: C:\Users\luan\Documents\Arduino\libraries\Adafruit_GFX_Library 
Utilisation de la bibliothèque Adafruit BusIO version 1.17.4 dans le dossier: C:\Users\luan\Documents\Arduino\libraries\Adafruit_BusIO 
Utilisation de la bibliothèque SPI version 3.2.1 dans le dossier: C:\Users\luan\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.2.1\libraries\SPI 
Utilisation de la bibliothèque GxEPD2 version 1.6.4 dans le dossier: C:\Users\luan\Documents\Arduino\libraries\GxEPD2 
Utilisation de la bibliothèque BH1750 version 1.3.0 dans le dossier: C:\Users\luan\Documents\Arduino\libraries\BH1750 
Utilisation de la bibliothèque Adafruit MPU6050 version 2.2.6 dans le dossier: C:\Users\luan\Documents\Arduino\libraries\Adafruit_MPU6050 
Utilisation de la bibliothèque Adafruit Unified Sensor version 1.1.15 dans le dossier: C:\Users\luan\Documents\Arduino\libraries\Adafruit_Unified_Sensor 
Utilisation de la bibliothèque BLE version 3.2.1 dans le dossier: C:\Users\luan\AppData\Local\Arduino15\packages\esp32\hardware\esp32\3.2.1\libraries\BLE 
exit status 1

Compilation error: too many arguments to function 'void sendSMSAlert()'

les variables dans la fonction sendSMSAlert() n’existent que dans la fonction, c’est ça qui me fait dire que c’est un problème d’accès à ces variables et vu que je n’ai pas trouver le moyen de l’écrire…

edit: j’ai remplacer la gestion du pushButton par OneButton c’est super…

pas votre code source non. Il injecte du code dans la version qu'il va compiler quand il regroupe les .ino, ajoute les prototypes de fonctions, etc mais ça ne touche pas ce que vous avez écrit et sauvegardé.

Je ne le connais pas donc difficile de commenter.


pour votre code

dans le .h vous définissez le prototype comme étant

donc c'est ce que le .ino connait puisque vous importez ce .h mais dans le .cpp vous définissez une fonction avec le même nom qui a un paramètre obligatoire (sans valeur par défaut)

donc quand vous faites

le compilateur ne trouve pas cette fameuse fonction.

➜ dans le .h il faut déclarer

void sendSMSAlert(int);

ou on peut aussi nommer le paramètre (int code ) n’est utile que pour la lisibilité ou la documentation

void sendSMSAlert(int code);

➜ le compilateur a besoin du prototype complet de la fonction sinon à l'édition de lien ou à la compilation du ino il va chercher une fonction sendSMSAlert qui ne prend pas de paramètres et vous n'en avez pas.


ça marche !!! … comment ai je pu être autant boulet et ne pas voir cette erreur pourtant sous mes yeux… celle là je ne risque pas de l’oublier… un grand MERCI !!! moi qui pensais que ça venait de ce que je ne comprenais pas complétement à savoir les callbacks et characteritics…

Cool !

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