#include <LiquidCrystal_I2C.h>        // подключаем библиотеку LCD IIC
LiquidCrystal_I2C lcd(0x27,20,4);     // присваиваем имя lcd для дисплея

//Пункты меню, можно добавить до 10
String menuItems[] = {"Meteo", "Meteo+", "Set alarm", "About"};
 
//Переменная для кнопок навигации
int readKey;
 
//Переменные для меню
int menuPage = 0;
int maxMenuPages = round(((sizeof(menuItems) / sizeof(String)) / 2) + .5);
int cursorPosition = 0;
 
//Дополнительные симводы
byte downArrow[8] = {
  0b00100, //   *
  0b00100, //   *
  0b00100, //   *
  0b00100, //   *
  0b00100, //   *
  0b10101, // * * *
  0b01110, //  ***
  0b00100  //   *
};
 
byte upArrow[8] = {
  0b00100, //   *
  0b01110, //  ***
  0b10101, // * * *
  0b00100, //   *
  0b00100, //   *
  0b00100, //   *
  0b00100, //   *
  0b00100  //   *
};
 
byte menuCursor[8] = {
  B01000, //  *
  B00100, //   *
  B00010, //    *
  B00001, //     *
  B00010, //    *
  B00100, //   *
  B01000, //  *
  B00000  //
};
 
byte termometru[8] = //Температура
{
    B00100,
    B01010,
    B01010,
    B01110,
    B01110,
    B11111,
    B11111,
    B01110
};
 
byte picatura[8] = //Влажность
{
    B00100,
    B00100,
    B01010,
    B01010,
    B10001,
    B10001,
    B10001,
    B01110,
};
 
byte ring[8] = //Будильник
{
    B00000,
    B00100,
    B01110,
    B01110,
    B01110,
    B11111,
    B00100,
    B00000
};
 
//Подключение необходимых библиотек
#include <Wire.h>
#include <DS3231.h> //ЧАСЫ
#include <DHT.h> //DHT
//#include <BMP085.h> //BMP
#include <EEPROM.h>
 

DS3231  rtc(SDA, SCL); //ЧАСЫ
Time  t; //ЧАСЫ
//BMP085 dps = BMP085(); //BMP
 
#define DHTPIN 1 //DHT ПИН
#define DHTTYPE DHT22 //Тип DHT
DHT dht(DHTPIN, DHTTYPE); //DHT
 
long Temperature = 0, Pressure = 0, Altitude = 0; //BMP
 
#define tonePin 11 //Пин пьезоэлемента
 
void setup() {
  //Serial.begin(9600);
  rtc.begin(); //ЧАСЫ
  dht.begin(); //DHT
  Wire.begin(); //Для BMP
  dps.init(MODE_ULTRA_HIGHRES, 14000, true); //BMP, 130 Метров над уровнем моря
 
 lcd.init();                   // инициализация LCD дисплея
 lcd.backlight();               // включение подсветки дисплея
 lcd.createChar(1, termometru);   // инициализация своих символов
 
  //Создание дополнительных символов
  // lcd.createChar(0, menuCursor);
  // lcd.createChar(1, upArrow);
  // lcd.createChar(2, downArrow);
 
  // lcd.createChar(3, termometru);
  // lcd.createChar(4, picatura);
  // lcd.createChar(5, ring);
 
  analogWrite(10, 155); //Яркость (до 255)
 
  //Нужно для того, что бы при перезагрузке перекидывало на то меню в котором мы были последний раз
  if (EEPROM.read(0) == 1){
    menuItem1();
  } else if (EEPROM.read(0)==2){
    menuItem2();
  } else if (EEPROM.read(0)==3){
    menuItem3();
  } else if (EEPROM.read(0)==4){
    menuItem4();
  } else if (EEPROM.read(0)==5){
    menuItem5();
  } else if (EEPROM.read(0)==0){ }
}
 
void loop() {
  mainMenuDraw();
  drawCursor();
  operateMainMenu();
}
 
  //Функция будильника, в данном случае пищать зуммером
void ton() {
  lcd.clear();
  delay(250);
  lcd.setCursor(0, 0);
  lcd.print("WAKE UP");
  lcd.setCursor(13, 1);
  lcd.print("NEO...");
 
  tone(tonePin, 440, 250);
  delay(250);
  tone(tonePin, 165, 250);
  delay(250);
  tone(tonePin, 440, 250);
  delay(250);
  delay(250);
  
  tone(tonePin, 440, 250);
  delay(250);
  tone(tonePin, 165, 250);
  delay(250);
  tone(tonePin, 440, 250);
  delay(250);
  delay(250);
  
  tone(tonePin, 330, 125);
  delay(125);
  tone(tonePin, 294, 125);
  delay(125);
  tone(tonePin, 262, 125);
  delay(124);
  tone(tonePin, 494, 125);
  delay(125);
  tone(tonePin, 440, 125);
  delay(125);
  tone(tonePin, 494, 125);
  delay(125);
  tone(tonePin, 262, 125);
  delay(125);
  tone(tonePin, 294, 125);
  delay(125);
  
  tone(tonePin, 330, 250);
  delay(250);
  tone(tonePin, 165, 250);
  delay(250);
  tone(tonePin, 440, 250);
  delay(250);
  
  lcd.clear();
}
 
  //Функция выводящая на экран два пункта меню, они будут менятся при прокрутке
void mainMenuDraw() {
  Serial.print(menuPage);
  lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print(menuItems[menuPage]);
  lcd.setCursor(1, 1);
  lcd.print(menuItems[menuPage + 1]);
  if (menuPage == 0) {
    lcd.setCursor(15, 1);
    lcd.write(byte(2));
  } else if (menuPage > 0 and menuPage < maxMenuPages) {
    lcd.setCursor(15, 1);
    lcd.write(byte(2));
    lcd.setCursor(15, 0);
    lcd.write(byte(1));
  } else if (menuPage == maxMenuPages) {
    lcd.setCursor(15, 0);
    lcd.write(byte(1));
  }
}
 
  //Функция рисуящая курсор в соответствии с выбранным пунктом меню
void drawCursor() {
  for (int x = 0; x < 2; x++) {
    lcd.setCursor(0, x);
    lcd.print(" ");
  }
 
  // The menu is set up to be progressive (menuPage 0 = Item 1 & Item 2, menuPage 1 = Item 2 & Item 3, menuPage 2 = Item 3 & Item 4), so
  // in order to determine where the cursor should be you need to see if you are at an odd or even menu page and an odd or even cursor position.
  if (menuPage % 2 == 0) {
    if (cursorPosition % 2 == 0) {  // If the menu page is even and the cursor position is even that means the cursor should be on line 1
      lcd.setCursor(0, 0);
      lcd.write(byte(0));
    }
    if (cursorPosition % 2 != 0) {  // If the menu page is even and the cursor position is odd that means the cursor should be on line 2
      lcd.setCursor(0, 1);
      lcd.write(byte(0));
    }
  }
  if (menuPage % 2 != 0) {
    if (cursorPosition % 2 == 0) {  // If the menu page is odd and the cursor position is even that means the cursor should be on line 2
      lcd.setCursor(0, 1);
      lcd.write(byte(0));
    }
    if (cursorPosition % 2 != 0) {  // If the menu page is odd and the cursor position is odd that means the cursor should be on line 1
      lcd.setCursor(0, 0);
      lcd.write(byte(0));
    }
  }
}
 
void operateMainMenu() {
  int activeButton = 0;
  while (activeButton == 0) {
    int button;
    readKey = analogRead(0);
    if (readKey < 790) {
      delay(100);
      readKey = analogRead(0);
    }
    button = evaluateButton(readKey);
    switch (button) {
      case 0: //Если ничего не нажато
        break;
      case 1:  //Выполнять действие если нажата "назад"
        button = 0;
        switch (cursorPosition) { //Переходить в то меню, на котором стоит курсор
          case 0:
            menuItem1(); 
            break;
          case 1:
            menuItem2();
            break;
          case 2:
            menuItem3();
            break;
          case 3:
            menuItem4();
            break;
          case 4:
            menuItem5();
            break;
          case 5:
            menuItem6();
            break;
          case 6:
            menuItem7();
            break;
          case 7:
            menuItem8();
            break;
          case 8:
            menuItem9();
            break;
          case 9:
            menuItem10();
            break;
        }
        activeButton = 1;
        mainMenuDraw();
        drawCursor();
        break;
      case 2:
        button = 0;
        if (menuPage == 0) {
          cursorPosition = cursorPosition - 1;
          cursorPosition = constrain(cursorPosition, 0, ((sizeof(menuItems) / sizeof(String)) - 1));
        }
        if (menuPage % 2 == 0 and cursorPosition % 2 == 0) {
          menuPage = menuPage - 1;
          menuPage = constrain(menuPage, 0, maxMenuPages);
        }
 
        if (menuPage % 2 != 0 and cursorPosition % 2 != 0) {
          menuPage = menuPage - 1;
          menuPage = constrain(menuPage, 0, maxMenuPages);
        }
 
        cursorPosition = cursorPosition - 1;
        cursorPosition = constrain(cursorPosition, 0, ((sizeof(menuItems) / sizeof(String)) - 1));
 
        mainMenuDraw();
        drawCursor();
        activeButton = 1;
        break;
      case 3:
        button = 0;
        if (menuPage % 2 == 0 and cursorPosition % 2 != 0) {
          menuPage = menuPage + 1;
          menuPage = constrain(menuPage, 0, maxMenuPages);
        }
 
        if (menuPage % 2 != 0 and cursorPosition % 2 == 0) {
          menuPage = menuPage + 1;
          menuPage = constrain(menuPage, 0, maxMenuPages);
        }
 
        cursorPosition = cursorPosition + 1;
        cursorPosition = constrain(cursorPosition, 0, ((sizeof(menuItems) / sizeof(String)) - 1));
        mainMenuDraw();
        drawCursor();
        activeButton = 1;
        break;
    }
  }
}
 
  //Эта функция вызывается когда нажата какая-либо кнопка и путем считывания напряжения на A0, определить какая именно кнопка нажата
int evaluateButton(int x) {
  int result = 0;
  if (x < 50) {
    result = 1; // Right
  } else if (x < 195) {
    result = 2; // Up
  } else if (x < 380) {
    result = 3; // Down
  } else if (x < 500){
    result = 4; // Left
  } else if (x < 790) {
    result = 5; // Set
  }
  return result;
}
 
  //Функции, рисующие стрелки в настройках
//Установка курсора на минуты
void drawInstructions() {
  lcd.setCursor(5, 2);
  lcd.print("           ");
  lcd.setCursor(10, 1);
  lcd.print("\1"); // Up arrow
}
 
//Установка курсора на часы
void drawInstruction2() {
  lcd.setCursor(5, 2);
  lcd.print("           ");
  lcd.setCursor(7, 1);
  lcd.print("\1");
}
 
//Установка курсора на будильник
void drawInstruction3() {
  lcd.setCursor(5, 2);
  lcd.print("           ");
  lcd.setCursor(13, 1);
  lcd.print("\1");
}
 
 
//Для выхода из меню нужно немного удерживать соответствующие кнопки
void menuItem1() { // Первое меню: вывод только времени с температурой и влажностью
  int activeButton = 0;
  int i=0;
  lcd.clear();
  EEPROM.write(0, 1); //Запись в EEPROM что мы находимся в первом меню
 
  while (activeButton == 0) {
    int button;
    readKey = analogRead(0);
    if (readKey < 790) {
      delay(100);
      readKey = analogRead(0);
    }
    button = evaluateButton(readKey);
    switch (button) {
      case 4:  // Если нажата кнопка "left"
        button = 0;
        activeButton = 1;
        EEPROM.write(0, 0); //Запись в EEPROM что мы вышли в главное меню
        break;
        case 5:  // Если нажата кнопка "set"
        button = 0;
        activeButton = 1;
        EEPROM.write(0, 0); //Запись в EEPROM что мы вышли в главное меню
        break;
        
        default:
        t = rtc.getTime(); //ПЕРЕМЕННАЯ ДЛЯ ВРЕМЕНИ
        
        if (t.hour >= 0 && t.hour < 10) { lcd.setCursor(6, 0); lcd.print("0"); lcd.print(t.hour);} //Часы
        else { lcd.setCursor(6, 0); lcd.print(t.hour);}
        lcd.print(":");
        if (t.min >= 0 && t.min < 10) { lcd.setCursor(9, 0); lcd.print("0"); lcd.print(t.min);} //Минуты
        else { lcd.setCursor(9, 0); lcd.print(t.min);}
        //lcd.print(":");
        
        //Отображение секунд пришлось отключить, т.к. на санятие данных с DHT происходит не мнгновенно
        //и из-за этого секунды так сказать проскакивают
        
        //if (t.sec >= 0 && t.sec < 10) { lcd.setCursor(10, 0); lcd.print("0"); lcd.print(t.sec);} //Секунды
        //else { lcd.setCursor(10, 0); lcd.print(t.sec);}
 
        float temp = dht.readTemperature(); //ПЕРЕМЕННЫЕ ДЛЯ DHT
        float h = dht.readHumidity();
 
        lcd.setCursor(1, 1); //Температура
        lcd.print("\3");
        lcd.setCursor(3, 1);
        lcd.print(temp, 0);
        lcd.print((char)223); //Значек грудуса
        lcd.print("C");
 
        lcd.setCursor(10, 1); //Влажность
        lcd.print("\4");
        lcd.setCursor(12, 1);
        lcd.print(h, 0);
        lcd.print("%");
 
        lcd.setCursor(0, 0);
        if (EEPROM.read(3)==1) {lcd.print("\5");} //Отображение статуса будильника
        else if (EEPROM.read(3)==0) {lcd.print(" ");}
 
        if (EEPROM.read(1)==t.hour && EEPROM.read(2)==t.min && t.sec==0 && EEPROM.read(3)==1) { //Сам будильник
            ton();
          }
    }
  }
}
 
void menuItem2() { //Второе меню: вывод полной даты и всех данных с датчиков
  int activeButton = 0;
  lcd.clear();
  EEPROM.write(0, 2);
 
  while (activeButton == 0) {
    int button;
    readKey = analogRead(0);
    if (readKey < 790) {
      delay(100);
      readKey = analogRead(0);
    }
    button = evaluateButton(readKey);
    switch (button) {
      case 4:  // Если нажата кнопка "left"
        button = 0;
        activeButton = 1;
        EEPROM.write(0, 0);
        break;
        case 5:  // Если нажата кнопка "set"
        button = 0;
        activeButton = 1;
        EEPROM.write(0, 0);
        break;
        default:
        t = rtc.getTime(); //ПЕРЕМЕННАЯ ДЛЯ ВРЕМЕНИ
        
        if (t.hour >= 0 && t.hour < 10) { lcd.setCursor(0, 0); lcd.print("0"); lcd.print(t.hour);} //Часы
        else { lcd.setCursor(0, 0); lcd.print(t.hour);}
        lcd.print(":");
        if (t.min >= 0 && t.min < 10) { lcd.setCursor(3, 0); lcd.print("0"); lcd.print(t.min);} //Минуты
        else { lcd.setCursor(3, 0); lcd.print(t.min);}
 
        if (t.date >= 0 && t.date < 10) { lcd.setCursor(8, 0); lcd.print("0"); lcd.print(t.date);} //День
        else { lcd.setCursor(8, 0); lcd.print(t.date);}
        lcd.print("/");
        if (t.mon >= 0 && t.mon < 10) { lcd.setCursor(11, 0); lcd.print("0"); lcd.print(t.mon);} //Месяц
        else { lcd.setCursor(11, 0); lcd.print(t.mon);}
        lcd.print("/");
        if (t.year >= 0 && t.year < 10) { lcd.setCursor(14, 0); lcd.print("0"); lcd.print(t.year-2000);} //Год
        else { lcd.setCursor(14, 0); lcd.print(t.year-2000);}
        
        float temp = dht.readTemperature(); //ПЕРЕМЕННЫЕ ДЛЯ DHT
        float h = dht.readHumidity();
        
        dps.getPressure(&Pressure); //ПЕРЕМЕННЫЕ ДЛЯ BMP
        dps.getAltitude(&Altitude);
 
        lcd.setCursor(0, 1); //Температура
        lcd.print("\3");
        lcd.setCursor(1, 1);
        lcd.print(temp, 0);
        lcd.print((char)223); //degree sign
        lcd.print("C");
 
        lcd.setCursor(6, 1); //Давление
        lcd.print(Pressure/133.3, 0);
        lcd.print("mm");
 
        lcd.setCursor(12, 1); //Влажность
        lcd.print("\4");
        lcd.setCursor(13, 1);
        lcd.print(h, 0);
        lcd.print("%");
 
        lcd.setCursor(6, 0);
        if (EEPROM.read(3)==1) {lcd.print("\5");} //Отображение статуса будильника
        else if (EEPROM.read(3)==0) {lcd.print(" ");}
 
        if (EEPROM.read(1)==t.hour && EEPROM.read(2)==t.min && t.sec==0 && EEPROM.read(3)==1) { //Сам будильник
            ton();
          }
    }
  }
}
 
void menuItem3() { //Третье меню
  int activeButton = 0;
  int alarmHour = EEPROM.read(1); //В первой ячейке хранится часы будильника
  int alarmMinute = EEPROM.read(2); //Во второй минуты
  int alarmStat = EEPROM.read(3); //В третей статус, включен будильник (1) или нет (0)
  int alarmPos = 1; //Позиция курсора, т.е.что менять: 1-Минуты, 0-Часы, 2-ВКЛ или ВЫКЛ будильника
  
  lcd.clear();
  EEPROM.write(0, 3);
  lcd.setCursor(0, 1);
  drawInstructions();
  lcd.setCursor(0, 0);
  lcd.print("ALARM: ");
  if (alarmHour >=0 && alarmHour < 10) {lcd.print("0"); lcd.print(alarmHour);}
        else lcd.print(alarmHour);
  lcd.setCursor(9, 0);
  lcd.print(":");
  if (alarmMinute >=0 && alarmMinute < 10) {lcd.print("0"); lcd.print(alarmMinute);}
        else lcd.print(alarmMinute);
 
  lcd.setCursor(13, 0);
  if (alarmStat==1) lcd.print("ON");
  else if (alarmStat==0) lcd.print("OFF");
  
  while (activeButton == 0) {
    int button;
    readKey = analogRead(0);
    if (readKey < 790) {
      delay(100);
      readKey = analogRead(0);
    }
    button = evaluateButton(readKey);
    
    switch (button) {
      case 2: //Прибавляем значения минут, часов или ВКЛ будильника, в соответствии где стоит курсор
        if (alarmPos==1){
        button = 0;
        if (alarmMinute==59) alarmMinute=0;
        else alarmMinute = alarmMinute + 1;
        alarmMinute = constrain(alarmMinute,0,60);
        lcd.setCursor(10,0);
        lcd.print("  ");
        lcd.setCursor(10,0);
        if (alarmMinute >=0 && alarmMinute < 10) {lcd.print("0"); lcd.print(alarmMinute);}
        else lcd.print(alarmMinute);
        break;
        } else if (alarmPos==0) {
        button = 0;
        if (alarmHour==23) alarmHour=0;
        else alarmHour = alarmHour + 1;
        alarmHour = constrain(alarmHour,0, 24);
        lcd.setCursor(7,0);
        lcd.print("  ");
        lcd.setCursor(7,0);  
        if (alarmHour >=0 && alarmHour < 10) {lcd.print("0"); lcd.print(alarmHour);}
        else lcd.print(alarmHour);
        break;
        } else if (alarmPos==2) {
        button = 0;
          lcd.setCursor(13, 0);
          lcd.print("ON ");
          alarmStat=1;
        break;
        }
      case 3: //Убавляем значения минут, часов или ВЫКЛ будильника, в соответствии где стоит курсор
        if (alarmPos==1) {
        button = 0;
        if (alarmMinute==0) alarmMinute=59;
        else alarmMinute = alarmMinute - 1;
        alarmMinute = constrain(alarmMinute,0,60);
        lcd.setCursor(10,0);
        lcd.print("  ");
        lcd.setCursor(10,0);
        if (alarmMinute >=0 && alarmMinute < 10) {lcd.print("0"); lcd.print(alarmMinute);}
        else lcd.print(alarmMinute);
        break;
        } else if(alarmPos==0){
        button = 0;
        if (alarmHour==0) alarmHour=23;
        else alarmHour = alarmHour - 1;
        alarmHour = constrain(alarmHour,0, 24);
        lcd.setCursor(7,0);
        lcd.print("  ");
        lcd.setCursor(7,0);  
        if (alarmHour >=0 && alarmHour < 10) {lcd.print("0"); lcd.print(alarmHour);}
        else lcd.print(alarmHour);
        break;
        }else if (alarmPos==2) {
        button = 0;
          lcd.setCursor(13, 0);
          lcd.print("OFF");
          alarmStat=0;
        break;
        }
 
      case 4: // Если нажата кнопка влево, смотрим где стоит курсор в данный момент и переставляем левее
       if (alarmPos==2){
       drawInstructions();
       alarmPos=1;
       } else if (alarmPos==1){
       drawInstruction2();
       alarmPos=0;
       }
        break;
        
      case 1: // Если нажата кнопка вправо, смотрим где стоит курсор в данный момент и переставляем правее
       if (alarmPos==0){
       drawInstructions();
       alarmPos=1;
       } else if (alarmPos==1){
       drawInstruction3();
       alarmPos=2;
       }
        break;
        
      case 5:  // Сохранение времни будильника в его статус (вкл или выкл) в EEPROM
        button = 0;
        lcd.clear();
        lcd.noBlink();
        EEPROM.write(0, 0);
        lcd.setCursor(2,0);
        lcd.print("-- ALARM --");
        lcd.setCursor(2,1);
        lcd.print("-- SAVED --");
        EEPROM.write(1, alarmHour);
        EEPROM.write(2, alarmMinute);
        EEPROM.write(3, alarmStat);
        delay(1500);
        activeButton = 1;
        break;
    }
  }
}
 
void menuItem4() { // Четвертое меню
  int activeButton = 0;
 
  lcd.clear();
  EEPROM.write(0, 5);
  lcd.setCursor(1, 0);
  lcd.print("VALIK");
  lcd.setCursor(11, 1);
  lcd.print("2017");
 
  while (activeButton == 0) {
    int button;
    readKey = analogRead(0);
    if (readKey < 790) {
      delay(100);
      readKey = analogRead(0);
    }
    button = evaluateButton(readKey);
    switch (button) {
      case 4:  // Если нажата кнопка "left"
        button = 0;
        activeButton = 1;
        EEPROM.write(0, 0);
        break;
        case 5:  // Если нажата кнопка "set"
        button = 0;
        activeButton = 1;
        EEPROM.write(0, 0);
        break;
    }
  }
}
 
void menuItem5() { // Пятое меню (Для активации добавить название меню в самом начале)
  int activeButton = 0;
 
  lcd.clear();
  EEPROM.write(0, 4);
  lcd.setCursor(3, 0);
  lcd.print("Hello, World!");
 
  while (activeButton == 0) {
    int button;
    readKey = analogRead(0);
    if (readKey < 790) {
      delay(100);
      readKey = analogRead(0);
    }
    button = evaluateButton(readKey);
    switch (button) {
      case 4:
        button = 0;
        activeButton = 1;
        EEPROM.write(0, 0);
        break;
    }
  }
}
 
 
void menuItem6() { // Шестое меню
  int activeButton = 0;
 
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print("Sub Menu 6");
 
  while (activeButton == 0) {
    int button;
    readKey = analogRead(0);
    if (readKey < 790) {
      delay(100);
      readKey = analogRead(0);
    }
    button = evaluateButton(readKey);
    switch (button) {
      case 4:  // Если нажата кнопка "left"
        button = 0;
        activeButton = 1;
        break;
    }
  }
}
 
void menuItem7() { // Седьмое меню
  int activeButton = 0;
 
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print("Sub Menu 7");
 
  while (activeButton == 0) {
    int button;
    readKey = analogRead(0);
    if (readKey < 790) {
      delay(100);
      readKey = analogRead(0);
    }
    button = evaluateButton(readKey);
    switch (button) {
      case 4:  // Если нажата кнопка "left"
        button = 0;
        activeButton = 1;
        break;
    }
  }
}
 
void menuItem8() { // Восьмое меню
  int activeButton = 0;
 
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print("Sub Menu 8");
 
  while (activeButton == 0) {
    int button;
    readKey = analogRead(0);
    if (readKey < 790) {
      delay(100);
      readKey = analogRead(0);
    }
    button = evaluateButton(readKey);
    switch (button) {
      case 4:  // Если нажата кнопка "left"
        button = 0;
        activeButton = 1;
        break;
    }
  }
}
 
void menuItem9() { // Девятое меню
  int activeButton = 0;
 
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print("Sub Menu 9");
 
  while (activeButton == 0) {
    int button;
    readKey = analogRead(0);
    if (readKey < 790) {
      delay(100);
      readKey = analogRead(0);
    }
    button = evaluateButton(readKey);
    switch (button) {
      case 4:  // Если нажата кнопка "left"
        button = 0;
        activeButton = 1;
        break;
    }
  }
}
 
void menuItem10() { // Десятое меню
  int activeButton = 0;
 
  lcd.clear();
  lcd.setCursor(3, 0);
  lcd.print("Sub Menu 10");
 
  while (activeButton == 0) {
    int button;
    readKey = analogRead(0);
    if (readKey < 790) {
      delay(100);
      readKey = analogRead(0);
    }
    button = evaluateButton(readKey);
    switch (button) {
      case 4:  // Если нажата кнопка "left"
        button = 0;
        activeButton = 1;
        break;
    }
  }
}