/* Programme ESCLAVE minimal pour tester le transmetteur Bluetooth HC-05.
   Ce programme est associé à P04_Maitre_A qui envoie les commandes.
   Le programme attend un TEXTE arrivant sur la ligne RX du module Bluetooth.
   Il analyse ce texte dont le premier caractère doit être une lettre majuscule A, B, C ou E.
   Lettre A : Provoque inconditionnellement un BIP. (Pour Alerte sonore.)
   Lettre B : Inverse le booléen Silence. Si false les erreurs génèreront un BIP.
                                          Si true les erreurs ne seront pas signalées par le BIP.
   Lettre C : Inverse le mode CLIGNOTEMENT de la LED d'Arduino.
   Lettre E : Retourne l'Etat actuel de Silence et de Clignoter.
   Puis il transmet l'accusé de réception "OK !" si la lettre reçue est A, B ou C.
   Si la commande n'est pas valide, l'ACR retourne "Erreur !".
 
   • MAITRE et ESCLAVE ont une répétition sur la ligne série du Moniteur. Il est ainsi possible de brancher
     les deux modules sur un même ordinateur et d'ouvrir deux fois le Moniteur de lIDE. On peut ainsi observer ce
     que fait chacun des modules directement sur l'écran vidéo.

 BRANCHEMENTS à effectuer :
 --------------------------
  • Le +5V va sur VCC du HC-05.
  • GND va sur GND  du HC-05.
  • GND va sur EN  du HC-05.
  • D2 d'Arduino va sur TX du HC-05.
  • D3 d'Arduino va sur RX (1k,2k) du HC-05.
  • D4 va sur un petit bruiteur actif. (Attention, ce composant est polarisé.

 Préalable à l'utilisation de ce démonstrateur :
 -----------------------------------------------
  • L'adresse de ce module a été initialisée dans le programme Maitre avec AT+BIND.
  • Les deux machines ont PSWD = 1905 comme Mot de passe.
  • Les deux machines ont UART = 9600,0,0 comme format de transfert série hertzien.
   
Compilateur v1.7.9.          PGM              RAM dynamique
                       5268 Octets (17%)    413 Octets (20%)  */

//------------------------ Constantes du programme --------------------------
#define Version "07/07/2025" // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define Lgr_TEXTE 16 // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define CR 13 // Code du Retour Chariot qui vaut 13 codé en ASCII sous forme décimale.
#define LF 10 // Code du passage à la ligne qui vaut 10 codé en ASCII sous forme décimale.

int Delai_voulu = 75; // Demi période du clignottement en mS.

unsigned long Temps_Ecoule_depuis_RESET = 0;

//------------------- Définition des broches binaires -----------------------
// Les broches sont choisies dans l'ordre laissant libre D0 et D1 pour les téléversements.
#define RX 2 // Va sur TX du module Bluetooth.
#define TX 3 // Va sur RX du module Bluetooth avec pont de résistances.
#define BUZZER 4 // D4 : BUZZER actif.
#define LED_Arduino 13

//---------------------- Déclarations pour le matériel ----------------------
// Cette section est placée après la déclaration des broches binaires qui doivent
// être définies lors de l'instruction SoftwareSerial Ligne_Bluetooth(RX,TX);
#include <SoftwareSerial.h>
SoftwareSerial Ligne_Bluetooth(RX,TX);
//------------------------- Variables du programme --------------------------
boolean Clignotement, Erreur, Etat, Silence;
char CAR_sur_RX;
byte Index;
char TEXTE[Lgr_TEXTE];

//========================= Procédures de servitude ============================
void BIP() {digitalWrite(BUZZER, HIGH); delay(100); digitalWrite(BUZZER, LOW);}

void Inverser_LED_Arduino() {digitalWrite(LED_Arduino,!digitalRead(LED_Arduino));}

//=========================== Corps du programme ===============================

void setup() {
  Serial.begin(9600);
  Serial.println(); Serial.println(); Serial.print(F(" ESCLAVE : Version du ")); Serial.println(Version);
  pinMode (RX,INPUT); pinMode (TX,OUTPUT); pinMode(LED_Arduino,OUTPUT);
  pinMode(BUZZER,OUTPUT); digitalWrite(BUZZER, LOW);
  Ligne_Bluetooth.begin(9600); // Vitesse impérative pour dialoguer avec le module.
  while(Ligne_Bluetooth.available()) CAR_sur_RX = Ligne_Bluetooth.read(); // Vider le tampon de RX.
  Clignotement = false; Silence = true; Etat = false;}
  
void loop() {
  //======================== Réception sur la ligne Bluetooth. =======================
  // Charger dans TEXTE les caractères disponibles sur la ligne RX du module Bluetooth :
  if (Ligne_Bluetooth.available()) {Serial.println(); Serial.print(" RX sur Esclave = "); Index = 0;
  while(Ligne_Bluetooth.available()) {CAR_sur_RX = Ligne_Bluetooth.read(); Serial.print(CAR_sur_RX);
        if ((Index < Lgr_TEXTE) && (CAR_sur_RX != CR) && (CAR_sur_RX != LF)) {
           TEXTE[Index] = CAR_sur_RX; Index++;} delay(5);}} // Délai impératif. 
  //======================= Chronométrage pour le délai écoulé =======================
  if (millis() - Temps_Ecoule_depuis_RESET > Delai_voulu)  {
     Temps_Ecoule_depuis_RESET = millis();
     //----------------- Actions à traiter pour chaque délai écoulé. -----------------
     if (Clignotement) Inverser_LED_Arduino(); else digitalWrite(LED_Arduino,LOW);}
  //====================== Traiter les caractères de commande. =======================
  if (Index > 0) { 
     //------------- Traiter les caractères de commande ------------
     CAR_sur_RX = TEXTE[0]; Erreur = false; 
     switch (CAR_sur_RX) {
        case 'A' : {BIP(); break;} // A pour Alerte sonore.
        case 'B' : {Silence = !Silence; break;}
        case 'C' : {Clignotement = !Clignotement; break;}
        case 'E' : {Etat = ! Etat; break;}
        default : {Erreur = true; if (!Silence) BIP();}}
     //---------------- Traite l'accusé de réception ---------------
     delay(300); Serial.println(); Serial.print(" ACR en retour : ");
     if (Etat) {Ligne_Bluetooth.print("Silence = "); Ligne_Bluetooth.print(Silence);
                Ligne_Bluetooth.print(" Clignoter = "); Ligne_Bluetooth.println(Clignotement);
                Serial.print("Silence = "); Serial.print(Silence);
                Serial.print(" Clignoter = "); Serial.print(Clignotement); Etat = false;}
     else {if (Erreur) {Ligne_Bluetooth.println("Erreur !"); Serial.print("Erreur !");}
          else {Ligne_Bluetooth.println("OK !"); Serial.print("OK !");}}
     Index = 0;}}



