/* Programme ESCLAVE pour tester le transmetteur Bluetooth HC-05 qui gère sur télécommande une
   rampe lumineuse composée de huit LEDs.
   Ce programme est associé à P06_Maitre_C qui envoie les commandes.
   Le programme attend un chiffre arrivant sur la ligne RX du module Bluetooth.
   Il n'y a aucune analyse, le premier caractère doit être un chiffre compris entre 0 et 8.
   Il représente le nombre de LEDs à allumer sur la rampe lumineuse.
 
 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é.
  • Branche les huit LEDs entre D5 et D2 avec leur résistance de limitation de courant.
    L'anode est sur Dn et la cathode vers GND à travers R.

 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
                       3202 Octets (10%)    134 Octets (6%)  */

//------------------------ Constantes du programme --------------------------
#define Version "09/07/2025" // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#define Lgr_TEXTE 8 // @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#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 -----------------------
// 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.
// NOTE : Le BUZZER n'est pas déclaré donc ignoré. Mais il reste branché sur D4 pour des
//        expériences futures, d'ou l'implantation des LEDs.
#define LED_1 5 // D5 pour la LED de droite poids faible.
#define LED_2 6
#define LED_3 7
#define LED_4 8
#define LED_5 9
#define LED_6 10
#define LED_7 11
#define LED_8 12

//---------------------- 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 --------------------------
char CAR_sur_RX;
byte Index;
char TEXTE[Lgr_TEXTE];

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

void Eteindre_toute_les_LEDs() {
  digitalWrite(LED_1,LOW); digitalWrite(LED_2,LOW); digitalWrite(LED_3,LOW); digitalWrite(LED_4,LOW);
  digitalWrite(LED_5,LOW); digitalWrite(LED_6,LOW); digitalWrite(LED_7,LOW); digitalWrite(LED_8,LOW);}

void Rampe_lumineuse(byte Nombre) {
  Eteindre_toute_les_LEDs();
  if (Nombre > 0) digitalWrite(LED_1,HIGH);
  if (Nombre > 1) digitalWrite(LED_2,HIGH);
  if (Nombre > 2) digitalWrite(LED_3,HIGH);
  if (Nombre > 3) digitalWrite(LED_4,HIGH);
  if (Nombre > 4) digitalWrite(LED_5,HIGH);
  if (Nombre > 5) digitalWrite(LED_6,HIGH);
  if (Nombre > 6) digitalWrite(LED_7,HIGH);
  if (Nombre > 7) digitalWrite(LED_8,HIGH);}

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

void setup() {
  pinMode (RX,INPUT); pinMode (TX,OUTPUT);
  pinMode(LED_1,OUTPUT); pinMode(LED_2,OUTPUT); pinMode(LED_3,OUTPUT); pinMode(LED_4,OUTPUT);
  pinMode(LED_5,OUTPUT); pinMode(LED_6,OUTPUT); pinMode(LED_7,OUTPUT); pinMode(LED_8,OUTPUT);
  Eteindre_toute_les_LEDs();
  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.

void loop() {
  //======================== Réception sur la ligne Bluetooth. =======================
  Index = 0;
  while (!Ligne_Bluetooth.available()); // Attente du début de l'ACR.
  while(Ligne_Bluetooth.available()) {CAR_sur_RX = Ligne_Bluetooth.read();
        if ((Index < Lgr_TEXTE) && (CAR_sur_RX != CR) && (CAR_sur_RX != LF)) {
           TEXTE[Index] = CAR_sur_RX; Index++;} delay(5);} // Délai impératif. 
  //====================== Traiter les caractères de commande. =======================
  CAR_sur_RX = TEXTE[0]; Rampe_lumineuse(byte(CAR_sur_RX));
  //---------------- Traite l'accusé de réception ---------------
  delay(20); Ligne_Bluetooth.println('X');}
  // Ci-dessus : L'ACR n'étant pas analysé, autant n'envoyer qu'un seul caractère.



