#include <LiquidCrystal_I2C.h>
class Menu {
public:
String* elements;
String name;
int numElements;
// Constructeur par défaut
Menu() {
name = "";
elements = nullptr;
numElements = 0;
}
// Constructeur avec des paramètres
Menu(String _name, String* _elements, int _numElements) {
name = _name;
elements = _elements;
numElements = _numElements;
}
void display(LiquidCrystal_I2C& lcd, int rangeBegin, int rangeEnd, int counter) {
lcd.clear();
lcd.setCursor(6, 0);
lcd.print(name);
for (int i = rangeBegin; i < rangeEnd; i++) {
lcd.setCursor(0, i - rangeBegin + 1);
lcd.print(elements[i]);
}
lcd.setCursor(elements[counter - 1].length(), counter - rangeBegin);
lcd.write((byte)0);
}
};
LiquidCrystal_I2C lcd(0x27, 16, 4);
byte customChar[8] = {
0b00000,
0b00100,
0b01000,
0b11111,
0b11111,
0b01000,
0b00100,
0b00000
};
#define outputA 8
#define outputB 6
#define selector_button 7
const int nombre_de_marque = 8;
const int nombre_de_transmission_dodge = 7;
const int nombre_de_transmission_ford = 3;
const int nombre_de_transmission_gm = 3;
String menu_marque[nombre_de_marque] = {"GM", "FORD", "DODGE", "MAZDA", "TOYOTA", "HONDA", "KIA", "AUDI"};
String menu_transmission_dodge[nombre_de_transmission_dodge] {"BACK","45RFE","545RFE","65RFE","66RFE","68RFE","62TE"};
String menu_transmission_ford[nombre_de_transmission_ford] {"BACK","4R70W","4R100"};
String menu_transmission_gm[nombre_de_transmission_gm] {"BACK","4L80", "4L60"};
int counter = 1;
int aState;
int aLastState;
unsigned long debounceDelay_Encoder = 50;
unsigned long debounceDelay_Bouton = 100;
unsigned long lastDebounceTimeEncoder = 0;
unsigned long lastDebounceTimeButton = 0;
int rangeBegin = 0;
int rangeEnd = 3;
int last_value = 1;
Menu marqueMenu("MARQUE", menu_marque, nombre_de_marque);
Menu transmission_dodge_Menu("DODGE", menu_transmission_dodge, nombre_de_transmission_dodge);
Menu transmission_ford_Menu("FORD", menu_transmission_ford, nombre_de_transmission_ford);
Menu transmission_gm_Menu("GM", menu_transmission_gm, nombre_de_transmission_gm);
Menu menuStack[10]; // Vous pouvez ajuster la taille selon vos besoins
int currentMenuIndex = 0; // Indice du menu actuel dans le tableau
void setup() {
pinMode(outputA, INPUT);
pinMode(outputB, INPUT);
pinMode(selector_button, INPUT);
Serial.begin(9600);
aLastState = digitalRead(outputA);
lcd.begin(16, 4);
lcd.createChar(0, customChar);
lcd.backlight();
lcd.clear();
lcd.setCursor(5, 2);
lcd.print("Bienvenue");
delay(1000);
lcd.clear();
lcd.setCursor(6, 0);
lcd.print(marqueMenu.name);
lcd.setCursor(0, 1);
marqueMenu.display(lcd, rangeBegin, rangeEnd, counter);
// Initialiser l'historique des menus avec le menu actuel
menuStack[currentMenuIndex] = marqueMenu;
}
void loop() {
user_input();
lcd_logic();
}
void user_input() {
bool selector_button_state = digitalRead(selector_button);
aState = digitalRead(outputA);
// Gestion du debounce pour l'encodeur
if (aState != aLastState) {
if (millis() - lastDebounceTimeEncoder >= debounceDelay_Encoder) {
if (digitalRead(outputB) != aState) {
counter = min(counter + 1, menuStack[currentMenuIndex].numElements);
} else {
counter = max(counter - 1, 1);
}
lastDebounceTimeEncoder = millis();
}
}
aLastState = aState;
// Gestion du debounce pour le bouton
if (selector_button_state == LOW) {
if (millis() - lastDebounceTimeButton >= debounceDelay_Bouton) {
Menu& currentMenu = menuStack[currentMenuIndex];
if (currentMenu.elements[counter - 1] == "DODGE") { //si selection dodge
currentMenuIndex++;
menuStack[currentMenuIndex] = transmission_dodge_Menu;
}
else if (currentMenu.elements[counter - 1] == "FORD") { //si selection ford
currentMenuIndex++;
menuStack[currentMenuIndex] = transmission_ford_Menu;
}
else if (currentMenu.elements[counter - 1] == "GM") { //si selection gm
currentMenuIndex++;
menuStack[currentMenuIndex] = transmission_gm_Menu;
}
else if (currentMenu.elements[counter - 1] == "BACK" && currentMenuIndex > 0) {
currentMenuIndex--;
}
lastDebounceTimeButton = millis();
Menu& newMenu = menuStack[currentMenuIndex];
lcd.clear();
lcd.setCursor(6, 0);
lcd.print(newMenu.name);
rangeBegin = 0;
rangeEnd = 3;
last_value = 1;
counter = 1;
rangeEnd = min(menuStack[currentMenuIndex].numElements, rangeEnd);
newMenu.display(lcd, rangeBegin, rangeEnd, counter);
}
}
}
void lcd_logic() {
if (counter != last_value) {
if (counter > 3 && counter > last_value) {
rangeBegin++;
rangeEnd++;
last_value = counter;
}
if (counter < menuStack[currentMenuIndex].numElements - 2 && counter < last_value && rangeBegin > 0) {
rangeBegin--;
rangeEnd--;
Serial.println(rangeBegin);
last_value = counter;
}
else {
last_value = counter;
}
menuStack[currentMenuIndex].display(lcd, rangeBegin, rangeEnd, counter);
}
}