Bonjour à tous.
J'ai un problème de transmission entre 2 modules (central = arduino R4 Wifi et peripheral = Waveshare ESP32-S3-zero).
En gros, je suis obligé d'utiliser le Bluetooth car le wifi est trop perturbé par l'environnement.
Je dois échanger :
-
central -> peripheral
3 booleéns (true/false) que le peripheral enregistre pour son programme propre -
peripheral -> central
*4 booleens (true/false) que le central renverra sur le cloud.
code central
#include <ArduinoBLE.h>
// Définir les caractéristiques pour la communication
BLEService pumpService("19b10000-e8f2-537e-4f6c-d104768a1214"); // UUID du service personnalisé
BLECharacteristic sendCharacteristic("19b10000-e8f2-537e-4f6c-d104768a1214", BLEWrite, 1); // Caractéristique pour envoyer les données (1 octet)
BLECharacteristic receiveCharacteristic("19b10000-e8f2-537e-4f6c-d104768a1214", BLERead, 1); // Caractéristique pour recevoir les données (1 octet)
bool esp32_man_start = 1;
bool esp32_time = 1;
bool esp32_man_auto = 0;
bool LSHH = false;
bool LSH = false;
bool LSL = false;
bool pump = false;
void setup()
{
Serial.begin(115200);
Serial.println("Arduino R4 Démarré");
// Initialiser le BLE
if (!BLE.begin())
{
Serial.println("Échec de l'initialisation du BLE !");
while (1);
}
BLE.setLocalName("Central_Device"); // Nom du périphérique BLE
BLE.setAdvertisedService(pumpService); // Annonce le service
pumpService.addCharacteristic(sendCharacteristic); //ajouter la caractéristique send (central->device)
pumpService.addCharacteristic(receiveCharacteristic); //ajouter la caractéristique receive (device->peripheral)
BLE.addService(pumpService);
BLE.advertise(); // Commence la publicité pour que le périphérique puisse se connecter
Serial.println("En attente de connexion...");
BLE.scanForUuid("19b10000-e8f2-537e-4f6c-d104768a1214");
}
void loop()
{
// Vérifier si un périphérique s'est connecté
BLEDevice peripheral = BLE.available();
if (peripheral)
{
Serial.print("Connecté à ");
Serial.println(peripheral.address());
Serial.println(peripheral.localName());
BLE.stopScan();
if(peripheral.connect())
{
byte data = 0;
data |= esp32_man_start; // Placer man_start dans le bit 0
data |= (esp32_time << 1); // Placer time dans le bit 1
data |= (esp32_man_auto << 2); // Placer man_auto dans le bit 2
sendCharacteristic.writeValue(data); // Envoie des données
Serial.print("Envoyé: ");
Serial.println(data,BIN); // Affiche les données envoyées en binaire
// Attendre une seconde avant d'envoyer de nouvelles données
delay(1000);
const uint8_t *received_Data = receiveCharacteristic.value();
byte receivedData = *received_Data;
LSHH = (receivedData >> 3);
LSH = (receivedData >> 2);
LSL = (receivedData >> 1);
pump = receivedData;
Serial.print("Reçu: LSHH=");
Serial.print(LSHH);
Serial.print(" LSH=");
Serial.print(LSH);
Serial.print(" LSL=");
Serial.print(LSL);
Serial.print(" pump=");
Serial.println(pump);
}
BLE.disconnect();
Serial.print("Déconnecté de ");
Serial.println(peripheral.address());
}
delay(5000);
BLE.scanForUuid("19b10000-e8f2-537e-4f6c-d104768a1214");
}
code du peripheral
#include <ArduinoBLE.h>
// Définir les caractéristiques pour la communication
BLEService pumpService("19b10000-e8f2-537e-4f6c-d104768a1214"); // UUID du service personnalisé
BLECharacteristic sendCharacteristic("19b10000-e8f2-537e-4f6c-d104768a1214", BLERead, 1); // Caractéristique pour envoyer les données (1 octet)
BLECharacteristic receiveCharacteristic("19b10000-e8f2-537e-4f6c-d104768a1214", BLEWrite, 1); // Caractéristique pour recevoir les données (1 octet)
// Variables pour stocker les valeurs booléennes reçues
bool man_auto = false;
bool bitTime = false;
bool man_start = false;
//variables pour stocker les valeurs booléennes à envoyer
bool LSHH = false;
bool LSH = false;
bool LSL = false;
bool pump = false;
/* Définition et type des IO */
#define readLSL 1
#define readLSH 2
#define readLSHH 3
#define Pump 4
#define led 21
void setup() {
Serial.begin(115200);
/*déclaration des pins*/
pinMode(readLSL, INPUT_PULLUP);
pinMode(readLSH, INPUT_PULLUP);
pinMode(readLSHH, INPUT_PULLUP);
pinMode(Pump, OUTPUT);
digitalWrite(Pump,LOW);
// Initialiser le BLE
if (!BLE.begin()) {
Serial.println("Échec de l'initialisation du BLE !");
while (1);
}
BLE.setLocalName("Peripheral_Device"); // Nom du périphérique BLE
BLE.setAdvertisedService(pumpService); // Annonce le service
pumpService.addCharacteristic(sendCharacteristic);
pumpService.addCharacteristic(receiveCharacteristic);
BLE.addService(pumpService);
BLE.advertise(); // Commence la publicité pour que le périphérique central puisse se connecter
Serial.println("En attente de connexion...");
BLE.scanForUuid("19b10000-e8f2-537e-4f6c-d104768a1214");
delay(10000);
}
void loop()
{
BLEDevice central = BLE.available(); // Vérifier si un périphérique s'est connecté
if (central)
{
Serial.print("Connecté à ");
Serial.println(central.address());
Serial.println(central.localName());
BLE.stopScan();
if(central.connect())
{
const uint8_t* received_Data = sendCharacteristic.value();
byte receivedData = *received_Data;
man_auto = (receivedData >> 2);
bitTime = (receivedData >> 1);
man_start = receivedData;
Serial.println(receivedData,BIN);
Serial.print("Reçu: man_auto=");
Serial.print(man_auto);
Serial.print(" time=");
Serial.print(bitTime);
Serial.print(" man_start=");
Serial.println(man_start);
/*Encoder les valeurs booléennes dans un byte (1 octet)*/
byte data = 0;
data |= (LSHH << 3); // Placer LSHH dans le bit 3 (exemple de valeurs envoyées)
data |= (LSH << 2); // Placer LSH dans le bit 2
data |= (LSL << 1); // Placer LSL dans le bit 1
data |= Pump; // Placer pump dans le bit 0
receiveCharacteristic.writeValue(data); // Envoie des données
Serial.print("Envoyé: LSHH=");
Serial.print((data >> 3));
Serial.print(" LSH=");
Serial.print((data >> 2));
Serial.print(" LSL=");
Serial.print((data >> 1));
Serial.print(" pump=");
Serial.println(data);
}
}
BLE.disconnect();
delay(10000);
BLE.scanForUuid("19b10000-e8f2-537e-4f6c-d104768a1214");
}
En résumé, lorsque j'envoie 7 du central je recois 163 sur le peripheral et je remarque que sans reset, la valeur lue par le peripheral est toujours la même.
Quelqu'un peut il m'aiguiller sur cette bibliothèque ?