Bonjour,
J'aimerais avoir de l'aide car le menu que j'essai de mettre en place ne fonctionne pas et je ne vois pas pourquoi.
Voici le code :
#include <LiquidCrystal.h>
#include <JC_Button.h>
// LCD ----------------------------
#define D0 38
#define D1 39
#define D2 40
#define D3 41
#define D4 42
#define D5 43
#define D6 44
#define D7 45
#define E 46
#define RW 47
#define RS 48
#define BL A12
// Keyboard -----------------------
#define KBD0 31
#define KBD1 32
#define KBD2 33
#define KBD3 34
#define KBD4 35
#define KBD5 36
#define KBD6 37
#define KLED 30
// LCD
LiquidCrystal lcd(RS, RW, E, D0, D1, D2, D3, D4, D5, D6, D7);
bool inMenu = false;
byte enter[] = {B00000, B00000, B00101, B01001, B11111, B01000, B00100, B00000}; // 0x08
byte arrowUp[] = {B00000, B00100, B01110, B10101, B00100, B00100, B00100, B00000}; // 0x01
byte arrowDown[] = {B00000, B00100, B00100, B00100, B10101, B01110, B00100, B00000}; // 0x02
char lcdMenuLine1[20] = "";
char lcdMenuLine2[20] = "";
char lcdMenuLine3[20] = "";
char lcdMenuLine4[20] = "";
// Keyboard
Button s0(KBD0);
Button s1(KBD1);
Button s2(KBD2);
Button s3(KBD3);
Button s4(KBD4);
Button s5(KBD5);
Button s6(KBD6);
uint8_t pumpStartHour = 8;
uint8_t pumpMinWorkingHours = 4;
void mainMenu()
{
byte timeout = 0;
// Disable main LCD task
inMenu = true;
sprintf(lcdMenuLine1, "\x01=Set filter pump ");
// Clear LCD
lcd.clear();
lcd.setCursor(0,0);
lcd.print(lcdMenuLine1);
lcd.setCursor(0,3);
lcd.print("\x08=Quit");
delay(100);
do
{
// Read buttons
s0.read();
s1.read();
s2.read();
s3.read();
s4.read();
s5.read();
s6.read();
// s1 -> Set filter pump
if (s1.wasPressed())
{
setFilterPumpMenu();
s0.read();
timeout = 0;
delay(100);
}
delay(100);
timeout++;
}while ((!s0.wasPressed()) && (timeout < 100));
inMenu = false;
// EEPROM
//EEPROM.writeDouble(addrPumpStartHour, 8);
//EEPROM.writeDouble(addrPumpMinWorkingHours, 4);
//EEPROM.writeDouble(addrTemperature1Calibration, 0.45);
}
void setFilterPumpMenu()
{
byte timeout = 0;
sprintf(lcdMenuLine1, "\x01=Set start time %02d ", pumpStartHour);
sprintf(lcdMenuLine2, "\x02=Set min work %02d ", pumpMinWorkingHours);
// Clear LCD
lcd.clear();
lcd.setCursor(0,0);
lcd.print(lcdMenuLine1);
lcd.setCursor(0,1);
lcd.print(lcdMenuLine2);
lcd.setCursor(0,3);
lcd.print("\x08=Quit");
delay(100);
do
{
// Read buttons
s0.read();
s1.read();
s2.read();
s3.read();
s4.read();
s5.read();
s6.read();
// s1 -> Set start time
if (s1.wasPressed())
{
setStartTimeFilterPumpMenu();
timeout = 0;
}
// S2 -> Set min work
if (s2.wasPressed())
{
setMinWorkingTimeFilterPumpMenu();
timeout = 0;
}
delay(100);
timeout++;
}while ((!s0.wasPressed()) && (timeout < 100));
}
void setStartTimeFilterPumpMenu()
{
}
void setMinWorkingTimeFilterPumpMenu()
{
}
void setup()
{
// LCD
lcd.createChar(0, enter);
lcd.createChar(1, arrowUp);
lcd.createChar(2, arrowDown);
lcd.begin(20, 4);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Version 1.0b");
lcd.setCursor(0,3);
lcd.print("\x08=Menu");
// Buttons
s0.begin();
s1.begin();
s2.begin();
s3.begin();
s4.begin();
s5.begin();
s6.begin();
}
void loop()
{
// Read buttons
s0.read();
s1.read();
s2.read();
s3.read();
s4.read();
s5.read();
s6.read();
// Enter menu = S0
if (s0.wasPressed())
{
mainMenu();
digitalWrite(KLED, HIGH);
delay(100);
digitalWrite(KLED, LOW);
}
lcd.clear();
lcd.setCursor(0,3);
lcd.print("\x08=Menu");
delay(100);
}
Le problème est que quand je vais dans le menu, il entre bien dans la méthode : setFilterPumpMenu() et je m'attends ici a voir les 2 premières lignes :
lcdMenuLine1
lcdMenuLine2
Mais je vois uniquement la ligne lcdMenuLine2. Je ne comprends pas pourquoi.
Une idée ?