Bonjour,
Je suis tout nouveau sur votre forum, j'ai les connaissances de base dans le langage Arduino et j'essaie de faire un menu avec un LCD 4*20 et quelques boutons mais j'ai bien des soucis : Ce que je pensai simple au départ s'averre plus compliqué.
Je voudrai faire un menu avec 7 entrées, qui, quand on sélectionne l'une d'elle, on arrive sur un choix de sous-menu(en option), puis en validant l'un d'entre eux , on active un programme( j'ai écris les différents programmes qui animent le décor d'une maquette de train et, eux, fonctionnent bien).
J'ai fait un switch d'une variable(pointeurMenu)incrémentée par deux boutons et dans chaque case, j'indique au LCD son affichage.
Pour chacune des pages, des flèches indiquent les directions à prendre: ^:haut, v:bas, >:droite,<:gauche .
Mais l'affichage est déplorable, ça clignote très vite et toute la page ne s'affiche pas.
Par contre, si je mets une valeur dans pointeurMenu qui ne correspond pas à une case, là, l'afficheur devient stable et affiche correctement la page.
Je joints mon code, si quelqu'un a une idée, elle serait le bien venue...
#include <LiquidCrystal.h> //Bibliothèque pour gérer le LCD
#include <RBD_Timer.h> // Bibliothèque pour gérer les boutons
#include <RBD_Button.h>
RBD::Button boutonHaut(A5, true); //Déclaration des boutons
RBD::Button boutonBas(A4, true);
RBD::Button boutonDroit(A2, true);
RBD::Button boutonGauche(A1, true);
RBD::Button boutonValidation(A3, true);
bool OK = boutonValidation.onPressed(); // Bouléen pour valider les programmes
#define CONTRAST_PIN 9
#define BACKLIGHT_PIN 7
#define CONTRAST 110
LiquidCrystal lcd(12,11,5,4,3,2,BACKLIGHT_PIN, POSITIVE);
byte pointeurMenu = 0; //Variable indiquant les pages du menu
const byte valeurMin=0; // Valeur minimum du pointeurMenu
const byte valeurMax=70; // Valeur maximum du pointeurMenu
byte programme;
byte PWMleds = 125;
byte PWMhalogene = 125;
byte PWMleds1 = 250;
byte PWMhalogene1 = 250;
unsigned long dernierClic = 0;
/************************************LIRE LES BOUTONS*********************************************/
void lireBouton() {
if (millis()-dernierClic>=200) {
if(boutonBas.onPressed()) {
if(pointeurMenu<valeurMax){pointeurMenu = pointeurMenu+10;}
dernierClic = millis();
}
else if(boutonHaut.onPressed()) {
if(pointeurMenu>valeurMin){pointeurMenu = pointeurMenu-10;}
dernierClic = millis();
}
else if(boutonDroit.onPressed()) {
pointeurMenu = pointeurMenu+1;
dernierClic = millis();
}
else if(boutonGauche.onPressed()) {
pointeurMenu = pointeurMenu-1;
dernierClic = millis();
}
}
}
/***************************************PANNEAU D'ACCEUIL***************************************/
void acceuil() {
lcd.clear();
lcd.print("GARE DE CHATEAUVIEUX");
lcd.setCursor(0,2);
lcd.print(" ANNEES 60... ");
lcd.setCursor(0,3);
lcd.print("V V");
}
/*****************************************MISE EN ROUTE*****************************************/
void miseEnRoute() {
lcd.clear();
lcd.print("^ CHATEAUVIEUX ^");
lcd.setCursor(0,1);
lcd.print(" >");
lcd.setCursor(0,2);
lcd.print(" MISE EN ROUTE ");
lcd.setCursor(0,3);
lcd.print("v v");
}
/*********************************MISE EN ROUTE Sous-Menu UN************************************/
void miseEnRouteUn() {
lcd.clear();
lcd.print(" CHATEAUVIEUX ");
lcd.setCursor(0,1);
lcd.print("< >");
lcd.setCursor(0,2);
lcd.print(" SOU-MENU: ");
lcd.setCursor(0,3);
lcd.print(" HALOGENE:");
lcd.setCursor(13,3);
lcd.print(PWMhalogene);
}
/********************************MISE EN ROUTE Sous-Menu DEUX************************************/
void miseEnRouteDeux() {
lcd.clear();
lcd.print(" CHATEAUVIEUX ");
lcd.setCursor(0,1);
lcd.print("< >");
lcd.setCursor(0,2);
lcd.print("REGLAGE LEDS:");
lcd.setCursor(13,2);
lcd.print(PWMleds);
}
/******************************************MAINTENANCE******************************************/
void maintenance() {
lcd.clear();
lcd.print("^ CHATEAUVIEUX ^");
lcd.setCursor(0,1);
lcd.print(" >");
lcd.setCursor(0,2);
lcd.print(" MAINTENANCE ");
lcd.setCursor(0,3);
lcd.print("v v");
}
/******************************************MAINTENANCE SouMenu UN******************************************/
void maintenanceUn() {
lcd.clear();
lcd.print("^ CHATEAUVIEUX ^");
lcd.setCursor(0,1);
lcd.print("< >");
lcd.setCursor(0,2);
lcd.print("Halogènes:");
lcd.setCursor(13,2);
lcd.print(PWMhalogene1);
}
/*************************************MAINTENANCE SouMenu Deux************************************/
void maintenanceDeux() {
lcd.clear();
lcd.print(" CHATEAUVIEUX ");
lcd.setCursor(0,1);
lcd.print("< >");
lcd.setCursor(0,2);
lcd.print("REGLAGE LEDS:");
lcd.setCursor(13,2);
lcd.print(PWMleds1);
}
/**************************************ESSAI DES ECLAIRAGES*************************************/
void essaiEclairage() {
lcd.clear();
lcd.print("^ CHATEAUVIEUX ^");
lcd.setCursor(0,2);
lcd.print(" ESSAI ECLAIRAGE ");
lcd.setCursor(0,3);
lcd.print("v v");
}
/*****************************************JOURNEE D'ETE*****************************************/
void jourEte() {
lcd.clear();
lcd.print("^ CHATEAUVIEUX ^");
lcd.setCursor(0,2);
lcd.print(" JOURNEE D'ETE ");
lcd.setCursor(0,3);
lcd.print("v v");
}
/********************************************HIVER**********************************************/
void hiver() {
lcd.clear();
lcd.print("^ CHATEAUVIEUX ^");
lcd.setCursor(0,2);
lcd.print(" DANS LE FROID ");
lcd.setCursor(0,3);
lcd.print("v DE L'HIVER v");
}
/*****************************************JOUR ET NUIT******************************************/
void jourNuit() {
lcd.clear();
lcd.print("^ CHATEAUVIEUX ^");
lcd.setCursor(0,2);
lcd.print(" JOUR ET NUIT ");
lcd.setCursor(0,3);
lcd.print("v v");
}
/*****************************************NUIT FESTIVE******************************************/
void nuitFestive() {
lcd.clear();
lcd.print("^ CHATEAUVIEUX ^");
lcd.setCursor(0,2);
lcd.print(" NUIT FESTIVE ");
}
/****************************************INITIALISATION*****************************************/
void setup() {
pinMode(CONTRAST_PIN, OUTPUT);
analogWrite ( CONTRAST_PIN, CONTRAST );
lcd.begin(20,4);
lcd.backlight();
Serial.begin(9600);
}
/****************************************BOUCLE*************************************************/
void loop() {
Serial.println(pointeurMenu);
lireBouton();
switch (pointeurMenu) {
case 0 : acceuil();
break;
case 10 : miseEnRoute();if(OK){programme =1;}
break;
case 11 : miseEnRouteUn(); // Sous-Menu1 du programme 1
break;
case 12 : miseEnRouteDeux(); // Sous-Menu2 du programme 1
break;
case 20 : maintenance();if(OK){programme =2;}
break;
case 21 : maintenanceUn();
break;
case 22 : maintenanceDeux();
break;
case 30 : essaiEclairage();if(OK){programme =3;}
break;
case 40 : jourEte();if(OK){programme =4;}
break;
case 50 : hiver();if(OK){programme =5;}
break;
case 60 : jourNuit();if(OK){programme =6;}
break;
case 70 : nuitFestive();if(OK){programme =7;}
break;
default : pointeurMenu = 0;
}
}