New Technology Design

SchreinBluetoothManager (Arduino Library)

🚀 Introduction

SchreinBluetoothManager est une bibliothèque Arduino avancée pour la gestion des modules Bluetooth HC-05 et HC-06. Elle offre une interface unifiée avec support complet des fonctionnalités spécifiques à chaque module.


Compatibilité

  • HC-05 : Mode client et serveur, commandes AT complètes
  • HC-06 : Mode serveur uniquement, commandes AT basiques

⭐ Fonctionnalités

  • Gestion unifiée HC-05/HC-06
  • Mode client et serveur (HC-05 seulement)
  • Système de retry automatique avec backoff exponentiel
  • Callbacks pour tous les événements
  • Gestion d’erreurs robuste
  • Configuration facile via méthodes dédiées

🔧 Installation

1. Inclusion des fichiers

#include "SchreinBluetoothManager.h"


2. Déclaration du SoftwareSerial

SoftwareSerial btSerial(10, 11); // RX, TX


3. Création de l’instance

SchreinBluetoothManager btManager(btSerial, SchreinBluetoothManager::Type::HC05, 9);


🏁 Initialisation

Configuration de base

void setup() {
  Serial.begin(9600);
  btSerial.begin(9600);
  
  // Configuration du module
  if (btManager.beginATMode()) {
    Serial.println("Mode AT activé avec succès");
    
    // Récupération des informations du module
    String mac = btManager.getMacAddress();
    String name = btManager.getName();
    String pin = btManager.getPin();
    
    Serial.println("MAC: " + mac);
    Serial.println("Nom: " + name);
    Serial.println("PIN: " + pin);
    
    btManager.endATMode();
  }
}


⚙️ Configuration des Modules

Mode Serveur (Recommandé pour HC-06)

bool setupServerMode() {
  if (btManager.beginATMode()) {
    bool success = btManager.configureServerMode() &&
                   btManager.configureServerIdentity("MonServeur", "1234") &&
                   btManager.configureServerCommunication(9600);
    
    btManager.endATMode();
    btManager.setMode(SchreinBluetoothManager::Mode::SERVER);
    
    return success;
  }
  return false;
}


Mode Client (HC-05 seulement)

bool setupClientMode(String serverMac) {
  if (!btManager.supportsClientMode()) {
    Serial.println("Module ne supporte pas le mode client");
    return false;
  }
  
  if (btManager.beginATMode()) {
    bool success = btManager.configureClientMode(serverMac) &&
                   btManager.configureClientIdentity("1234") &&
                   btManager.configureClientCommunication(9600);
    
    btManager.endATMode();
    btManager.setMode(SchreinBluetoothManager::Mode::CLIENT);
    
    return success;
  }
  return false;
}


🔌 Gestion des Connexions

Connexion en mode client

void connectToDevice(String macAddress) {
  // Avec retry automatique
  btManager.configureRetry({
    .enableConnectionRetry = true,
    .maxConnectionRetries = 5,
    .connectionRetryDelay = 5000
  });
  
  if (btManager.connect(macAddress)) {
    Serial.println("Connexion initiée");
  }
}


Déconnexion

void disconnectDevice() {
  if (btManager.disconnect()) {
    Serial.println("Déconnecté avec succès");
  }
}


Vérification de l’état

void checkStatus() {
  if (btManager.isConnected()) {
    Serial.println("Connecté à: " + btManager.getConnectedDeviceAddress());
  } else {
    Serial.println("Non connecté");
    Serial.println("État: " + String((int)btManager.getConnectionState()));
  }
}


📨 Envoi et Réception de Données

Envoi de données

void sendData(String data) {
  // Envoi simple
  if (btManager.sendRawData(data)) {
    Serial.println("Données envoyées");
  }
  
  // Envoi avec retry
  if (btManager.sendRawDataWithRetry(data)) {
    Serial.println("Données envoyées avec retry");
  }
}

Réception de données

// Dans setup()
btManager.onDataReceived([](String data) {
  Serial.println("Données reçues: " + data);
});

// Dans loop()
btManager.loop();


🔄 Système de Retry

Configuration avancée du retry

void setupRetrySystem() {
  SchreinBluetoothManager::RetryConfig config = {
    .enableConnectionRetry = true,
    .enableSendRetry = true,
    .enableATCommandRetry = true,
    .maxConnectionRetries = 5,
    .maxSendRetries = 3,
    .maxATRetries = 5,
    .connectionRetryDelay = 5000,
    .sendRetryDelay = 1000,
    .atRetryDelay = 2000,
    .useExponentialBackoff = true,
    .backoffMultiplier = 2.0,
    .maxBackoffDelay = 30000
  };
  
  btManager.configureRetry(config);
}


Monitoring du retry

void monitorRetry() {
  if (btManager.isRetrying()) {
    Serial.println("Retry en cours...");
    Serial.println("Tentative: " + String(btManager.getCurrentRetryAttempt()) + 
                  "/" + String(btManager.getMaxRetryAttempts()));
    Serial.println("Prochaine tentative dans: " + 
                  String(btManager.getNextRetryTime() - millis()) + "ms");
    
    Serial.println(btManager.getRetryStatus());
  }
}


📞 Callbacks et Événements

Configuration complète des callbacks

void setupCallbacks() {
  // Connexion réussie
  btManager.onConnect([](String message) {
    Serial.println("✅ " + message);
  });
  
  // Déconnexion
  btManager.onDisconnect([](String message) {
    Serial.println("❌ " + message);
  });
  
  // Erreur
  btManager.onError([](String error) {
    Serial.println("💥 Erreur: " + error);
  });
  
  // Succès d'opération
  btManager.onSuccess([](String message) {
    Serial.println("✅ " + message);
  });
  
  // Données reçues
  btManager.onDataReceived([](String data) {
    Serial.println("📨 Données: " + data);
  });
  
  // Tentative de retry
  btManager.onRetryAttempt([](uint8_t attempt, uint8_t maxAttempts) {
    Serial.println("🔄 Retry " + String(attempt) + "/" + String(maxAttempts));
  });
  
  // Échec des retry
  btManager.onRetryFailed([](String reason) {
    Serial.println("💥 Échec retry: " + reason);
  });
  
  // Succès après retry
  btManager.onRetrySuccess([](uint8_t totalAttempts) {
    Serial.println("✅ Succès après " + String(totalAttempts) + " tentatives");
  });
}


🎯 Exemples Complets

Exemple 1: Serveur Bluetooth Simple

#include <SoftwareSerial.h>
#include "SchreinBluetoothManager.h"

SoftwareSerial btSerial(10, 11);
SchreinBluetoothManager btManager(btSerial, SchreinBluetoothManager::Type::HC06);

void setup() {
  Serial.begin(9600);
  btSerial.begin(9600);
  
  Serial.println("Configuration du serveur Bluetooth...");
  
  // Configuration callbacks
  setupCallbacks();
  
  // Configuration mode serveur
  if (btManager.beginATMode()) {
    btManager.configureServerIdentity("MonServeurBT", "1234");
    btManager.endATMode();
  }
  
  btManager.setMode(SchreinBluetoothManager::Mode::SERVER);
  Serial.println("Serveur Bluetooth prêt");
}

void loop() {
  btManager.loop();
  
  // Envoyer des données toutes les 5 secondes
  static unsigned long lastSend = 0;
  if (millis() - lastSend > 5000 && btManager.isConnected()) {
    btManager.sendRawData("Hello from Server!");
    lastSend = millis();
  }
}


Exemple 2: Client Bluetooth Avancé

#include <SoftwareSerial.h>
#include "SchreinBluetoothManager.h"

SoftwareSerial btSerial(10, 11);
SchreinBluetoothManager btManager(btSerial, SchreinBluetoothManager::Type::HC05, 9);

String serverMac = "12:34:56:78:9A:BC";

void setup() {
  Serial.begin(9600);
  btSerial.begin(9600);
  
  Serial.println("Configuration du client Bluetooth...");
  
  // Configuration callbacks
  setupCallbacks();
  
  // Configuration retry avancée
  SchreinBluetoothManager::RetryConfig config = {
    .enableConnectionRetry = true,
    .enableSendRetry = true,
    .maxConnectionRetries = 3,
    .connectionRetryDelay = 5000,
    .useExponentialBackoff = true
  };
  btManager.configureRetry(config);
  
  // Configuration mode client
  if (btManager.beginATMode()) {
    btManager.configureClientMode(serverMac);
    btManager.configureClientIdentity("1234");
    btManager.endATMode();
  }
  
  btManager.setMode(SchreinBluetoothManager::Mode::CLIENT);
  
  // Connexion automatique
  btManager.connect(serverMac);
}

void loop() {
  btManager.loop();
  
  // Monitoring de l'état
  static unsigned long lastStatus = 0;
  if (millis() - lastStatus > 2000) {
    if (btManager.isRetrying()) {
      Serial.println(btManager.getRetryStatus());
    }
    lastStatus = millis();
  }
  
  // Envoyer commande si connecté
  if (btManager.isConnected() && Serial.available()) {
    String command = Serial.readString();
    command.trim();
    btManager.sendRawDataWithRetry(command);
  }
}


Exemple 3: Gestion Double Mode

// Module qui peut switcher entre client et serveur (HC-05 seulement)
void switchMode(bool clientMode, String targetMac = "") {
  btManager.disconnect();
  
  if (clientMode && btManager.supportsClientMode()) {
    if (btManager.beginATMode()) {
      btManager.configureClientMode(targetMac);
      btManager.endATMode();
    }
    btManager.setMode(SchreinBluetoothManager::Mode::CLIENT);
    btManager.connect(targetMac);
  } else {
    if (btManager.beginATMode()) {
      btManager.configureServerMode();
      btManager.endATMode();
    }
    btManager.setMode(SchreinBluetoothManager::Mode::SERVER);
  }
}


🐛 Dépannage

Problèmes Courants

  1. Module ne répond pas aux commandes AT
    • Vérifier le câblage VCC, GND, TX, RX
    • Vérifier que le pin KEY est correctement connecté (HC-05)
    • Essayer de débrancher/rebrancher l’alimentation
    • Puis reset le carte
  2. Échec de connexion en mode client
    • Vérifier l’adresse MAC du serveur
    • S’assurer que le serveur est en mode visible
    • Vérifier que les PIN correspondent
  3. Données non reçues
    • Vérifier que btManager.loop() est appelé régulièrement
    • S’assurer que les callbacks sont bien configurés
    • Vérifier le baud rate des deux modules

Méthodes de Debug

void debugModule() {
  Serial.println("=== DEBUG MODULE BLUETOOTH ===");
  Serial.println("Type: " + btManager.getModuleTypeString());
  Serial.println("Mode: " + String(btManager.getMode() == SchreinBluetoothManager::Mode::CLIENT ? "CLIENT" : "SERVER"));
  Serial.println("État: " + String((int)btManager.getConnectionState()));
  Serial.println("Connecté: " + String(btManager.isConnected() ? "OUI" : "NON"));
  Serial.println("Retry actif: " + String(btManager.isRetrying() ? "OUI" : "NON"));
  
  if (btManager.isRetrying()) {
    Serial.println(btManager.getRetryStatus());
  }
  
  // Test commandes AT
  if (btManager.beginATMode()) {
    Serial.println("Mode AT: OK");
    btManager.Status();
    btManager.endATMode();
  } else {
    Serial.println("Mode AT: ÉCHEC");
  }
}


📚 Résumé des Méthodes Principales

Gestion Connexion

  • connect(String mac) – Connexion avec retry
  • forceConnect(String mac) – Connexion forcée
  • disconnect() – Déconnexion
  • isConnected() – Vérification état

Configuration

  • configureServerMode() – Mode serveur
  • configureClientMode(String mac) – Mode client
  • setName(String name) – Changement nom
  • setPin(String pin) – Changement PIN

Données

  • sendRawData(String data) – Envoi simple
  • sendRawDataWithRetry(String data) – Envoi avec retry
  • loop() – Traitement des données entrantes

Informations

  • getMacAddress() – Adresse MAC
  • getName() – Nom du module
  • getPin() – PIN de pairing
  • getModuleTypeString() – Type de module

Cette documentation couvre l’ensemble des fonctionnalités de la bibliothèque SchreinBluetoothManager. Pour toute question supplémentaire, n’hésitez pas à consulter les exemples fournis ou à examiner le code source directement.