Bonjour à tous et toutes,
Je suis actuellement entrain de réaliser un projet de transmission de température via Bluetooth Low Energy entre un Arduino Nano 33 BLE Sense (qui joue le rôle de Serveur) et un DoIt ESP32 (qui joue le rôle de Client). Le tout se fera via des Notifications BLE.
Je rencontre actuellement un problème, lorsque j'envoie ma température (qui est une valeur float, par ex 23.42°C) de mon Nano 33 vers l'ESP32, je ne parviens pas à récupérer la véritable valeur de température...
Je me suis essentiellement basé des exemples de la librairie ArduinoBLE et ESP32-Arduino BLE pour réaliser mes codes.
Pour l'Arduino Nano33, voici mon code
#include <ArduinoBLE.h> // Bibliothèque permettant de se servir facilement du Bluetooth Low Energy
#include <Arduino_HTS221.h> // Bibliothèque permettant de se servir facilement des capteurs présents sur le nano 33 BLE Sense
const char* deviceServiceUuid = "233214e4-5c32-4b00-abaa-20bc2395dc40";
const char* deviceServiceCharacteristicUuid = "2A3C";
float oldTemp = 0;
BLEService TemperatureMeasurement(deviceServiceUuid);
BLEFloatCharacteristic TempChar(deviceServiceCharacteristicUuid, BLERead | BLENotify);
void setup() {
Serial.begin(9600);
if(!HTS.begin())
{
Serial.println("Failed to initialize the temperature sensor!");
while(1);
}
if(!BLE.begin())
{
Serial.println("Starting BLE failed!");
while(1);
}
BLE.setLocalName("TempMonitor");
BLE.setAdvertisedService(TemperatureMeasurement);
TemperatureMeasurement.addCharacteristic(TempChar);
BLE.addService(TemperatureMeasurement);
BLE.advertise();
}
void loop() {
BLEDevice central = BLE.central();
if(central)
{
Serial.println("Connected to central: ");
Serial.println(central.address());
while(central.connected())
{
if(TempChar.subscribed())
{
float temp = updateTemp();
if (TempChar.writeValue(temp));
{
Serial.println("Temp correctly sent ! Value sent :");
Serial.print(TempChar.value());
Serial.print(" °C");
delay(2000);
}
}
else
{
Serial.println("Failed to send temperature!");
return;
}
}
}
}
float updateTemp()
{
float temperature = HTS.readTemperature();
return temperature;
}
Du côté ESP32, le code est plus long et séparer dans diverses librairies perso, voici donc la partie la partie qui nous intéresse le plus. J'ai repris ce code venant des exemples BLE de l'ESP32 pour m'abonner aux notifications et donner la température.
EDIT : mauvais C/C pour l'ESP32
static void notifyCallBack(BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify)
{
Serial.print("Notify callback for characteristic ");
Serial.print(pBLERemoteCharacteristic->getUUID().toString().c_str());
Serial.print(" of data length ");
Serial.println(length);
Serial.print("data: ");
Serial.println((char*)pData);
}
Du côté ESP32, j'obtiens des symboles lorsque je print la dernière ligne. J'imagine que ça doit être juste une bêtise...
pData est donc un tableau de Byte et sa taille (length) est égal à 4 et, si je ne m'abuse, les float sont codés sur 4bytes, c'est que je dois recevoir correctement l'information, juste que je ne la traduits pas correctement ?
Il faut peut-être que je fasse une manipulation de ce tableau de byte pour obtenir ma valeur en float ?
Si quelqu'un pouvait éclairer ma lanterne...
Un tout grand merci à vous tous d'avance,
Samuel Deboit.