New Technology Design

SchreinBluetoothParser (Arduino Library)

🎯 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

  1. Téléchargez les fichiers .h et .cpp
  2. Créez un dossier SchreinBluetoothParser dans votre dossier libraries/Arduino
  3. Copiez les fichiers dans ce dossier
  4. 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.h
  • SchreinBluetoothParser.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

Description : Méthode à appeler régulièrement dans la boucle principale pour traiter les données entrantes.

void loop() {
    btParser.loop();
}

Description : Vérifie si une nouvelle trame complète a été reçue et parsée.

if (btParser.isFrameAvailable()) {
    // Trame disponible
}

Description : Récupère la valeur d’une propriété spécifique.

String valeur = btParser.getValue("TEMPERATURE", "value");

Description : Crée une commande formatée pour l’envoi.

String cmd = SchreinBluetoothParser::command("LED", "state", "ON");
// Résultat: "LED=state:ON;"

Description : Envoie une trame via le canal Bluetooth

String frame = "LED=state:ON;";
btParser.sendFrame(frame);

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

Description : Définit le timeout pour la réception des trames.

btParser.setTimeout(2000); // 2 secondes

Description : Active/désactive la validation du checksum.

btParser.enableChecksum(true); // Activation

Description : Modifie la taille du buffer de réception.

btParser.setBufferSize(512); // 512 octets


Callbacks

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

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

  1. Toujours appeler loop() dans la boucle principale
  2. Vérifier isFrameAvailable() avant de lire les valeurs
  3. Appeler resetFrame() après le traitement d’une trame
  4. Gérer les erreurs avec les callbacks appropriés
  5. Ajuster le timeout selon la fréquence des communications
  6. 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.