[Conseil] Menu et changement de variable

Bonjour à tous,

je bute sur un projet depuis quelques temps : j’utilise souvent des conditions de test d’heure de début et de fin et un module RTC et c’est pas pratique de devoir brancher l’ordinateur et re-téleverser le code en ayant changer une condition en manuel et je voudrais donc avec un ensemble de menu, bouton, écran LCD et potentiomètre, pouvoir naviguer et modifier directement une condition (heure de début et de fin dans ce cas).

je ne me suis pas encore attaquer à modifier l’heure réel donnée par le module RTC DS3231, d’abord chaque chose en son temps, uniquement les heures de début et de fin, conditions testées par mon programme.

En PJ, un schéma de ce que je veux faire (c’est toujours plus pratique que des longues phrases).

je me suis inspiré de deux tutos trouvés sur le net :

SKYDUINO
IHM

et voici mon code :

#include <LiquidCrystal.h>
#include <EEPROM.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
/*déclaration des variable en sortie*/

int heure_debut;
int heure_fin;
int valPot=0; //variable pour récupérer la valeur de tension du potentiomètre. On l'initialise à 0.
int Consigne_hf = 0; 
int Consigne_hd = 0; 
 
byte shouldExitMenu = false; // Devient true quand l'utilisateur veut quitter le menu


/*Les variables du MENU*/
int unsigned Menu = 0; 
int unsigned SousMenu = 0 ; /* Cette variable permet d'afficher les sous menus
/* VAriable gestion du temps */
double Tempo = millis(); 

  /*Déclaration des boutons de navigation*/

int UP = 6;
int DOWN = 7;
const int SELECT = 10;     
const int LEFT = 8;     
const int RIGHT = 9;    
 

typedef enum {
  BP_NONE,   // Aucun bouton appuyé
  BP_SELECT, // Bouton SELECT
  BP_LEFT,   // Bouton gauche
  BP_RIGTH,  // Bouton droite
  BP_UP,     // Bouton haut
  BP_DOWN    // Bouton bas
} Button_t;


typedef struct {
  /* Une structure permet de faire une liste de variables qui pourront être appelées avec un index numérique. */
  String Menu;
}
/* Définition du ou des champs de la structure */
TypeMenu; /*Nom de la Structure */
TypeMenu NumMenu[100]; 

  
void Initialisation() {
  /* Création de la base de donnée, on remarquera que les dizaines
      avec  pour unité "0" correspondent au Menu ! et les autre (11, 12, 13, ) aux sous Menus !  */
  NumMenu[10] = (TypeMenu) { //donc ici nous avons un menu
    "1. régler heure"
  }; /*10, 11 ,12 ... correspondent à l'index  */
  NumMenu[11] = (TypeMenu) {//et ici un sous menu
    "1.1 regler heure"
  };
  NumMenu[12] = (TypeMenu) {
    "1.2 EXIT "
  };
  NumMenu[20] = (TypeMenu) {
    "2 changer heure"
  };
  NumMenu[21] = (TypeMenu) {
    "2.1 heure début"
  };
  NumMenu[22] = (TypeMenu) {
    "2.2 heure fin"
  };
  NumMenu[23] = (TypeMenu) {
    "2.3 EXIT "
  };
  NumMenu[30] = (TypeMenu) {
    "3. EXIT"
  };

  }
void setup() {
  Serial.begin(9600);
  Initialisation();
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("  * MENU *  ");
  delay(1000);
  //Boutons poussoir en entrée en pullu
  pinMode(SELECT, INPUT_PULLUP);
  pinMode(UP, INPUT_PULLUP);
  pinMode(DOWN, INPUT_PULLUP);
  pinMode(LEFT, INPUT_PULLUP);
  pinMode(RIGHT, INPUT_PULLUP);
}
void loop() {
  Boutons(); /* Sous programme lecture des Boutons */
}

void AfficheMenu() { /* Les Index avec "0" comme unité affichés sur la ligne du haut */
  if (Menu == 0 ) {
    Menu = 30;
  }
  if (Menu == 40 ) {
    Menu = 10;
  }
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(NumMenu[Menu].Menu);
  lcd.setCursor(0, 1);
  if ( SousMenu < 0 ) {
    SousMenu = 0;
  }
  if (NumMenu[Menu + SousMenu].Menu == "") {/* Détection de la fin des sous menu pour un menu Selectionné */
    SousMenu = 0;
  }
  if (Menu + SousMenu > Menu) {
    lcd.print(NumMenu[Menu + SousMenu].Menu);
  }/* Les Index avec autre que "0" comme unité affichés sur la ligne du bas */
}

Button_t readPushButton(void) {
  if (digitalRead(RIGHT) == LOW) return BP_RIGTH;  
  if (digitalRead(UP) == LOW) return BP_UP; 
  if (digitalRead(DOWN) == LOW)  return BP_DOWN; 
  if (digitalRead(LEFT) == LOW) return BP_LEFT; 
  if (digitalRead(SELECT) == LOW) return BP_SELECT; 
 
  /* Par défaut aucun bouton n'est appuyé */
  return BP_NONE;
}

void Boutons() {

byte buttonPressed; 
buttonPressed = readPushButton();
  while(!shouldExitMenu) {
  
  if ( millis() > Tempo ) {
    if (digitalRead(LEFT) == LOW) {
      SousMenu++;
      Tempo = millis() + 250;//ici c'est le temps max d'appuie sur le bouton avant de passer au prochain menu.
      AfficheMenu();//}
    } else if (digitalRead(DOWN) == LOW) {
      Menu = Menu - 10;
      Tempo = millis() + 250;
      SousMenu = 0 ;
      AfficheMenu();
    } else if (digitalRead(UP) == LOW) { 
      Menu = Menu + 10;
      Tempo = millis() + 250;
      SousMenu = 0;
      AfficheMenu();
    } else if (digitalRead(RIGHT) == LOW) { 
      SousMenu--;
      Tempo = millis() + 250;
      AfficheMenu();//}
    } else if (digitalRead(SELECT) == LOW) { 
      Tempo = millis() + 250;
      
switch (Menu + SousMenu) {
case 11 :

lcd.clear();
lcd.print(h);
lcd.print(":");
lcd.print(m);
       
break;

case  12 :
 shouldExitMenu = true; // on retourne à l'affichage initiale du menu

break;
case 21 ://règle heure de debut

lcd.clear();
Serial.println("choix reglage heure debut");
lcd.setCursor(0, 0);


 do {
    Regler_heure_debut();
  } 
  while(buttonPressed = BP_NONE);
shouldExitMenu = false;
break;


case 22 : // heure de fin
  lcd.clear();
Serial.println("choix reglage heure fin");
lcd.setCursor(0, 0);
 do {

Regler_heure_fin();
  } 
  while(buttonPressed = BP_NONE);
shouldExitMenu = false;

  
break;

case 23 : //exit

lcd.clear();
 shouldExitMenu = true; //exit et retour au menu principal
break;

case 30 :// exit
lcd.clear();
 shouldExitMenu = true; //exit et retour au menu principal
         break;
         }
      }
    
}
}
}

void Regler_heure_debut(){

byte buttonPressed;

buttonPressed = readPushButton();

  switch(buttonPressed) {
case BP_NONE :

  
valPot=analogRead(A0);
lcd.print("heure debut :");


int Consigne_hd = map(valPot, 0, 1023, 0, 23); //fonction de mappage
Consigne_hd=heure_debut;
Serial.println(Consigne_hd);
lcd.print(Consigne_hd);
lcd.setCursor(0, 1);
lcd.print("heure fin :");

break ;

case BP_SELECT:

  lcd.clear();
  lcd.print("SAVE?");
  
  switch (buttonPressed) {
  case BP_LEFT :
  //  shouldExitMenu = true;

   break ;
    
  case BP_RIGTH :
      EEPROM.put( 0, heure_debut); // on écrit sur l'eeprom la nouvelle valeur de l'heure de début)
       lcd.clear();
       lcd.print("DONE");
    //shouldExitMenu = true;
        break ;
  }
 break ; 
}
  }

void Regler_heure_fin(){
  
 byte buttonPressed;


buttonPressed = readPushButton();
  switch(buttonPressed) {
case BP_NONE :

  delay(100);
  valPot=analogRead(A0);
  lcd.setCursor(0, 0);
  lcd.print("heure debut :");
  lcd.print(heure_debut);
   int Consigne_hf = map(valPot, 0, 1023, 0, 23); //fonction de mappage
   Consigne_hf=heure_fin;

   Serial.println(Consigne_hf);
      lcd.print(Consigne_hf);
  lcd.setCursor(0, 1);
  lcd.print("heure fin :");
  lcd.print(heure_fin);
break ;

case BP_SELECT:


  lcd.clear();
  lcd.print("SAVE?");
  switch (buttonPressed) {
    
  case BP_LEFT :
    shouldExitMenu = true; // exit et retour au menu principal

    break ;
    
  case BP_RIGTH :
      EEPROM.put( 2, heure_fin); // on écrit sur l'eeprom la nouvelle valeur de l'heure de début
       lcd.clear();
       lcd.print("DONE");
  shouldExitMenu = true; //exit et retour au menu principal
        break ;
  }
  break ;
}
    
  }

dans ce qui fonctionne : naviguer dans le menu et sous menu

dans ce qui ne fonctionne pas : tous le reste :slight_smile:
Exit ne renvoi pas au plus haut niveau, l’affiche de la consigne réglée par le potentiomètre ne se met pas à jour sur l’affichage LCD, je n’arrive pas à accéder à SAVE et de ce qui en découle
bref je patauge et je ne comprend pas pourquoi ça ne marche pas.

j’en appelle à votre aide pour des conseils qui me permettraient de résoudre ce projet :slight_smile:

Merci d’avance

Bonjour

Bien lire ceci , puis demander au Modérateur (lien Report to Moderator) de déplacer au bon endroit le fil de discussion. De tout évidence il ne concerne pas quelquechose de FINI
On vient dans ce sous-forum découvrir (et présenter) les travaux achevés