#include <Encoder.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x27,16,2);
Encoder enc(2,3);
const int buttonSelect=4;
int upCounter = 0;
int downCounter = 0;
int selectCounter = 0;
int allCounter = 0;
int menuIndex=0;
int menuLevel=0;
int a = 3;
int pos = 0;
int oldPos = 0;
int value = 0;
int val = 0;
int buttonPin = 4;
bool buttonPressed = false;
bool buttonShortPress = false;
bool buttonLongPress = false;
unsigned long pressDuration;
unsigned long pressStart;
unsigned long lastPressTime = 0;
unsigned long currentTime = 0;
const unsigned long debounceDelay = 200;
String mainMenu[]={
"Settings",
"Info",
"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",
};
const int infoMenuLength = sizeof(infoMenu) / sizeof(infoMenu[0]);
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
lcd.init();
lcd.backlight();
displayMenu();
}
void loop() {
currentTime = millis();
encoder();
if (currentTime - lastPressTime >= debounceDelay) {
if (value == 1) {
moveUp();
lastPressTime = currentTime;
upCounter++;
allCounter++;
}
if (value == -1) {
moveDown();
lastPressTime = currentTime;
downCounter++;
allCounter++;
}
if(buttonShortPress == true) {
selectOption();
buttonShortPress = false;
value = 0;
lastPressTime = currentTime;
selectCounter++;
allCounter++;
}
if(buttonLongPress == true) {
menuLevel = 0;
buttonLongPress = false;
value = 0;
displayMenu();
lastPressTime = currentTime;
}
}
}
void encoder() {
pos = enc.read() / 4;
if (oldPos != pos) {
value = pos - oldPos;
oldPos = pos;
Serial.println(value);
if(value == 1){
val++;
} else if (value == -1){
val--;
}
}
bool buttonState = digitalRead(buttonPin);
if (buttonState == LOW) {
if (!buttonPressed) {
buttonPressed = true;
pressStart = millis();
}
} else if (buttonPressed) {
pressDuration = millis() - pressStart;
if (pressDuration < 500) {
buttonShortPress = true;
Serial.println("Короткое нажатие");
} else {
buttonLongPress = true;
Serial.println("Долгое нажатие");
}
buttonPressed = false;
}
}
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;
}
buttonShortPress = false;
value = 0;
displayMenu();
}
void moveDown() {
delay(100);
menuIndex++;
if(menuIndex>a){
menuIndex=0;
}
buttonShortPress = false;
value = 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 = 2;
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("Kislovodsk");
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();
}
}
}