Le code de la télécommande est basé sur un menu pour l’écran LCD piloté par un encodeur rotatif selon le tutoriel ci-dessous :

Afin de suivre le tutoriel il faut installer plusieurs bibliothèques spécifiques:

J’ai rédigé différents articles ou j’explique certaines parties du code plus spécifiques à la télécommande T.T.2.J :

Voici le code complet de l’émetteur T.T.2.J. Il est largement commenté donc je pense qu’il n’y a pas besoin de plus de précision :

// essais de creation du menu de la telecommande pour train de jardin

#include <LiquidCrystal_I2C.h>  // biblio pour l'ecran
#include <Rotary.h>             // biblio pour lire la rotation de l'encodeur(Horaire/Antihoraire)
#include <OneButton.h>          // biblio pour lire le bouton de l'encodeur

#include "SPI.h"
#include "NRFLite.h"  // biblio pour la transmission radio

// ************   Déclaration du Matériel (HARDWARE)   *************
LiquidCrystal_I2C lcd(0x27, 20, 4);  // adresse I2c 0x3F pour puce NXP; ou 0x27 pour pucee Texas instrument, taille de l'écran 20 colonnes, 4 lignes

//**** Les broches de l'encodeur sont S1, S2 et key:
Rotary myRotary = Rotary(2, 3);  // Déclaration de l'objet myRotary (avec S1, S2 sur Pins 2,3)
OneButton key(8, true);          // Déclaration du Bouton key sur Pins 8; active_low = true (pullup)

// **********  Déclaration des variables et des constantes  *************
String menuItems[2] = { "LIGHT: ", "LOCO_ADD: " };  //tableau texte à 2 valeurs
String menuLIGHT[2] = { "  OFF   ", "  ON     " };  //tableau texte à 2 valeurs

int menuCounter = 0;  // compteur de clicks du rotary encoder (0 et 1 pour 2 éléments)


bool selectedLIGHT_flag = false;                        // pour pouvoir changer la valeur ("ON",  "OFF")
bool memselectedLIGHT_flag = selectedLIGHT_flag;        //memoire pour LIGHT flag
bool selectedLOCO_ADD_flag = false;                     // pour pouvoir changer la valeur PWM
bool memselectedLOCO_ADD_flag = selectedLOCO_ADD_flag;  // memoire LOCO ADD flag

bool LCD_flag = true;         // pour mettre à jour la valeur
bool Selection_flag = false;  // update selection

int LIGHT_Value = 0;  //valeur que prendra item 1 (LIGHT)
int LOCO_ADD_Value = 10;  //valeur que prendra item 2 (LOCO ADD)


boolean etatLIGHT;                       // HIGH / LOW
volatile boolean flag_clignote = false;  //

//***************** MESURE DE TENSION **********************************
// Sur Arduino la Tension Max à ne pas dépasser sur les Entrées Analogiques = 5V 
// pour mesurer 10V il faut un pont diviseur = (R1/(R1+R2)) d'un rapport de 1/2 (R1 = R2 = 10Kohm) 
// pour 15V il faut un rapport de 1/3 (R1 = 10Kohm, R2 = 20Kohm)
// pour mesurer 16V il faut un rapport de 1/3.2 (R1 = 10Kohm, R2 = 22Kohm)
const float R1 = 10000;          // 
const float R2 = 6800;          // R2 = 6800 pour 8.4v

float digitalVolt = 0;          // Pour la lecture digitale sur A0 ==> 0...1023
float analogVolt = 0;           // Pour convertir vers analog: 0...5v
float vBatt = 0;                // Tension mesuree
float previous_analogVolt = 0;  // Ancienne valeur

      // ***************** déclaration des fonctions **************
float vInput(float a, float b, float c);
// void checkBatt();


// ************** Constante et Variable pour la transmission radio **********************
int DESTINATION_RADIO_ID = LOCO_ADD_Value;  // Identifiant du récepteur qUi corerspondra au LOCO ADDRESS
const static uint8_t RADIO_ID = 1;          // Identifiant de l'émetteur
const static uint8_t PIN_RADIO_CE = 48;     // test en 48 au lieu de 9
const static uint8_t PIN_RADIO_CSN = 49;    //test en 49 au lieu de 10
int LAMPE = LIGHT_Value;                    // variable pour envoyer les donnees d eclairage

NRFLite _radio;

int POT_Value = 0;  // variable ou on stock la POT_Value du potentiometre
int bpAru = 0;      // variable pour le bouton d'arret d'urgence
int bpAruMem = 0;   // variable pour la memoire du bouton arret d'urgence
int ARU = 0;        // variable pour l'etat de l'arret d'urgence à transmettre

// ************** Création de la structure contenant les variables à envoyer **************

struct RadioPacket {
  int POT_Value;
  int ARU;
  int LAMPE;
};

RadioPacket _radioData;  // declaration de la variable associée a la structure

// ************** DEFINITION DU NOM DES LOCOS ********************************************

String L10("Rusty");  // nom loco associé à l'adresse RADIO ID 10
String L11("L11");    // nom loco associé à l'adresse RADIO ID 11
String L12("L12");
String L13("L13");
String L14("L14");
String L15("L15");
String L16("L16");
String L17("L17");
String L18("L18");
String L19("L19");
String L20("L20");
String L21("L21");
String L22("L22");
String L23("L23");
String L24("L24");
String L25("L25");
String clear("             ");  // 10 espaces pour effacer le nom de la loco au augmenter si nom plus long




// **************  CREATION DU LOGO et des ICONES en custom character *********************

byte Loco1[8] = {
  0b00000,
  0b00000,
  0b11111,
  0b11100,
  0b00100,
  0b00100,
  0b00011,
  0b00011
};

byte Loco2[8] = {
  0b00000,
  0b00000,
  0b10011,
  0b10001,
  0b10001,
  0b10001,
  0b11111,
  0b11111
};

byte Loco3[8] = {
  0b00000,
  0b00000,
  0b11000,
  0b10000,
  0b10000,
  0b10000,
  0b11000,
  0b11100
};

byte Loco4[8] = {
  0b00111,
  0b11111,
  0b11111,
  0b11111,
  0b11000,
  0b10011,
  0b00111,
  0b00011
};

byte Loco5[8] = {
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b01100,
  0b00001,
  0b10011,
  0b00001
};

byte Loco6[8] = {
  0b11110,
  0b11100,
  0b11000,
  0b11000,
  0b00100,
  0b10010,
  0b11011,
  0b10000
};

byte arrow[8] = {
  // creation d'1 flêche (custom character)
  0b10000,  //  *
  0b11000,  //  * *
  0b01100,  //   * *
  0b00111,  //    * * *
  0b01100,  //   * *
  0b11000,  //  * *
  0b10000,  //  *
  0b00000   //
};

byte box[8] = {
  // creation d'1 carré (custom character)
  0b00000,  //
  0b00000,  //
  0b11111,  //  * * * * *
  0b11111,  //  * * * * *
  0b11111,  //  * * * * *
  0b11111,  //  * * * * *
  0b11111,  //  * * * * *
  0b00000   //
};

// **************************************************************************************
//                               SETUP LU 1 SEULE FOI
// **************************************************************************************

void setup() {

  pinMode(A0, INPUT);  // pin pour lecture tension batterie
  pinMode(A2, INPUT);  // pin pour le potentiometre
  pinMode(9, INPUT);   // pin pour le bouton d'arret d'urgence
  Serial.begin(9600);  //initialisation comm serie

  if (!_radio.init(RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN)) {
    Serial.println("Cannot communicate with radio");
    while (1)
      ;
  }

  lcd.init();       // initialiser l'ecran
  lcd.backlight();  // allumer le retro éclairage

  // CREER LES CHARACTERES SPECIAUX EN LES ASSOCIANTS A DES NUMEROS DE 0 à 7

  lcd.createChar(0, Loco1);  // creation des 6 parties du logo
  lcd.createChar(1, Loco2);
  lcd.createChar(2, Loco3);
  lcd.createChar(3, Loco4);
  lcd.createChar(4, Loco5);
  lcd.createChar(5, Loco6);
  lcd.createChar(6, arrow);  // creation du caractère flêche
  lcd.createChar(7, box);    // creation du caractère carré

  //---on decode la rotation à l'aide des interruptions (et la library "Rotary.h") ---
  attachInterrupt(0, rotate, CHANGE);  // appel de la function "rotate()" sur CHANGE
  attachInterrupt(1, rotate, CHANGE);  // fonction "rotate()" to be called on a change

  //--------- les fonctions liées au bouton (click et longpress) ---------
  key.attachClick(shortKeyPress);             // fonction à appeler lors d'un singleclick
  //key.attachLongPressStart(updateItemValue);  // fonction à appeler lors d'un longpress

  //-----------------  Ecran LOGO ou Bienvenu  --------------

  lcd.clear();  // effacer l'écran

  // Ecrire un message sur l'ecran
  lcd.setCursor(4, 0);  //placer curseur colonne 5 ligne 0
  lcd.print("TELECOMMANDE");

  lcd.setCursor(6, 1);  //placer curseur colonne 7 ligne 1
  lcd.print("TRAIN DE");

  lcd.setCursor(7, 2);  //placer curseur colonne 8 ligne 2
  lcd.print("JARDIN");

  lcd.setCursor(16, 3);
  lcd.print("V1.6");

  // AFFICHER LE LOGO EN CHARACTERE SPECIAUX A GAUCHE

  lcd.setCursor(1, 1);
  lcd.write(0);  // Loco1

  lcd.setCursor(2, 1);
  lcd.write(1);  // Loco2

  lcd.setCursor(3, 1);
  lcd.write(2);  // Loco3

  lcd.setCursor(1, 2);
  lcd.write(3);  // Loco4

  lcd.setCursor(2, 2);
  lcd.write(4);  // Loco5

  lcd.setCursor(3, 2);
  lcd.write(5);  // Loco6

  // AFFICHER LE LOGO EN CHARACTERE SPECIAUX A DROITE


  lcd.setCursor(16, 1);
  lcd.write(0);  // Loco1

  lcd.setCursor(17, 1);
  lcd.write(1);  // Loco2

  lcd.setCursor(18, 1);
  lcd.write(2);  // Loco3

  lcd.setCursor(16, 2);
  lcd.write(3);  // Loco4

  lcd.setCursor(17, 2);
  lcd.write(4);  // Loco5

  lcd.setCursor(18, 2);
  lcd.write(5);  // Loco6

  delay(3000);  // affichage de l'ecran d'accueil 3 secondes

  //-----------------  les constantes de l'écran  --------------
  lcd.clear();              //effacer l'Ecran pour ecrire les 2 lignes du menu
  lcd.setCursor(1, 1);      // colonne 1, ligne 1
  lcd.print(menuItems[0]);  // objet 1 premiere valeur du tableau menuItems
  lcd.setCursor(1, 2);      // colonne 1, ligne 2
  lcd.print(menuItems[1]);  // Objet_2 deuxieme valeur du tableau
}


// *********************  *******************  *************************
//                        BOUCLE PRINCIPALE REPETITIVE
// *********************************************************************

void loop() {
 
  ArretUrgence();  // verification de l'arret d'urgence

  //**************** gestion du menu dans la boucle *****************
  key.tick();
  if (LCD_flag == true) {                                               // autorisé à mettre à jour le LCD ?  ...
    updateLCD();                                                        // ... alors va mettre à jour le LCD ...
    if (selectedLIGHT_flag == true || selectedLOCO_ADD_flag == true) {  //... si un des menus est déja selectionné...
      // ...rien à faire, sinon
    } else {
      updateArrowPosition();  //va mettre à jour la nouvelle position du pointeur
    }
    LCD_flag = false;  // reset le flag (pour un autre changement)
  }

  if (Selection_flag == true) {  // autoriser la mise à jour (">")
    updateSelection();           // remplacer le pointeur (">") par 1 carré sur le LCD
    Selection_flag = false;      // reset le flag (pour un autre changement)
  }

  tensionBATTERIE(); // calcul de la tension batterie

  ecrireVARIABLE();  // ecrire les variable a transmettre

  lecturePOT();  // lecture du potentiometre de vitesse

  creationSTRUCTURE();  // creation de la structure à envoyer par radio

  transmissionRADIO();  // transmettre les données par radio à la loco selcetionnee

  printSERIAL();  // ecrire dans le moniteur serie


}
// *******************   FIN DE LA BOUCLE   L o o p  ***************************



// *****************************************************************************
//                     DEFINITION DES FONCTIONS
// *****************************************************************************

// ************** Fonction Arret d'Urgence *************************************

void ArretUrgence() {
  bpAru = digitalRead(9);  // on lit l'etat du bouton en D9

  if (bpAru != bpAruMem)  // si l'etat actuel du bouton poussoir est different de l'etat precedent
  {
    bpAruMem = bpAru;  // on memorise le nouvel etat dans la memoire
    if (bpAru == 1)    // si ce nouvel etat est passe a 1,on a donc un front montant
    {
      ARU = !ARU;  // on change l'etat de la variable arret d'urgence
    }
  }

  if (ARU == 1)  // si arret d'urgence ON
  {
    Serial.println("Etat arret urgence : ON");
    lcd.setCursor(1, 3);
    lcd.print("STOP");
  } else {
    Serial.println("Etat arret urgence : OFF");
    lcd.setCursor(1, 3);
    lcd.print("    ");
  }
}

//************* CALCUL TENSION BATTERIE **************************

void tensionBATTERIE(){
   digitalVolt = analogRead(A0);         // digitally measuring input: 0...1023
   analogVolt = (digitalVolt/1023)*5;   // convertion digital(0...1023) ==> analog(0...5v)
   //delay(1000);
     if (analogVolt != previous_analogVolt) {    // si nouvelle valeur...
          Serial.print("Lecture sur l'entree A0 = ");
    Serial.println(digitalVolt);              // 0...1023
    Serial.println("");       // new line
    Serial.println("Le resultat en Volt est de:");
    Serial.print("(");              // 0...1023
    Serial.print(digitalVolt);              // 0...1023
    Serial.print(" / 1023) x 5 = "); 
    Serial.print(analogVolt,3);                 // 0...5v
    Serial.println(" Volts");
    Serial.println("");       // new line
    vBatt = vInput(analogVolt, R1, R2);       // fonction à 3 params 
    Serial.println("La tension Batterie est donc de:");  // print
    Serial.print(analogVolt); Serial.print(" / (");Serial.print(R1,0);Serial.print(" / (");
    Serial.print(R1,0); Serial.print(" + "); Serial.print(R2,0); Serial.println("))");
    Serial.print(" = ");
    Serial.print(analogVolt); Serial.print(" / ");Serial.print(R1/(R1+R2),3);
    Serial.print(" = "); Serial.println(vBatt,3);   // valeur avec 3 decimales
    Serial.println(" ***** ***** ***** ***** *****");       // Pour séparer
    Serial.println("");                   // new line
   
    previous_analogVolt = analogVolt;     // memorise la valeur
//**** affichage tension batterie sur LCD ****    
    lcd.setCursor (10, 3);      // ligne 3 case 8
    lcd.print("Batt=");
    lcd.print(vBatt,2);             // ecrire la tension avec 3 digits
    lcd.print("V"); 
     }
}

float vInput(float a, float b, float c) { 
  float result = a / (b /(b + c));   // vBatt = 0...5V / (10000 / 10000 + 6800) ==> 0...5V / 0,312       
  return result;
}

// ************LECTURE POTENTIOMETRE *****************************************

void lecturePOT() {
  POT_Value = analogRead(A2);  // on lit les données pin A2
}

// *******************ENREGISTREMENT DES VARIABELS DANS LA STRUCTURE *************

void creationSTRUCTURE() {
  _radioData.POT_Value = POT_Value;
  _radioData.ARU = ARU;
  _radioData.LAMPE = LAMPE;
}

// ******************* TRANSMISSION DES DONNEES **********************************

void transmissionRADIO() {

  if (_radio.send(DESTINATION_RADIO_ID, &_radioData, sizeof(_radioData)))  // on envoit la structure precedement rempli a l'adresse selectionnee
  {
    Serial.println(" ...Succes");
  } else {
    Serial.println(" ...Echec");
  }

 // delay(500);
}

//************ key.attachClick(shortKeyPress)********************************

void shortKeyPress() {
  switch (menuCounter) {
    case 0:
      selectedLIGHT_flag = !selectedLIGHT_flag;  //on inverse l'état du drapeau
      break;

    case 1:
      selectedLOCO_ADD_flag = !selectedLOCO_ADD_flag;
      break;
  }

  LCD_flag = true;        // mettre à jour l'afficheur
  Selection_flag = true;  //autoriser la mise à jour (">")

  if (selectedLIGHT_flag == true) {  //***** MENU_1 *****
    switch (LIGHT_Value) {
      case 0:
        //flag_clignote = 0;
        LIGHT_Value = 0;  // mettre la variable LIGHT_Value à LOW
        break;

      case 1:
        LIGHT_Value = 1;  // mettre la variable LIGHT_Value à HIGH
        //flag_clignote = 0;
        break;

        // case 2:
        //   flag_clignote = 1;                         autoriser le clignotement
        // break;
    }
  } else if (selectedLOCO_ADD_flag == true) {  //***** MENU_2 *****
  }
}

// ********************* Interruption de l'encodeur *********************
//
// La rotation de l'encodeur nous permet de modifier la valeur de l'objet s'il est selectionné.
// Si aucun objet n'est selectionné, la rotation va modifier le compteur de menus "menuCounter"
// qui nous permet de naviguer dans les menus à l'aide du pointeur ">".

void rotate() {

  unsigned char result = myRotary.process();  //  la biblio Rotary.h fait tout le travail
  if (selectedLIGHT_flag == true) {           // = on peut modifier la valeur de l'ojet 1
    if (result == DIR_CW) {                   // rotation Horaire (Clockwise)
      LIGHT_Value++;                          // = " ON ", " blink ", " OFF "
      if (LIGHT_Value > 1) {                  // la valeur doit être comprise entre 0 et 1
        LIGHT_Value = 0;                      // valeur 0 ==> "OFF"
      }
    } else if (result == DIR_CCW) {  // encodeur AntiClockwise
      LIGHT_Value--;                 // = " OFF ", , " ON "
    }
    if (LIGHT_Value < 0) {
      LIGHT_Value = 1;  // valeur 2 ==> "OFF"
    }
  }

  else if (selectedLOCO_ADD_flag == true) {  // autorisé à modifier la valeur de l'ojet 2?
    if (result == DIR_CCW) {                 // rotation antiHoraire (CounterClockWise)
      LOCO_ADD_Value += 1;                   // LOCO adress +1
      if (LOCO_ADD_Value > 25) {
        LOCO_ADD_Value = 25;  // adresse max 25
      }
    } else if (result == DIR_CW) {  // rotation horaire (ClockWise)
      LOCO_ADD_Value -= 1;          // LOCO adresse -1
      if (LOCO_ADD_Value < 10) {
        LOCO_ADD_Value = 10;  // adresse min 10
      }
    }

  } else {                   //***** le Compteur de menu *****
    if (result == DIR_CW) {  // rotation Horaire (Clockwise)
      menuCounter++;         // Max 2 valeurs(0 et 1 pour 2 items)
      if (menuCounter > 1) {
        menuCounter = 0;
      }
    } else if (result == DIR_CCW) {  // rotation Antihoraire (CounterClockwise)
      menuCounter--;
      if (menuCounter < 0) {
        menuCounter = 1;
      }
    }
  }
  LCD_flag = true;  //valider le flag pour aller mettre à jour le LCD
}
// ***************** Fin de l'Interruption de l'encodeur **************************

// ************************* Mettre à jour l'afficheur ****************

void updateLCD() {

//** affichage du menu **
  lcd.setCursor(9, 1);                //ligne 1, colonne 9
  lcd.print("       ");               //effacer par un espace
  lcd.setCursor(9, 1);                //ligne 1, colonne 9
  lcd.print(menuLIGHT[LIGHT_Value]);  //print {"OFF","ON"};

  lcd.setCursor(12, 2);       //ligne 2, colonne 12
  lcd.print("       ");       //effacer par un espace
  lcd.setCursor(12, 2);       //ligne 2, colonne 12
  lcd.print(LOCO_ADD_Value);  //affiche la variable ( la valeur numerique)

//** affichage du nom des locos selon leur Adresse **
  switch (LOCO_ADD_Value) {

    case 10:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L10);       // ecrire le nom de la loco L10
      break;

    case 11:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L11);       // ecrire le nom de la loco L11
      break;

    case 12:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L12);       // ecrire le nom de la loco L12
      break;

    case 13:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L13);       // ecrire le nom de la loco L13
      break;

    case 14:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L14);       // ecrire le nom de la loco L14
      break;

    case 15:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L15);       // ecrire le nom de la loco L15
      break;

    case 16:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L16);       // ecrire le nom de la loco L16
      break;

    case 17:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L17);       // ecrire le nom de la loco L17
      break;

    case 18:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L18);       // ecrire le nom de la loco L18
      break;

    case 19:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L19);       // ecrire le nom de la loco L19
      break;

    case 20:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L20);       // ecrire le nom de la loco L20
      break;

    case 21:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L21);       // ecrire le nom de la loco L21
      break;

    case 22:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L22);       // ecrire le nom de la loco L22
      break;

    case 23:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L23);       // ecrire le nom de la loco L23
      break;

    case 24:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L24);       // ecrire le nom de la loco L24
      break;

    case 25:
      lcd.setCursor(3,0);  // se mettre ligne 0 case 3
      lcd.print(clear);     // effacer le texte present
      lcd.setCursor(3,0);
      lcd.print(L25);       // ecrire le nom de la loco L25
      break;
  }
}

// ****************          Mise a jour du pointeur        ****************

void updateArrowPosition() {
  // ***** d'abord effacer l'ancien arrow ">"
  lcd.setCursor(0, 1);  //ligne 1, colonne 0
  lcd.print(" ");       //effacer par un espace vide
  lcd.setCursor(0, 2);  //ligne 2, colonne 0
  lcd.print(" ");       //effacer par un espace
  // ***** Puis le redessiner à la nouvelle position
  switch (menuCounter) {  //Selon la valeur du compteur (0 = ligne 0, 1 = ligne 1)
    case 0:
      lcd.setCursor(0, 1);  //ligne 1, colonne 0
      lcd.write(byte(6));   //dessiner une fleche
      break;

    case 1:
      lcd.setCursor(0, 2);  //ligne 2, colonne 1
      lcd.write(byte(6));   //dessiner une fleche
      break;
  }
}

// ****************          Si un objet est choisit la fleche devient carré          ****************
void updateSelection() {
  if (selectedLIGHT_flag == true) {  // objet_1 selectionné
    lcd.setCursor(0, 1);             // ligne 1, colonne 0
    lcd.write(byte(7));              //dessiner un carré
  }
  //-------------------
  if (selectedLOCO_ADD_flag == true) {  // objet_2 selectionné
    lcd.setCursor(0, 2);                // ligne 2, colonne 0
    lcd.write(byte(7));                 // dessiner un carré
  }
}

// ****************          key.attachLongPressStart(updateItemValue)          ****************
//void updateItemValue() {
//  if (selectedLIGHT_flag == true) {  //***** MENU_1 *****
//    switch (LIGHT_Value) {
//      case 0:
        //flag_clignote = 0;
//        LIGHT_Value = 0;  // mettre la variable LIGHT_Value à LOW
//        break;

//      case 1:
//        LIGHT_Value = 1;  // mettre la variable LIGHT_Value à HIGH
        //flag_clignote = 0;
//        break;

        // case 2:
        //   flag_clignote = 1;                         autoriser le clignotement
        // break;
//    }
//  } else if (selectedLOCO_ADD_flag == true) {  //***** MENU_2 *****
//  }
//}

//********************** Ecrire les valeurs dans les variables arpes avoir quitte le menu ******

void ecrireVARIABLE() {
  if (selectedLOCO_ADD_flag != memselectedLOCO_ADD_flag) {  // LOCO ADD flag est different de la memoire
    memselectedLOCO_ADD_flag = selectedLOCO_ADD_flag;       //on memorise l'etat du flag

    if (selectedLOCO_ADD_flag == 0) {  // si on n'est plus dans le menu 2

      DESTINATION_RADIO_ID = LOCO_ADD_Value;  // copie de la valeur LOCO_ADD_Value dans DESTINATION_RADIO_ID
    }
  }
  if (selectedLIGHT_flag != memselectedLIGHT_flag) {  // si light flag different de la memoire
    memselectedLIGHT_flag = selectedLIGHT_flag;       // on mémorise l'état de light flag 

    if (selectedLIGHT_flag == 0) {  // si on n'est plus dans le menu 1

      LAMPE = LIGHT_Value;  // copie la valeur de LIGHT_Vlaue dans LAMPE
    }
  }
}

//**********************  ecrire dans le moniteur série ***********************
void printSERIAL() {
  Serial.print("adresse de la loco:");
  Serial.println(LOCO_ADD_Value);

  Serial.print("adresse radio:");
  Serial.println(DESTINATION_RADIO_ID);

  Serial.print("etat de la variable LIGHT Value:");
  Serial.println(LIGHT_Value);

  Serial.print("etat variable LAMPE:");
  Serial.println(LAMPE);

  Serial.print("etat variable POT_Value : ");
  Serial.println(POT_Value);

  Serial.print("etat variable  selectedLOCO_ADD_flag :");
  Serial.println(selectedLOCO_ADD_flag);

  Serial.print("etat variable  memselectedLOCO_ADD_flag :");
  Serial.println(memselectedLOCO_ADD_flag);
}