/* Programme MAITRE pour tester le transmetteur Bluetooth HC-05 qui gère une télémesure.
   Ce programme est associé à P11_Esclavee_F qui se contente d'interroger en boucle le Maître
   avant de démarrer les mesurages et la transmission des données. Il attend de reconnaitre la
   lettre 'S' de SYNCHRONISATION pour démarrer les mesures et commencer à transmettre les données.
   Le dialogue étant SYNCHRONISÉ, ce démonstrateur se contente de réceptionner les données et de
   les afficher sur l'écran OLED. Pour celle et ceux qui ne disposent pas d'un tel composant
   les valeurs reçues sont affichées sur le Moniteur de l'IDE initialisé à 38400 baud.
   La LED d'arduino continue à clignoter pour témoigner du fonctionnement de la boucle de base.
   (Le potentiomètre n'est plus branché.)

 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 et les données de l'Esclave.
   Pour celles et ceux qui ne possèdent pas d'écran OLED et qui ne désirent pas investir dans ce composant,
   les valeurs échangées sont affichées sur le Moniteur de l'IDE initialisé à 38400 baud.
 
 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 :        12816 Octets (39%)  730 Octets (35%)  */

//------------------------ Constantes du programme --------------------------
#define Version "13/07/2025" // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define Lgr_TEXTE 32 // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define Temporisation 20 // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#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, Nb_T, Nb_H, Valeur_H;
unsigned long Nb_Echanges;
unsigned long Temps_Ecoule_depuis_RESET = 0;

char TEXTE_HC_05[Lgr_TEXTE+1];
char Tension[4];
char Temperature[6]; // Six car doit pouvoir contenir le texte "Erreur".
char Hygrometrie[6]; // Six car doit pouvoir contenir le texte "Erreur".

//========================= 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 Afficher_le_TEXTE() {
  for (byte I = 0; I < Index; I++) Serial.print(TEXTE_HC_05[I]);}

void Attente_de_la_synchronisation() {
  u8g.firstPage(); do {// Début de la boucle d'affichage de la page écran.
    u8g.setPrintPos(40,25); u8g.print("Attente de");
    u8g.setPrintPos(25,37); u8g.print("SYNCHRONISATION");}
  while(u8g.nextPage());
  TEXTE_HC_05[0] = '@'; // Caractère quelconque pour entrer dans la boucle.
  while ((TEXTE_HC_05[0] != 'O') && (TEXTE_HC_05[1] != 'K')) {
          delay(50); Module_HC05.println('S'); Lecture_sur_le_Module_HC_05();}}

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,9); u8g.print("Nb Cycles = "); u8g.print(Nb_Echanges);
    u8g.setPrintPos(10,23); u8g.print("Tension = ");
    for (byte I = 0; I < 4; I++) u8g.print(Tension[I]);
    u8g.setPrintPos(10,33); u8g.print("Temperature "); if (Nb_T == 2) u8g.print("= ");  
    for (byte I = 0; I < Nb_T; I++) u8g.print(Temperature[I]); if (Nb_T == 2) u8g.print(" C");
    u8g.setPrintPos(10,43); u8g.print("Hygrometrie "); if (Nb_H == 2) u8g.print("= ");
    for (byte I = 0; I < Nb_H; I++) u8g.print(Hygrometrie[I]);
    if (Nb_H == 2) u8g.print('%');
    //-------------- Tracer les cadres et les graduations --------------
    u8g.drawFrame(0,0,128,64); u8g.drawHLine(1,12,126); u8g.drawHLine(4,55,121);
    u8g.drawVLine(4,46,9); u8g.drawVLine(64,46,9); u8g.drawVLine(124,46,9);
    for (byte I = 0; I < 9; I++) u8g.drawVLine((I*12)+16,50,5);
    //----------- Tracer la barre analogique de l'Hygrometrie ----------
    if (Nb_H == 2) Valeur_H = ((byte(Hygrometrie[0])-48) * 10) + (byte(Hygrometrie[1])-48);
    else Valeur_H = 0;
    //------------------ Tracer les accents sur les é ------------------
    u8g.drawPixel(36,27); u8g.drawPixel(37,26); u8g.drawPixel(48,37); u8g.drawPixel(49,36);
    //----------------- Tracer le petit cercle de "°C" -----------------
    u8g.drawPixel(107,27); u8g.drawPixel(108,26); u8g.drawPixel(108,28); u8g.drawPixel(109,27);
    //------------------------------------------------------------------
    u8g.drawBox(4,56,int(Valeur_H * 1.2),7);}
  //====================================================================
  while(u8g.nextPage());} // Fin de la boucle d'affichage de la page écran.

//=========================== 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.print(F(" MAITRE-F : Version du ")); Serial.println(Version);
  Serial.println(); Serial.println(F(" Programme aveugle.")); Serial.println(); Nb_Echanges = 0;
  u8g.setFont(u8g_font_6x10); // Police de matrices de 6x10 pixels lettres MJA/min comprises.
  Serial.println(F(" Attente de la SYNCHRONISATION.")); Vider_le_tampon_HC05(); Attente_de_la_synchronisation();
  Serial.println(); Serial.println(F(" Debut des echanges.")); delay(Temporisation);}

void loop() {
  //================= Chronométrage pour le délai écoulé ================
  if (millis() - Temps_Ecoule_depuis_RESET > 1000)  {
     Temps_Ecoule_depuis_RESET = millis();
     //----------------- Actions à traiter pour chaque délai écoulé. -----------------
     Nb_Echanges++;
     //---------------------- Affichage du nombre d'échanges ----------------------
     Serial.println(); Serial.print(" Nb de cycles = "); Serial.println(Nb_Echanges);
     //----------------------- Reception de la Tension +Vcc -----------------------
     delay(Temporisation); digitalWrite(LED_Arduino, HIGH); Module_HC05.println('X'); Lecture_sur_le_Module_HC_05(); 
     digitalWrite(LED_Arduino, LOW);
     Serial.print("      Tension = "); Afficher_le_TEXTE(); Serial.println('v');
     for (byte I = 0; I < 3; I++) Tension[I] = TEXTE_HC_05[I]; Tension[3] = 'v';
     //----------------------- Reception de la Température ------------------------
     delay(Temporisation); digitalWrite(LED_Arduino, HIGH); Module_HC05.println('X'); Lecture_sur_le_Module_HC_05(); 
     digitalWrite(LED_Arduino, LOW);
     Serial.print("  Temperature = "); Afficher_le_TEXTE();
     if ((TEXTE_HC_05[0] != 'E') && (TEXTE_HC_05[1] != 'r')) {Serial.print(char(176)); Serial.println('C');}
     else Serial.println(); Nb_T = 2;
     if ((TEXTE_HC_05[0] != 'E') && (TEXTE_HC_05[1] != 'r')) {
        Temperature[0] = TEXTE_HC_05[0]; Temperature[1] = TEXTE_HC_05[1];}
     else {Nb_T = 6; for (byte I = 0; I < 6; I++) Temperature[I] = TEXTE_HC_05[I];}
     //----------------------- Reception de l'Hygrométrie -------------------------
     delay(Temporisation); digitalWrite(LED_Arduino, HIGH); Module_HC05.println('X');
     Lecture_sur_le_Module_HC_05(); digitalWrite(LED_Arduino, LOW);
     Serial.print("  Hygrometrie = "); Afficher_le_TEXTE(); Nb_H = 2;
     if ((TEXTE_HC_05[0] != 'E') && (TEXTE_HC_05[1] != 'r')) Serial.println('%');
     else Serial.println();
     if ((TEXTE_HC_05[0] != 'E') && (TEXTE_HC_05[1] != 'r')) {
        Hygrometrie[0] = TEXTE_HC_05[0]; Hygrometrie[1] = TEXTE_HC_05[1];}
     else {Nb_H = 6; for (byte I = 0; I < 6; I++) Hygrometrie[I] = TEXTE_HC_05[I];}
     Aff_Ecran_OLED();}}
  
  
