T.T.2.J : Le code complet de la télécommande V1.6
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 :
- premier test de transmission radio
- mesure de la tension batterie
- transmission de plusieurs paramètres par radio
- arrêt d’urgence
- logo de la page d’accueil
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);
}
Laisser un commentaire