/* Ce programme sert à établir le dialogue sans fin automatique avec un module ESCLAVE associé piloté par
   un autre Arduino. Le programme associé sur l'Esclave est nommé P07_Esclave_C.
   Ce démonstrateur est directement dérivé de P08 et se contente de supprimer la lecture du potentiomètre
   et d'effectuer une incrémentation automatique de la luminosité de la rampe de LEDs.
   Toutefois, pour donner l'illusion d'une rotation complète l'aiguille virtuelle fait un tour complet. De
   ce fait, à partir de la position 8 la rampe de LEDs reste entièrement allumée durant 4 cycles complets.

 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 sur TX et RX.

Comportement du programme :   
---------------------------
 • On amorce le dialogue entre les deux machines et l'on observe leurs bavardage permanent.
   On affiche sur l'écran OLED le nombre d'échanges réalisés depuis le RESET.
   Pour celles et ceux qui ne possèdent pas d'écran OLED et qui ne désirent pas investir dans ce composant,
   la valeur du compteur est affichée sur le Moniteur de l'IDE initialisé à 38400 baud pour ne pas trop
   ralentir la boucle de "bavardage".
 
 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 est reliée à un potentiomètre de 10kOhm de type linéaire.
                       ----------------------------------------- 
  
                                   PGM            RAM dynamique 
Compilateur v1.7.9 :        12074 Octets (37%)  572 Octets (27%)  */

//------------------------ Constantes du programme --------------------------
#define Version "11/07/2025" // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define Lgr_TEXTE 32 // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define MINI 17 // Valeur minimale mesurée par la CAN @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define MAXI 1010 // Valeur maximale mesurée par la CAN @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#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.
#define LED_Arduino 13
//---------------------- Déclarations pour le matériel ----------------------
#include <SoftwareSerial.h>
SoftwareSerial Module_HC05(RX,TX);

#include "U8glib.h"
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE); // Usage de la ligne I2C (Two Wire Interface)

//------------------------- Variables du programme --------------------------
char CAR_module_HC05;
byte Chiffre, Index;
long Nb_Echanges;

char TEXTE_HC_05[Lgr_TEXTE+1];

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

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

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 CADRES() {u8g.drawFrame(0,0,128,64); u8g.drawHLine(1,12,126);} // Cadre TITRE et cadre rampe.

void Barre_lumineuse() {u8g.drawBox(4,1,Chiffre * 10,11);}

void AFF_Curseur() {
  u8g.drawCircle(97,38,22); u8g.drawDisc(97,38,5);
  switch(Chiffre) {
    case 0 : {u8g.drawLine(97,38,80,48); break;}
    case 1 : {u8g.drawLine(97,38,77,38); break;}
    case 2 : {u8g.drawLine(97,38,80,28); break;}
    case 3 : {u8g.drawLine(97,38,87,21); break;}
    case 4 : {u8g.drawLine(97,38,97,18); break;}
    case 5 : {u8g.drawLine(97,38,107,21); break;}
    case 6 : {u8g.drawLine(97,38,114,28); break;}
    case 7 : {u8g.drawLine(97,38,117,38); break;}
    case 8 : {u8g.drawLine(97,38,114,48); break;}
    case 9 : {u8g.drawLine(97,38,106,56); break;}
    case 10 : {u8g.drawLine(97,38,97,58); break;}
    case 11 : {u8g.drawLine(97,38,88,58);}}}

void Aff_Ecran_OLED() {
  u8g.firstPage(); do {// Début de la boucle d'affichage de la page écran.
  //================ Définition des éléments à afficher ================
    u8g.setPrintPos(10,40); u8g.print(Nb_Echanges);
    CADRES(); Barre_lumineuse(); AFF_Curseur();}
  //====================================================================
  while(u8g.nextPage());} // Fin de la boucle d'affichage de la page écran.

void Envoyer_la_consigne() {
  Chiffre ++; if (Chiffre == 13) Chiffre = 0; Module_HC05.write(Chiffre);
  Aff_Ecran_OLED(); Serial.println(Nb_Echanges); Nb_Echanges++;}

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

void setup(){
  pinMode(RX,INPUT); pinMode(TX,OUTPUT);
  pinMode(LED_Arduino, OUTPUT); Module_HC05.begin(9600);
  Serial.begin(38400); Serial.println(); Serial.println();
  Serial.print(F(" MAITRE-E : Version du ")); Serial.println(Version);
  Serial.println(); Serial.println(F(" Programme aveugle.")); Serial.println(); Chiffre = 0; Nb_Echanges = 0;
  u8g.setFont(u8g_font_6x10);} // Police de matrices de 6x10 pixels lettres MJA/min comprises.

void loop() {
  digitalWrite(LED_Arduino, HIGH);
  Envoyer_la_consigne();
  digitalWrite(LED_Arduino, LOW);
  Lecture_sur_le_Module_HC_05();} // L'ACR n'est pas analysé.

