/* Ce programme sert à établir le dialogue avec un module ESCLAVE associé piloté par un autre Arduino.
   Le programme associé sur l'Esclave est nommé P03_Esclave_A.

 Préalable à l'utilisation de ce démonstrateur :
 -----------------------------------------------
  • L'adresse du module esclave a été lue et 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.

 REMARQUE : Pour faciliter les manipulations les lettres minuscules sont transformés automatiquement
            en leur équivalent majuscule.
 
 NOTE : Les deux tableaux TEXTE_USB[Lgr_TEXTE+1] et TEXTE_HC_05[Lgr_TEXTE+1] servent exactement à la
        même chose, c'est à dire mémoriser les messages échangés sur les deux lignes série. Comme ils
        ne sont jamais utilisés simultanément, il serait possible de n'utiliser qu'un seul tableau
        commun. C'est pour des raisons de lisibilité du programme que j'ai opté pour ce "gaspillage",
        car avec ce démonstrateur on peut se le permettre, on dispose de place à revendre.
        Idem pour les deux variables CAR_Moniteur et CAR_module_HC05.

Comportement du programme :   (Voir le didacticiel)
---------------------------
 • On frappe des commandes A, B, C, E ou S et on observe le comportement de l'ESCLAVE.
 • Si c'est la lettre 'S' elle n'est pas transmise à l'Esclave et le Maître vide son tampon série
   pour permettre de SYNCHRONISER les deux modules.
 • 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. On peut ainsi observer ce que
   fait chacun des modules directement sur l'écran de l'ordinateur.
 
 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.
  
                                   PGM            RAM dynamique 
Compilateur v1.7.9 :        4826 Octets (14%)  395 Octets (19%)  */

//------------------------ Constantes du programme --------------------------
#define Version "02/07/2025" // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define Lgr_TEXTE 32 // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#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.
//------------------- Définition des broches binaires -----------------------
#define RX 2 // Va sur TX du module Bluetooth.
#define TX 3 // Va sur RX du module Bluetooth avec pont de résistances.
//---------------------- Déclarations pour le matériel ----------------------
#include <SoftwareSerial.h>
SoftwareSerial Module_HC05(RX,TX);

//------------------------- Variables du programme --------------------------
char CAR_Moniteur, CAR_module_HC05, Synchroniser;
byte Index;
char TEXTE_USB[Lgr_TEXTE+1];
char TEXTE_HC_05[Lgr_TEXTE+1];

//========================= Procédures de servitude ============================
void Vider_le_tampon_USB() {while (Serial.available()) Serial.read();}

void Vider_le_tampon_HC05() {while (Module_HC05.available()) Module_HC05.read();}

void Lecture_sur_le_Moniteur(){
  Index = 0; while (!Serial.available()); // Attente d'une commande sur la ligne USB.
  while (Serial.available()) {CAR_Moniteur = Serial.read();
         //-------------------- Passer les lettre en MAJUSCULES -------------------
         if ((CAR_Moniteur >= 'a') && (CAR_Moniteur < char(123))) CAR_Moniteur = CAR_Moniteur & 223;
         // Bien moins couteux en octets que Chaine_Memorisee.toUpperCase() pour convertir les minuscules.
         //------------------------------------------------------------------------
         if ((Index < Lgr_TEXTE) && (CAR_Moniteur != CR) && (CAR_Moniteur != LF)) 
            {TEXTE_USB[Index] = CAR_Moniteur; Index++;}
         delay(5);} // Délai impératif.
  Vider_le_tampon_USB();} // Vider le tampon série si Nb caractères > Lgr_TEXTE.

void Lecture_sur_le_Module_HC_05() {
  Index = 0; while (!Module_HC05.available()); // Attente du début de l'ACR.
  while (Module_HC05.available()) {CAR_module_HC05 = Module_HC05.read();
         if ((Index < Lgr_TEXTE) && (CAR_module_HC05 != CR) && (CAR_module_HC05 != LF))
            {TEXTE_HC_05[Index] = CAR_module_HC05; Index++;}
  delay(10);}} // Délai impératif.

void Afficher_ACR() {
  Serial.print(F(" ACR = ")); for (byte I = 0; I < Index; I++) Serial.print(TEXTE_HC_05[I]); Serial.println();}

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

void setup(){
  pinMode(RX,INPUT); pinMode(TX,OUTPUT);  
  Serial.begin(9600);
  Vider_le_tampon_USB(); Synchroniser = false;
  Serial.println(); Serial.println(); Serial.print(F(" MAITRE : Version du ")); Serial.println(Version);
  Module_HC05.begin(9600);} //38400 pour le mode AT et 9600 en exploitation.

void loop(){
  //--------------------- Saisir une commande sur le Moniteur ---------------------
  Serial.println(); Serial.print(F(" Commande ?"));
  // Charger dans TEXTE les caractères disponibles sur le port Série USB du Moniteur :
  Lecture_sur_le_Moniteur();
  //---------- Si lettre 'S' vider le tampon du Maitre pour synchroniser ----------
  if (TEXTE_USB[0] == 'S') Synchroniser = true;
  //----------------------------- Afficher la commande ----------------------------
  Serial.print(F(" [")); for (byte I = 0; I < Index; I++) Serial.print(TEXTE_USB[I]);
  Serial.print(F("](")); Serial.print(Index); Serial.println(')');
  //--------------------- Transmettre le texte vers le module ---------------------
  if (Synchroniser) {
     Vider_le_tampon_HC05(); Serial.println(); Serial.println(" Synchronisation"); Synchroniser = false;}
     //-------------------- Affichage de l'accusé de réception --------------------
  else {for (byte I = 0; I < Index; I++) Module_HC05.write(TEXTE_USB[I]);
       Lecture_sur_le_Module_HC_05(); Afficher_ACR();}}


