/* 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.
   Ce démonstrateur est directement dérivé de P04 et se contente d'utiliser le Moniteur de l'IDE
   uniquement pour l'analyse du comportement du clavier. Si le retour est correct, rien n'est signalé.
   S'il y a erreur, la LED d'Arduino clignote rapidement durant une seconde. Si on clique sur le BP 2
   pour simuler une erreur et ainsi pouvoir observer le clignotement de la LED d'Arduino, simultanément
   on vide le tampon de réception pour pouvoir synchroniser les échanges. Comme on est en expérience,
   si le module Maître est laissé branché sur l'ordinateur, le Moniteur de l'IDE affiche les ACR reçus.
   Surtout, chaque fois qu'une touche du clavier est cliquée, les valeurs de numérisation qu'elle génère
   et sa  référence sont listées pour éventuellement optimiser les valeurs de seuils dans le
   démonstrateur.

 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.

 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 touches du clavier qui génèrera les lettres A, B, C, E ou W et on observe le comportement
   de l'ESCLAVE. En principe il ne peut pas y avoir d'Erreur, aussi le S de la série valide est remplacé par 'W'.
 • L'ESCLAVE inchangé a toujours une répétition sur la ligne série du Moniteur mais elle est ignorée.
 
 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.
  • A0 et A1 sont reliées au petit clavier à cinq touches conformément à la Fig.18 donnée en
    page 15 du didacticiel. Les seuils de décision sont ceux de la Fig.19. 
  
                                   PGM            RAM dynamique 
Compilateur v1.7.9 :        5686 Octets (17%)  389 Octets (18%)  */

//------------------------ Constantes du programme --------------------------
#define Version "08/07/2025" // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define Lgr_TEXTE 32 // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define NB_tests_antirebonds 250 // Nombre de tests de stabilisation B.P. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#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 d'entrées analogiques ----------------
#define Ligne_trois_touches 14 // A0 pour lire le clavier à 3 BP. 
#define Ligne_deux_touches 15  // A1 pour lire le clavier à 2 BP.
//------------------- 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.
#define LED_Arduino 13
//---------------------- 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, Num_BP;
long U_mesuree, U_sur_A0, U_sur_A1;
char TEXTE_USB[Lgr_TEXTE+1];
char TEXTE_HC_05[Lgr_TEXTE+1];

//========================= Procédures de servitude ============================

void Clignoter() {
  for (byte I = 0; I < 10; I++) {
    digitalWrite(LED_Arduino,HIGH); delay(50); digitalWrite(LED_Arduino,LOW); delay(50);}}

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

void ATTENDRE_le_relacher() {
  byte Nb_comptages_OK = 0;
  U_sur_A0 = analogRead(Ligne_trois_touches); // Attendre sur la ligne à 3 touches.
  while (Nb_comptages_OK < NB_tests_antirebonds) {
         U_mesuree = analogRead(Ligne_trois_touches);
         if (U_mesuree > 900) Nb_comptages_OK++; else Nb_comptages_OK = 0;}
  U_sur_A1 = analogRead(Ligne_deux_touches); // Attendre sur la ligne à 2 touches.
  Nb_comptages_OK = 0;
  while (Nb_comptages_OK < NB_tests_antirebonds) {
         U_mesuree = analogRead(Ligne_deux_touches);
         if (U_mesuree > 900) Nb_comptages_OK++; else Nb_comptages_OK = 0;}}
  
void Tester_le_Clavier() {// Les valeurs tiennent compte de VCC = 4V car fourni par la carte NANO.
  byte Nb_comptages_OK = 0;
  U_sur_A0 = 0; U_sur_A1 = 0; Num_BP = 0; // Signale aucun B.P. utilisé.
  U_sur_A0 = analogRead(Ligne_trois_touches); U_sur_A1 = analogRead(Ligne_deux_touches);
  if (U_sur_A0 < 900) {// L'une des 3 touches a été cliqué.
      while (Nb_comptages_OK < NB_tests_antirebonds) {
             U_mesuree = analogRead(Ligne_trois_touches);
             if (U_mesuree < 900) {U_sur_A0 = U_sur_A0 + U_mesuree; Nb_comptages_OK++;}
             else {U_sur_A0 = 0; Nb_comptages_OK = 0;}}
             U_sur_A0 = U_sur_A0 / NB_tests_antirebonds;
      if (U_sur_A0 < 230) Num_BP = 1;
      if ((U_sur_A0 < 485) && (U_sur_A0 > 230)) Num_BP = 2;     
      if ((U_sur_A0 < 807) && (U_sur_A0 > 485)) Num_BP = 3;}
  if (U_sur_A1 < 900) {// L'une des 2 touches a été cliqué.
      while (Nb_comptages_OK < NB_tests_antirebonds) {
             U_mesuree = analogRead(Ligne_deux_touches);
             if (U_mesuree < 900) {U_sur_A1 = U_sur_A1 + U_mesuree; Nb_comptages_OK++;}
             else {U_sur_A1 = 0; Nb_comptages_OK = 0;}}
             U_sur_A1 = U_sur_A1 / NB_tests_antirebonds;
      if (U_sur_A1 < 315) Num_BP = 4;
      if ((U_sur_A1 < 764) && (U_sur_A1 > 315)) Num_BP = 5;}
 if (Num_BP > 0)  {
     Serial.print(" D0 = "); Serial.print(U_sur_A0); Serial.print(" D1 = "); Serial.print(U_sur_A1);
     Serial.print(" soit BP"); Serial.print(Num_BP); ATTENDRE_le_relacher();}}

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 AFF_ACR() {
  Lecture_sur_le_Module_HC_05();
  Serial.print(" ACR = "); 
  for (byte I = 0; I < Index; I++) Serial.print(TEXTE_HC_05[I]); Serial.println();
  if ((TEXTE_HC_05[0] == 'E') && (TEXTE_HC_05[1] == 'r')) Clignoter();}

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

void setup(){
  pinMode(RX,INPUT); pinMode(TX,OUTPUT);
  pinMode(LED_Arduino, OUTPUT); digitalWrite(LED_Arduino, LOW);
  Serial.begin(9600); 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() {
  Tester_le_Clavier();
  if (Num_BP > 0) {
     switch (Num_BP) {
       case 1 : {Module_HC05.write('B'); AFF_ACR(); break;}
       case 2 : {Vider_le_tampon_HC05(); Module_HC05.write('W'); AFF_ACR(); break;}
       case 3 : {Module_HC05.write('A'); AFF_ACR(); break;}
       case 4 : {Module_HC05.write('E'); AFF_ACR(); break;}
       case 5 : {Module_HC05.write('C'); AFF_ACR();}}}}


