Navigation écran LCD

Bonjour à tous :slight_smile:

J’ai un soucis avec ma navigation sur écran lcd. Je vous explique rapide mon soucis :

J’ai deux boutons de navigation pour aller en haut et en bas dans mon menu, j’ai 4 states, une qui affiche le menu température, préssion, humidité et config.

Le problème est que quand j’appuie sur le bouton pour aller d’une state à l’autre (température à préssion par exemple) l’arduino saute 3 state pour arriver sur la dernière state.

C’est bizarre je trouve aucune faute dans mon code…

Mon code :

// Station météo 0.1
// By Paul *******

#include <LiquidCrystal.h>

LiquidCrystal lcd(12,11,5,4,3,2);

const int outOfLoop = 555;

int buttonDown = 9;
int buttonUp = 8;
int buttonEnter = 7;
int buttonMenu = 6;

int loopState = 0; // 0 = Menu, 1 = Température, 2 = Préssion, 3 = Humidité, 4 = Configuration
int whichMenu = 0; // 1 = Température, 2 = Préssion, 3 = Humidité, 4 = Configuration

int buttonDownState = 0;
int buttonUpState = 0;
int buttonEnterState = 0;
int buttonMenuState = 0;

boolean isOnMenu = false;

byte accent_aigu[8] = {
	0b00010,
	0b00100,
	0b01110,
	0b10001,
	0b11111,
	0b10000,
	0b01110,
	0b00000
};

void setup() {
  pinMode(buttonDown,INPUT);
  pinMode(buttonUp,INPUT);
  pinMode(buttonEnter,INPUT);
  pinMode(buttonMenu,INPUT);
  
  lcd.createChar(0, accent_aigu);
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("-- Bienvenue! --");
  lcd.setCursor(0,1);
  lcd.print("D"); lcd.write((uint8_t)0); lcd.print("marage...");
  delay(1000);
  lcd.clear();
}

void loop() {
  //---------------------------------------------
  buttonDownState = digitalRead(buttonDown);
  buttonUpState = digitalRead(buttonUp);
  buttonEnterState = digitalRead(buttonEnter);
  buttonMenuState = digitalRead(buttonMenu);
  // ---------------------------------------------
  
  //---------------------------------------------
  if(loopState == 0) { // Partie du menu n°1 (Température)
   drawMenu();
   lcd.print("1.Temp"); lcd.write((uint8_t)0); lcd.print("rature"); 
   
   if(buttonDownState == HIGH) {
     lcd.clear();
     loopState = 1;   
   }
   if(buttonEnterState == HIGH) {
     lcd.clear();
     isOnMenu = true;
     whichMenu = 1;
   }
  }
  //---------------------------------------------
  if(loopState == 1) { // Partie du menu n°2 (Préssion)
   drawMenu();
   
   lcd.print("2.Pr"); lcd.write((uint8_t)0); lcd.print("ssion"); 
   
   if(buttonDownState == HIGH) {
     lcd.clear();
     loopState = 2;
   }
   
   if(buttonUpState == HIGH) {
    lcd.clear();
    loopState = 0;  
   }
   
   if(buttonEnterState == HIGH) {
     lcd.clear();
     isOnMenu = true;
     whichMenu = 2;
   }
  }
  //---------------------------------------------
  if(loopState == 2) { // Partie du menu n°3 (Humidité)
   drawMenu();
   lcd.print("3.Humidit"); lcd.write((uint8_t)0);   
 
   if(buttonUpState == HIGH) {
    lcd.clear();
    loopState = 1;  
   }
   if(buttonDownState == HIGH) {
     lcd.clear();
     loopState = 3;
   }  
  }
  
  if(loopState == 3) { // Partie du menu n°4 (Humidité)
   drawMenu();
   lcd.print("4. Configuration"); 
 
   if(buttonUpState == HIGH) {
    lcd.clear();
    loopState = 2;  
   }  
  }
  
  //---------------------------------------------
  if(isOnMenu == true) { // Dans les menus
   loopState = outOfLoop;
   
   if(whichMenu == 1) { // Température 
    lcd.setCursor(0,0);
    lcd.print("Ici température");
   }
   
   if(whichMenu == 2) { // Présion 
    lcd.setCursor(0,0);
    lcd.print("Ici préssion");
   } 
 }
 //--------------------------------------------- 
}

void drawMenu() {
  lcd.setCursor(0,0);
  lcd.print(">>>>> Menu <<<<<");
  lcd.setCursor(0,1);
}

Merci d’avance :slight_smile:

bonjour,

peut être a cause des rebonds quand on appuie sur les boutons, essai de rajouter des delay(100); apres chaque digitalRead.

bonjour, voir anti rebond sur le net ou le forum ;)

J’ai déjà essayer, malheuresement rien ne fonctionne…

input pullup déjà sur chaque bouton et voir une fois de plus anti rebond de plus tu lis le bouton et après tu fais des if, donc l'antirebond ne sert a rien ;)

if(digitalRead(buttonDown)== HIGH){
     lcd.clear();
     loopState = 1;  
delay(500);

}

essaie de le fair avec la liaison serie sans l'ecran lcd - teste ton ecran lcd avec un programme simple pour voir s'il fonctionne correctement.