🎯 Introduction
La librairie SchreinBluetoothParser est un analyseur de trames Bluetooth robuste pour Arduino, spécialement conçu pour parser des messages au format <[controlName|propertyName|value]&checksum> ou <[controlName|propertyName|value]> via des modules Bluetooth (HC-05, HC-06, ESP32 Bluetooth, etc.). Elle offre une gestion d’erreurs avancée, des callbacks et une validation de checksum.

Installation de la Bibliothèque
- Téléchargez les fichiers
.het.cpp - Créez un dossier
SchreinBluetoothParserdans votre dossierlibraries/Arduino - Copiez les fichiers dans ce dossier
- Redémarrez l’IDE Arduino
Format de trame supporté
<[controlName|propertyName|value]&checksum> ou
<[controlName|propertyName|value]>Exemple : <[LED|state|ON]&04>, <[LED|state|ON]>
📥 Installation
Fichiers requis
SchreinBluetoothParser.hSchreinBluetoothParser.cpp
Inclusion
#include "SchreinBluetoothParser.h"🔧 Utilisation de base
Initialisation
// Avec Serial (Bluetooth module connecté via Serial)
SchreinBluetoothParser btParser(Serial);
// Avec SoftwareSerial
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(10, 11); // RX, TX
SchreinBluetoothParser btParser(BTSerial);Boucle principale
void loop() {
btParser.loop(); // À appeler régulièrement
if (btParser.isFrameAvailable()) {
String value = btParser.getValue("controlName", "propertyName");
if (value != "") {
// Traiter la valeur reçue
Serial.println("Valeur reçue: " + value);
}
btParser.resetFrame(); // Préparer pour la prochaine trame
}
}📚 API détaillée
Méthodes principales
loop()
Description : Méthode à appeler régulièrement dans la boucle principale pour traiter les données entrantes.
void loop() {
btParser.loop();
}isFrameAvailable()
Description : Vérifie si une nouvelle trame complète a été reçue et parsée.
if (btParser.isFrameAvailable()) {
// Trame disponible
}getValue(controlName, key)
Description : Récupère la valeur d’une propriété spécifique.
String valeur = btParser.getValue("TEMPERATURE", "value");command(controlName, propertyName, value)
Description : Crée une commande formatée pour l’envoi.
String cmd = SchreinBluetoothParser::command("LED", "state", "ON");
// Résultat: "LED=state:ON;"sendFrame(frame)
Description : Envoie une trame via le canal Bluetooth
String frame = "LED=state:ON;";
btParser.sendFrame(frame);sendFrames(frames[], count)
Description : Envoie plusieurs trames en une seule fois.
String frames[] = {
SchreinBluetoothParser::command("LED1", "state", "ON"),
SchreinBluetoothParser::command("LED2", "state", "OFF")
};
btParser.sendFrames(frames, 2);Méthodes de configuration
setTimeout(timeoutMs)
Description : Définit le timeout pour la réception des trames.
btParser.setTimeout(2000); // 2 secondesenableChecksum(enable)
Description : Active/désactive la validation du checksum.
btParser.enableChecksum(true); // ActivationsetBufferSize(size)
Description : Modifie la taille du buffer de réception.
btParser.setBufferSize(512); // 512 octetsCallbacks
Gestion des erreurs
btParser.onError([](String error) {
Serial.println("Erreur: " + error);
});Données reçues
btParser.onDataReceived([](String data) {
Serial.println("Données brutes: " + data);
});Trame parsée
btParser.onFrameParsed([](String controlName, String key, String value) {
Serial.println(controlName + " - " + key + " : " + value);
});Méthodes de debug
debugOutput(mode, asReturn)
Description : Affiche des informations de debug.
// Affiche dans le stream Bluetooth
btParser.debugOutput("receiveMessage");
// Retourne comme String
String debugInfo = btParser.debugOutput("parsedFrame", true);Modes disponibles:
"receiveMessage": Message brut reçu"parsedFrame": Trame parsée (controlName, key, value)"completeFrame": Trame complète"error": Dernière erreur"reset": Réinitialise l’état de debug
💡 Exemples complets
Exemple 1: Communication simple
#include "SchreinBluetoothParser.h"
SchreinBluetoothParser btParser(Serial);
void setup() {
Serial.begin(9600);
// Configuration
btParser.setTimeout(1000);
btParser.enableChecksum(true);
// Callbacks
btParser.onError([](String error) {
Serial.println("ERREUR: " + error);
});
}
void loop() {
btParser.loop();
if (btParser.isFrameAvailable()) {
String temperature = btParser.getValue("SENSOR", "temperature");
String humidity = btParser.getValue("SENSOR", "humidity");
if (temperature != "") {
Serial.println("Température: " + temperature);
}
if (humidity != "") {
Serial.println("Humidité: " + humidity);
}
btParser.resetFrame();
}
}Exemple 2: Envoi de commandes
#include "SchreinBluetoothParser.h"
SchreinBluetoothParser btParser(Serial);
void setup() {
Serial.begin(9600);
}
void loop() {
// Envoi simple
String ledCommand = SchreinBluetoothParser::command("LED", "state", "ON");
btParser.sendFrame(ledCommand);
delay(1000);
// Envoi multiple
String commands[] = {
SchreinBluetoothParser::command("LED1", "state", "ON"),
SchreinBluetoothParser::command("LED2", "state", "OFF"),
SchreinBluetoothParser::command("MOTOR", "speed", "150")
};
btParser.sendFrames(commands, 3);
delay(5000);
}Exemple 3: Utilisation avec callbacks
#include "SchreinBluetoothParser.h"
SchreinBluetoothParser btParser(Serial);
void setup() {
Serial.begin(9600);
// Callback pour les données brutes
btParser.onDataReceived([](String data) {
Serial.println("📨 Reçu: " + data);
});
// Callback pour les trames parsées
btParser.onFrameParsed([](String controlName, String key, String value) {
Serial.println("✅ Parsé: " + controlName + " | " + key + " | " + value);
// Actions spécifiques selon le controlName
if (controlName == "LED" && key == "state") {
if (value == "ON") {
// Allumer LED
} else {
// Éteindre LED
}
}
});
// Callback d'erreur
btParser.onError([](String error) {
Serial.println("❌ Erreur: " + error);
});
}
void loop() {
btParser.loop();
}🚨 Gestion des erreurs
Codes d’erreur
enum class ErrorCode {
NO_ERROR, // Aucune erreur
BUFFER_OVERFLOW, // Buffer de réception plein
INVALID_FRAME, // Format de trame invalide
TIMEOUT, // Timeout de réception
CHECKSUM_ERROR // Erreur de checksum
};Récupération des erreurs
// Vérifier la dernière erreur
SchreinBluetoothParser::ErrorCode error = btParser.getLastError();
if (error != SchreinBluetoothParser::ErrorCode::NO_ERROR) {
String errorMsg = btParser.getLastErrorMessage();
Serial.println("Erreur: " + String(static_cast<int>(error)) + " - " + errorMsg);
// Effacer l'erreur
btParser.clearError();
}⚙️ Configuration avancée
Optimisation des performances
void setup() {
// Réduire la taille du buffer si les trames sont courtes
btParser.setBufferSize(128);
// Ajuster le timeout selon les besoins
btParser.setTimeout(500); // 500ms
// Désactiver le checksum si non nécessaire (gain de performance)
btParser.enableChecksum(false);
}Gestion de la mémoire
La librairie utilise une allocation dynamique pour le buffer. Pensez à ajuster la taille selon vos besoins mémoire :
// Pour des applications avec contraintes mémoire
btParser.setBufferSize(64); // Buffer minimal
// Pour des applications avec de longues trames
btParser.setBufferSize(1024); // Buffer large🔍 Debug avancé
Mode debug complet
void debugBluetooth() {
// Messages reçus
Serial.println(btParser.debugOutput("receiveMessage", true));
// Trame parsée
Serial.println(btParser.debugOutput("parsedFrame", true));
// Erreurs
Serial.println(btParser.debugOutput("error", true));
// Réinitialiser le debug
btParser.debugOutput("reset");
}📝 Bonnes pratiques
- Toujours appeler
loop()dans la boucle principale - Vérifier
isFrameAvailable()avant de lire les valeurs - Appeler
resetFrame()après le traitement d’une trame - Gérer les erreurs avec les callbacks appropriés
- Ajuster le timeout selon la fréquence des communications
- Utiliser les checksums dans les environnements bruités
Cette documentation couvre l’ensemble des fonctionnalités de la librairie SchreinBluetoothParser. La structure modulaire et les callbacks permettent une intégration flexible dans divers projets Arduino.