#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
int index = 0;
const int buttonPins[] = {6, 7, 8}; // Масив с пиновете за бутоните (gPin, rPin, bPin)
int buttonStates[] = {LOW, LOW, LOW}; // Състояния на бутоните (gPin, rPin, bPin)
char Menu[4][6] = {"LED 1", "LED 2", "LED 3", "LED 4"}; // Масив с имената на LED опциите
uint8_t kur[8] = { // Масив за "kur" символ
0b00100,
0b01010,
0b01010,
0b01010,
0b01110,
0b10101,
0b10101,
0b01010
};
uint8_t pacman[8] = { // Масив за "pacman" символ
0b00000,
0b00000,
0b01110,
0b11011,
0b11111,
0b01110,
0b00000,
0b00000
};
uint8_t pacmanOpen[8] = { // Масив за "pacmanOpen" символ
0b00000,
0b00000,
0b01110,
0b11011,
0b11100,
0b01110,
0b00000,
0b00000
};
// Двумерен масив за текстови съобщения, използвани в програмата
char messages[2][15] = {
"Избор на LED", // Message за избор на LED
"Натиснете бутон" // Message за указване на действия
};
long lastDebounceTime = 0;
long debounce = 50;
bool predmenuExecuted = false; // Променлива за следене дали predmenu вече е изпълнена
void setup() {
// Настройка на пиновете за бутоните като входове
for (int i = 0; i < 3; i++) {
pinMode(buttonPins[i], INPUT);
}
lcd.init();
lcd.backlight();
// Стартова анимация
lcd.setCursor(0, 0);
for (int i = 0; i < 8; i++) {
lcd.setCursor(i, 0);
lcd.print("L");
lcd.setCursor(i - 1, 0);
lcd.print(" ");
delay(200);
}
for (int i = 19; i > 10; i--) {
lcd.setCursor(i, 0);
lcd.print("S");
lcd.setCursor(i + 1, 0);
lcd.print(" ");
delay(200);
}
for (int i = 3; i >= 0; i--) {
lcd.setCursor(9, i);
lcd.print("G");
lcd.setCursor(9, i + 1);
lcd.print(" ");
delay(400);
}
delay(2000);
}
void loop() {
// Четем състоянията на бутоните и ги записваме в масива
for (int i = 0; i < 3; i++) {
buttonStates[i] = digitalRead(buttonPins[i]);
}
// Изпълнява се predmenu само веднъж при стартиране
if (!predmenuExecuted) {
predmenu();
predmenuExecuted = true; // Задава се на true след изпълнението на predmenu
}
// Преход към меню при натискане на някой бутон
if ((buttonStates[0] == HIGH || buttonStates[1] == HIGH || buttonStates[2] == HIGH)
&& (millis() - lastDebounceTime > debounce)) {
lastDebounceTime = millis();
lcd.clear();
menu();
}
}
void predmenu() {
// Задаване на специални символи от масивите
lcd.createChar(1, kur);
lcd.createChar(2, pacman);
lcd.createChar(3, pacmanOpen);
for (int i = 1; i <= 19; i++) {
lcd.setCursor(i, 2);
lcd.print("\1");
delay(50);
lcd.setCursor(i - 1, 2);
lcd.print("\3");
delay(200);
if (i >= 1) {
lcd.setCursor(i - 1, 2);
}
lcd.print("\2");
delay(200);
if (i >= 1) {
lcd.setCursor(i - 1, 2);
lcd.print(" ");
}
delay(200);
/* if(i==19){
lcd.setCursor(19, 2);
lcd.print("\2");
delay(200);
lcd.print(" ");*/
}
lcd.setCursor(19, 2);
for (int i = 19; i >= 0; i--) {
lcd.setCursor(i, 2);
lcd.print("\1");
lcd.setCursor(i + 1, 2);
lcd.print(" ");
delay(200);
if (i == 0){
lcd.setCursor(i , 2);
lcd.print(" ");
}
}
}
void menu() {
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(messages[0]); // Показване на съобщението за избор на LED
lcd.setCursor(7, 2);
lcd.print(Menu[index]); // Показване на текущия елемент от менюто
// Проверка за натиснат бутон за промяна на опцията
int up = digitalRead(buttonPins[2]);
if (up == HIGH && (millis() - lastDebounceTime > debounce)) {
lastDebounceTime = millis();
index++;
// Ограничаване на индекса в рамките на менюто
if (index >= 4) {
index = 0;
}
lcd.clear();
lcd.setCursor(7, 2);
lcd.print(Menu[index]); // Показване на новия елемент от менюто
}
}