#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2);
const int buttonSelect=8;
int upCounter = 0;
int downCounter = 0;
int selectCounter = 0;
int allCounter = 0;
int menuIndex=0;
int menuLevel=0;
const int potPin = A3;
int potVal = 0;
int prevVal = 0;
int val = 0;
int a = 2;
int ooo;
String mainMenu[]={
"Settings",
"Info",
"Power off",
};
const int mainMenuLength = sizeof(mainMenu) / sizeof(mainMenu[0]);
String settingsMenu[] = {
"Light",
"Contrast",
"back"
};
const int settingsMenuLength = sizeof(settingsMenu) / sizeof(settingsMenu[0]);
String infoMenu[] = {
"FIO",
"Group",
"City",
"Buttons",
"back",
};
const int infoMenuLength = sizeof(infoMenu) / sizeof(infoMenu[0]);
unsigned long lastPressTime = 0;
unsigned long currentTime = 0;
const unsigned long debounceDelay = 200;
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
pinMode(buttonSelect, INPUT_PULLUP);
displayMenu();
}
void loop() {
currentTime = millis();
potVal = analogRead(potPin);
val = map(potVal, 0, 750, 0, a);
if (currentTime - lastPressTime >= debounceDelay) {
if (val < prevVal) {
moveUp();
lastPressTime = currentTime;
prevVal = val;
upCounter++;
allCounter++;
Serial.println("Value: " + String(val));
Serial.println("PotValue: " + String(potVal));
}
if (val > prevVal) {
moveDown();
lastPressTime = currentTime;
prevVal = val;
downCounter++;
allCounter++;
Serial.println("Value: " + String(val));
Serial.println("PotValue: " + String(potVal));
}
if(digitalRead(buttonSelect) == LOW) {
selectOption();
lastPressTime = currentTime;
selectCounter++;
allCounter++;
Serial.println("Value: " + String(val));
Serial.println("PotValue: " + String(potVal));
}
}
}
void displayMenu(){
lcd.clear();
if (menuLevel == 0) {
lcd.setCursor(0,0);
lcd.print(">"+ mainMenu[menuIndex]);
if (menuIndex + 1 < mainMenuLength) {
lcd.setCursor(0,1);
lcd.print(" " + mainMenu[menuIndex + 1]);
}
}
else if (menuLevel == 1) {
lcd.setCursor(0,0);
lcd.print(">"+ settingsMenu[menuIndex]);
if (menuIndex + 1 < settingsMenuLength) {
lcd.setCursor(0,1);
lcd.print(" " + settingsMenu[menuIndex + 1]);
}
}
else if (menuLevel == 2) {
lcd.setCursor(0,0);
lcd.print(">"+ infoMenu[menuIndex]);
if (menuIndex + 1 < infoMenuLength) {
lcd.setCursor(0,1);
lcd.print(" " + infoMenu[menuIndex + 1]);
}
}
}
void moveUp() {
delay(100);
menuIndex--;
if(menuIndex<0){
menuIndex=a;
}
displayMenu();
}
void moveDown() {
delay(100);
menuIndex++;
if(menuIndex>a){
menuIndex=0;
}
displayMenu();
}
void selectOption() {
if (menuLevel == 0) {
if (menuIndex == 0) {
menuLevel = 1;
menuIndex = 0;
a = 2;
displayMenu();
}
else if (menuIndex == 1) {
menuLevel = 2;
menuIndex = 1;
a = 3;
displayMenu();
}
else if (menuIndex == 2) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("GGG");
delay(2000);
lcd.noBacklight();
}
}
else if (menuLevel == 1) {
if (menuIndex == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Light");
delay(2000);
displayMenu();
}
else if (menuIndex == 1) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Contr");
delay(2000);
displayMenu();
}
else if (menuIndex == 2) {
menuLevel = 0;
menuIndex = 0;/////////////
a = 2;
displayMenu();
}
}
else if (menuLevel == 2) {
if (menuIndex == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Terehov.I.N");
delay(1000);
displayMenu();
}
else if (menuIndex == 1) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("63-D9-3KCK");
delay(1000);
displayMenu();
}
else if (menuIndex == 2) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("YFA");
delay(1000);
displayMenu();
}
else if (menuIndex == 3) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("up= " + String(upCounter) + ";down= " + String(downCounter) + ";");
lcd.setCursor(0, 1);
lcd.print("sel= " + String(selectCounter) + ";all= " + String(allCounter) + ";");
delay(2000);
displayMenu();
}
else if (menuIndex == 4) {
a=2;
menuLevel = 0;
menuIndex = 1;
Serial.println(" " +String (menuLevel));
displayMenu();
}
}
}