Вопрос по созданию меню

Мистер Грин

✩✩✩✩✩✩✩
26 Апр 2020
2
0
Друзья приветствую, если кто-то сможет помочь будет супер.
Создано меню на операторе выбора Switch подскажите как сделать подменю одного из case. (точнее разместить несколько переменных на одном экране меню в разных строках (использую дисплей 2004) и переключаться между ними для изменения параметров( в моём случае это состояние выходов реле вкл/выкл), или возможно только размещение одного параметра на одном экране ? , работаю с библиотекой GyverEncoder. Хотелось бы чтобы было возможно поворотом вправо или влево изменять состояние, а допустим нажатием переключаться между переменными.



Функция обработки энкодера:
void ReadEncoder() {

  if (enc.isTurn()) {
    //1.Если был поворот

    //    Serial.println("Пововорот");
    if (enc.isRightH()) {                           // Если поворот с нажатием вправо, то переходим на следующий экран меню
      //      Serial.println("Поворот вправо, с нажатием");
      counter = 0;
      if (menu > 12) {
        menu = 0;
      }
      menu++;
    }
    else if (enc.isLeftH()) {                     //Если поворот с нажатием влево, то переодим на предидущий экран меню
      //      Serial.println("Поворот влево, с нажатием");
      menu--;
      if (menu < 0) {
        menu = 0;
        DrawLCD();
      }

    }
    //сохраним настройки
    if (menu == 12) {
      menu = 0;
      EEPROM.put(0, TempHeat_On);
      EEPROM.put(20, TempHeat_Off);
      EEPROM.put(40, HumVent_On);
      EEPROM.put(60, HumVent_Off);
      EEPROM.put(80, Uvlag_On);
      EEPROM.put(100, Uvlag_Off);
      EEPROM.put(200, Vent_Active);
      EEPROM.put(201, Poliv_Cond);
      EEPROM.put(203, Vent_Cond);
      EEPROM.put(205, Uvlag_Cond);
      EEPROM.put(207, Heat_Cond);
      //выведем сообщение об успешном сохранении настроек
      for (int i = 0; i <= 15; i++) {
        //     Serial.println(i);
        menu = 11;
        DrawLCD();
      }
      menu = 0;
    }
    DrawLCD();
  }




  //2.Если поворот вправо, то увеличиваем значение на текущем экране.
  if (enc.isRight()) {
    //    Serial.println("Поворот вправо, изменяем настройки ");
    counter = 0;
    switch (menu) {
      case 0:
        menu = 0;
        DrawLCD();
        break;
      case 1:
        menu = 1;
        TempHeat_On += 0.1;
        DrawLCD();
        break;
      case 2:
        menu = 2;
        TempHeat_Off += 0.1;
        DrawLCD();
        break;
      case 3:
        menu = 3;
        HumVent_On++;
        DrawLCD();
        break;
      case 4:
        menu = 4;
        HumVent_Off++;
        DrawLCD();
        break;
      case 5:
        menu = 5;
        Vent_Active += 1;
        DrawLCD();
        break;
      case 6:
        menu = 6;
        Uvlag_On += 0.1;
        DrawLCD();
        break;
      case 7:
        menu = 7;
        Uvlag_Off += 0.1;
        DrawLCD();
        break;
      case 8:
        menu = 8;
        
        Poliv_Cond += 1;
      
        Vent_Cond += 1;
              
        Uvlag_Cond += 1;
          
        Heat_Cond += 1;
        
        DrawLCD();
        break;
      case 9:
        menu = 0;
        DrawLCD();
        break;

    }
  }
  //3.Если поворот влево, то уменьшаем настройки на текущем экране меню.
  else if (enc.isLeft()) {
    //    Serial.println("Поворот влево, изменяем настройки");
    counter = 0;
    switch (menu) {
      case 0:
        menu = 0;
        DrawLCD();
        break;
      case 1:
        menu = 1;
        TempHeat_On -= 0.1;
        DrawLCD();
        break;
      case 2:
        menu = 2;
        TempHeat_Off -= 0.1;
        DrawLCD();
        break;
      case 3:
        menu = 3;
        HumVent_On--;
        DrawLCD();
        break;
      case 4:
        menu = 4;
        HumVent_Off--;
        DrawLCD();
        break;
      case 5:
        menu = 5;
        Vent_Active -= 1;
        DrawLCD();
        break;
      case 6:
        menu = 6;
        Uvlag_On -= 0.1;
        DrawLCD();
        break;
      case 7:
        menu = 7;
        Uvlag_Off -= 0.1;
        DrawLCD();
        break;
      case 8:
        menu = 8;
        Poliv_Cond -= 1;
        
        Vent_Cond -= 1;
        
        Uvlag_Cond -= 1;
        
        Heat_Cond -= 1;
        break;
        DrawLCD();
      case 9:
        menu = 0;
        DrawLCD();
        break;
    }
  }

  //4.двойное нажатие кнопки - включаем подсветку дисплея
  else if (enc.isDouble())
  {
    lcd.backlight();
  }

  //5.длинное нажатие кнопки - отключаем подсветку дисплея
  else if (enc.isHolded())
  {
    lcd.noBacklight();
  }

  //когда ничего не нажато


  //если на экране настройки/информации ничего долго (в течение 10 сек) не нажимается то возвращаемся в режим отображения температуры и влажности
  else if (menu != 0 && counter > 5000) {
    //если возврат производится с какого-либо экрана настройки, то сообщим о том, что настройки не были сохранены
    if (menu < 12) {
      for (int i = 0; i <= 15; i++) {
        //       Serial.println(i);
        menu = 10;
        DrawLCD();
      }
    }
    menu = 0;
    counter = 0;
    DrawLCD();
  }
  counter++; //увеличиваем значение счетчика циклов программы
}

  }
Функция отрисовки экрана:
void DrawLCD() {
  //=========================================================================================
  //МЕНЮ 0 (главный экран)
  //=========================================================================================
  // главный экран СТРОКА 1
  //-----------------------------------------------------------------------------------------
  if (menu == 0) {
    lcd.setCursor(0, 0);
    strOut = MakeString(  rtc.getHours() + (tiktak) + (rtc.getMinutes()) + ("      ") + (rtc.getDate()) + (".") + (rtc.getMonth()) + ("  ") + (rtc.getDay()) );  // строка отображения времени
    lcd.print(strOut);
    //-----------------------------------------------------------------------------------------
    // главный экран СТРОКА 2
    //-----------------------------------------------------------------------------------------
    lcd.setCursor(0, 1);
    strOut = MakeString("T: " + out_t + "*C"); //строка отображения уровня температуры
    lcd.print(strOut);

    lcd.setCursor(11, 1);
    strOut = MakeString("H: " + out_h + "%"); //строка отображения уровня влажности
    lcd.print(strOut);
    //-----------------------------------------------------------------------------------------
    // главный экран СТРОКА 3
    //-----------------------------------------------------------------------------------------
    lcd.setCursor(0, 2);
    strOut = String(DATA) + "   " + Sensorval + " %          ";
    lcd.print(strOut);
    //------------------------------------------------------------------------------------------

    if (Poliv_Cond == 0) {   // Если канал  Обогревателя отключен Heat_State
      lcd.setCursor(0, 3);     //Отображаем на дисплее номер канала С1
      lcd.print(chanel[0]);
      lcd.setCursor(3, 3);
      lcd.print (char(2));
    }
    else {
      lcd.setCursor(3, 3);
      lcd.print (char(1));
    };


    if (Vent_Cond == 0) {
      lcd.setCursor(5, 3);
      lcd.print(chanel[1]);  //Отображаем на дисплее номер канала С2
      lcd.setCursor(8, 3);
      lcd.print (char(2));
    }
    else {
      lcd.setCursor(3, 3);
      lcd.print (char(1));
    };


    if (Uvlag_Cond == 0) {
      lcd.setCursor(10, 3);
      lcd.print(chanel[2]);  //Отображаем на дисплее номер канала С3
      lcd.setCursor(13, 3);
      lcd.print (char(2));
    }
    else {
      lcd.setCursor(3, 3);
      lcd.print (char(1));
    };


    if (Heat_Cond == 0) {
      lcd.setCursor(15, 3);
      lcd.print(chanel[3]);  //Отображаем на дисплее номер канала С4
      lcd.setCursor(18, 3);
      lcd.print (char(2));
    }
    else {
      lcd.setCursor(3, 3);
      lcd.print (char(1));
    };
  }

  //--------------------------------------------------------------------------
  //МЕНЮ 1
  //--------------------------------------------------------------------------
  if (menu == 1) {

    lcd.setCursor(0, 0);
    strOut = MakeString("       MENU-1       ");
    lcd.print(strOut);

    lcd.setCursor(0, 1);
    strOut = MakeString("                    ");
    lcd.print(strOut);

    lcd.setCursor(0, 2);
    strOut = MakeString("  Temp_On: " + String(TempHeat_On) + "*C");
    lcd.print(strOut);

    lcd.setCursor(0, 3);
    strOut = MakeString("                   ");
    lcd.print(strOut);
  }
  //--------------------------------------------------------------------------
  //МЕНЮ 2
  //--------------------------------------------------------------------------
  if (menu == 2) {

    lcd.setCursor(0, 0);
    strOut = MakeString("       MENU-2       ");
    lcd.print(strOut);

    lcd.setCursor(0, 1);
    strOut = MakeString("                    ");
    lcd.print(strOut);

    lcd.setCursor(0, 2);
    strOut = MakeString("  Temp_Off: " + String(TempHeat_Off) + "*C");
    lcd.print(strOut);

    lcd.setCursor(0, 3);
    strOut = MakeString("                     ");
    lcd.print(strOut);
  }
  //--------------------------------------------------------------------------
  //МЕНЮ 3
  //--------------------------------------------------------------------------
  if (menu == 3) {

    lcd.setCursor(0, 0);
    strOut = MakeString("       MENU-3       ");
    lcd.print(strOut);

    lcd.setCursor(0, 1);
    strOut = MakeString("                    ");
    lcd.print(strOut);

    lcd.setCursor(0, 2);
    strOut = MakeString(" HumVent_On: " + String(HumVent_On) + "%");
    lcd.print(strOut);

    lcd.setCursor(0, 3);
    strOut = MakeString("                     ");
    lcd.print(strOut);
  }
  //--------------------------------------------------------------------------
  //МЕНЮ 4
  //--------------------------------------------------------------------------
  if (menu == 4) {

    lcd.setCursor(0, 0);
    strOut = MakeString("       MENU-4        ");
    lcd.print(strOut);

    lcd.setCursor(0, 1);
    strOut = MakeString("                    ");
    lcd.print(strOut);

    lcd.setCursor(0, 2);
    strOut = MakeString("HumVent_Off: " + String(HumVent_Off) + "%");
    lcd.print(strOut);

    lcd.setCursor(0, 3);
    strOut = MakeString("                      ");
    lcd.print(strOut);
  }
  //--------------------------------------------------------------------------
  //МЕНЮ 5
  //--------------------------------------------------------------------------
  if (menu == 5) {

    lcd.setCursor(0, 0);
    strOut = MakeString("       MENU-5        ");
    lcd.print(strOut);

    lcd.setCursor(0, 1);
    strOut = MakeString("                    ");
    lcd.print(strOut);

    lcd.setCursor(0, 2);
    strOut = MakeString("  Vent_Active: " + String(Vent_Active));
    lcd.print(strOut);

    // в верхней строке отображаем состояние увлажнителя
    lcd.setCursor(0, 3);
    strOut = MakeString("                                     ");
    lcd.print(strOut);
  }
  //--------------------------------------------------------------------------
  //МЕНЮ 6
  //--------------------------------------------------------------------------
  if (menu == 6) {

    lcd.setCursor(0, 0);
    strOut = MakeString("       MENU-6       ");
    lcd.print(strOut);

    lcd.setCursor(0, 1);
    strOut = MakeString("                    ");
    lcd.print(strOut);

    lcd.setCursor(2, 2);
    strOut = MakeString("Uvlag_On: " + String(Uvlag_On) + "*C");
    lcd.print(strOut);

    lcd.setCursor(0, 3);
    strOut = MakeString("                   ");
    lcd.print(strOut);
  }
  //--------------------------------------------------------------------------
  //МЕНЮ 7
  //--------------------------------------------------------------------------
  if (menu == 7) {

    lcd.setCursor(0, 0);
    strOut = MakeString("       MENU-7        ");
    lcd.print(strOut);

    lcd.setCursor(0, 1);
    strOut = MakeString("                    ");
    lcd.print(strOut);

    lcd.setCursor(2, 2);
    strOut = MakeString("Uvlag_Off: " + String(Uvlag_Off) + "%");
    lcd.print(strOut);

    lcd.setCursor(0, 3);
    strOut = MakeString("");
    lcd.print(strOut);
  }
  //--------------------------------------------------------------------------
  //МЕНЮ 8
  //--------------------------------------------------------------------------

  if (menu == 8) {
  
    lcd.setCursor(0, 0);
    strOut = MakeString("Poliv_Cond: " + String(Poliv_Cond));
    lcd.print(strOut);

    lcd.setCursor(0, 1);
    strOut = MakeString("Vent_Cond:  " + String(Vent_Cond));
    lcd.print(strOut);

    lcd.setCursor(0, 2);
    strOut = MakeString("Uvlag_Cond: " + String(Uvlag_Cond));
    lcd.print(strOut);

    lcd.setCursor(0, 3);
    strOut = MakeString("Heat_Cond:  " + String(Heat_Cond));
    lcd.print(strOut);
    
  }


  //--------------------------------------------------------------------------
  //МЕНЮ 10
  //--------------------------------------------------------------------------
  if (menu == 10) {
    lcd.setCursor(0, 0);
    strOut = MakeString("                    ");
    lcd.print(strOut);

    lcd.setCursor(0, 1);
    strOut = MakeString("      Settings       ");
    lcd.print(strOut);

    lcd.setCursor(0, 2);
    strOut = MakeString("   are NOT saved      ");
    lcd.print(strOut);

    lcd.setCursor(0, 3);
    strOut = MakeString("                    ");
    lcd.print(strOut);
  }
  //--------------------------------------------------------------------------
  //МЕНЮ 11
  //--------------------------------------------------------------------------
  if (menu == 11) {

    lcd.setCursor(0, 0);
    strOut = MakeString("                    ");
    lcd.print(strOut);

    lcd.setCursor(0, 1);
    strOut = MakeString("      Settings      ");
    lcd.print(strOut);

    lcd.setCursor(0, 2);
    strOut = MakeString("     are saved       ");
    lcd.print(strOut);

    lcd.setCursor(0, 3);
    strOut = MakeString("                    ");
    lcd.print(strOut);
  }

}