15 ноября 2016 в 04:00

Создание меню с помощью программы FLProg tutorial


Добрый день. В программе FLProg начиная с версии 2.1. появились блоки конструктора меню. В данном уроке будет рассмотрено создание меню с помощью данных блоков.

Для того что бы было интереснее рассмотрим реальную задачу. Соберём блок контроля температуры, в который будет входить датчик температуры, нагреватель и вентилятор. Кроме того включение вентилятора или нагревателя будет сопровождаться звуковым сигналом. С помощью меню будем настраивать пороги включения и выключения устройств и необходимость звукового сигнала. Для упрощения отладки датчик температуры для начала будем симулировать с помощью переменного резистора.

Первый вариант устройства будет состоять из:

Arduino Uno:
image

LCD Keypad Shield:
image

Двух релейных блоков:


И активного зуммера:


Вот принципиальная схема устройства



Для начала целиком проект.
image

Рассмотрим каждую плату по отдельности.



Здесь всё просто, получаем значение с аналогового входа и масштабируем в необходимый диапазон. Значение температуры будем изменять от -20 до 80. Настройки блока Scale.





На этой плате анализируется сигнал кнопок LCD Keypad Shield и формируются соответствующие сигналы. Анализ производится с помощью пользовательского блока 5Bin1. Создание данного блока рассматривается в этом уроке, там же можно скачать этот блок.

Поскольку кнопок на шилде маловато, расширим возможности кнопки “Select”.



Данная схема работает следующим образом. При коротком нажатии на кнопку формируется импульс «Зайти в меню», при длительном (длительностью более уставки таймера TON), формируется импульс «Выйти из меню».



На этой плате формируется сигнал активации меню. Таймер TON необходим для защиты от случайного формирования этого сигнала при старте контроллера. Ну и непосредственно плата с основным блоком меню.



В описании блока меню (вкладка «Информация» редактора блока) я постарался максимально полно описать работу блока. Рассмотрим настойки блока в данном конкретном случае.

Вкладка – «Дерево меню»:


Дерево меню состоит из двух групп меню для настроек температур включения и выключения нагревателя и вентиляции, а так же одиночного пункта для управления активностью звука. Вообще данный блок позволяет строить меню любой сложности и вложенности. Главное что бы хватило памяти контроллера.

Настройка группового пункта меню.


Настройки пунктов настроек температуры.


Немного уточню по поводу стартового значения в EEPROM. Это значение запишется в EEPROM в начале первого цикла после загрузки программы в контроллер. Это произойдёт только один раз после каждой новой загрузки программы в контроллер. Остальные пункты меню связанные с температурой аналогичны этому.

Настройки пункта меню управления звуком:


Тексты для True и False будут выводится на выход ValStr при соответствующих значениях пунктов меню.

Закладка – «Управление меню»:


Тут вроде всё интуитивно понятно.

Закладка – «Управление значением»



В выбранном режиме изменений при кратковременном нажатии на кнопку изменения значения оно изменяется на величину заданного шага. Если удерживать данную кнопку более 2 секунд значение будет изменяться на величину заданного шага каждые полсекунды. Если продолжать удерживать кнопку ещё в течении 2 секунд период изменения значения уменьшится до 200 ms.

Закладка «Выхода»


Выход «Активно главное меню» необходимо для формирования сигнала «Активация меню». Последующие две платы практически одинаковы, и в особых объяснениях не нуждаются.



Обращу только внимание на входы CanValUp у блоков MenuValue. При высоком уровне на этом входе значение на выходе Q соответствует значению выбранного пункта меню. По заднему фронту на этом входе значение на выходе «замораживается» до появления на этом входе высокого уровня. Это необходимо для того, что бы значение не изменялось до окончании его редактирования (закрытия меню).

Оставшиеся платы так же просты и не нуждаются в пояснениях.



Результат компиляции проекта
#include <LiquidCrystal.h>
#include <EEPROMex.h>
LiquidCrystal _lcd1(8, 9, 4, 5, 6, 7);
int _dispTempLength1 = 0;
boolean _isNeedClearDisp1;


struct UB_142171746
{
  bool ubo_101667604 = 0;
  bool ubo_51674151 = 0;
  bool ubo_137412502 = 0;
  bool ubo_174461762 = 0;
  bool ubo_157422683 = 0;
  int _gtv1 = 0;
  int _gtv2 = 0;
  int _gtv3 = 0;
  int _gtv4 = 0;
  int _gtv5 = 0;
  bool _bounse1S = 0;
  bool _bounse1O = 0;
  unsigned long _bounse1P = 0UL;
  bool _bounse2S = 0;
  bool _bounse2O = 0;
  unsigned long _bounse2P = 0UL;
  bool _bounse3S = 0;
  bool _bounse3O = 0;
  unsigned long _bounse3P = 0UL;
  bool _bounse4S = 0;
  bool _bounse4O = 0;
  unsigned long _bounse4P = 0UL;
  bool _bounse5S = 0;
  bool _bounse5O = 0;
  unsigned long _bounse5P = 0UL;
};
UB_142171746 UB_142171746_Instance1;
int UB_142171746_ubi_125089190 = 0;
const byte _menuParametrsArray[]  PROGMEM =  {1, 0, 0, 4, 5, 0, 0, 0, 0, 0, 6, 9, 0, 2, 0, 0, 6, 7, 0, 0, 0, 0, 0, 7, 9, 0, 3, 3, 1, 0, 0, 0, 10, 11, 1, 8, 3, 0, 0, 4, 4, 4, 0, 0, 1, 0, 0, 1, 4, 5, 0, 8, 5, 4, 3, 0, 0, 1, 0, 0, 1, 4, 4, 0, 8, 6, 4, 2, 0, 0, 2, 0, 0, 1, 4, 2, 0, 8, 7, 4, 1, 0, 0, 2, 0, 0, 1, 4, 1, 0, 8};
bool _menuValueArray_bool[1];
const bool _menuConstantValuesArray_bool[]  PROGMEM =  {1};
int _menuValueArray_int[4];
const int _menuConstantValuesArray_int[]  PROGMEM =  {1};
const char _flprogMenuNameString1[] PROGMEM = "Vent-Off";
const char _flprogMenuNameString2[] PROGMEM = "Vent-On";
const char _flprogMenuNameString3[] PROGMEM = "Sound";
const char _flprogMenuNameString4[] PROGMEM = "Heater-Off";
const char _flprogMenuNameString5[] PROGMEM = "Heater-On";
const char _flprogMenuNameString6[] PROGMEM = "HeaterSetting";
const char _flprogMenuNameString7[] PROGMEM = "Vent Setting";
const char _flprogMenuNameString8[] PROGMEM = "C";
const char _flprogMenuNameString9[] PROGMEM = "Enter to submenu";
const char _flprogMenuNameString10[] PROGMEM = "On";
const char _flprogMenuNameString11[] PROGMEM = "Off";
const char* const _flprogMenuStringsArray[] PROGMEM = { _flprogMenuNameString1,  _flprogMenuNameString2,  _flprogMenuNameString3,  _flprogMenuNameString4,  _flprogMenuNameString5,  _flprogMenuNameString6,  _flprogMenuNameString7,  _flprogMenuNameString8,  _flprogMenuNameString9,  _flprogMenuNameString10,  _flprogMenuNameString11};
struct _menuItemStricture {
  int startInArrayIndex;
};
struct _menuMainStricture {
  byte startIndex;
  byte stopIndex;
  bool isSwitchMenuAroundRing;
  _menuItemStricture  currentItem;
};
_menuItemStricture _MenuItems[7];
_menuMainStricture _MainMenus[1];
bool _gtv1;
bool _gtv2;
bool _gtv3;
bool _gtv4;
bool _gtv5;
bool _gtv6;
bool _gtv7;
bool _gtv8;
bool _gtv9;
bool _gtv10 = 0;
float _gtv11;
bool _gtv12 = 0;
String _swi2;
String _swi1;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
int _disp1oldLength = 0;
bool _trgrt2 = 0;
bool _trgrt2I = 0;
int _disp3oldLength = 0;
int Menu_Value_4_TVD = 0;
bool _trgrt3 = 0;
bool _trgrt3I = 0;
int Menu_Value_2_TVD = 0;
int _disp4oldLength = 0;
bool _trgr4 = 0;
bool _trgr2 = 0;
bool _trgr1 = 0;
bool _trgr3 = 0;
String _MenuBlock_47814740_ASO_1;
String _MenuBlock_47814740_MNO;
String _MenuBlock_47814740_VNO;
bool _MenuBlock_47814740_OEIS = 0;
bool _MenuBlock_47814740_OMUIS = 0;
bool _MenuBlock_47814740_OMDIS = 0;
bool _MenuBlock_47814740_OEMIS = 0;
bool _MenuBlock_47814740_OExFMIS = 0;
bool _MenuBlock_47814740_OVUIS = 0;
bool _MenuBlock_47814740_OVDIS = 0;
unsigned long _MenuBlock_47814740_VUDST = 0UL;
unsigned long _MenuBlock_47814740_VUDSPT = 0UL;
byte _MenuBlock_47814740_VUDSM = 0;
int _MenuBlock_47814740_VUDPT = 0;
bool _MenuBlock_47814740_AMMO = 0;
bool _tim2I = 0;
bool _tim2O = 0;
unsigned long _tim2P = 0UL;
bool _tim3I = 0;
bool _tim3O = 0;
unsigned long _tim3P = 0UL;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
int _disp2oldLength = 0;
int Menu_Value_3_TVD = 0;
int Menu_Value_1_TVD = 0;
void setup()
{
  if ((EEPROM.read(0)) != 98) {
    EEPROM.write(0, 98) ;
    EEPROM.updateInt(4, 40);
    EEPROM.updateInt(2, 30);
    EEPROM.updateBit(1, 0, 0);
    EEPROM.updateInt(6, 25);
    EEPROM.updateInt(8, 10);
  }
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);

  _lcd1.begin(16, 2);
  _MenuItems[0].startInArrayIndex = 0;
  _MenuItems[1].startInArrayIndex = 13;
  _MenuItems[2].startInArrayIndex = 26;
  _MenuItems[3].startInArrayIndex = 39;
  _MenuItems[4].startInArrayIndex = 52;
  _MenuItems[5].startInArrayIndex = 65;
  _MenuItems[6].startInArrayIndex = 78;
  _MainMenus[0].startIndex = 1;
  _MainMenus[0].isSwitchMenuAroundRing = 1;
  _MainMenus[0].stopIndex = 3;
  _MainMenus[0].currentItem = _MenuItems[0];
  _menuValueArray_int[0] = (EEPROM.readInt(2));
  _menuValueArray_int[1] = (EEPROM.readInt(4));
  _menuValueArray_bool[0] = (EEPROM.readBit(1, 0));
  _menuValueArray_int[2] = (EEPROM.readInt(6));
  _menuValueArray_int[3] = (EEPROM.readInt(8));
}
void loop()
{ bool _tempVariable_bool;
  byte _tempVariable_byte;
  if (_isNeedClearDisp1) {
    _lcd1.clear();
    _isNeedClearDisp1 = 0;
  }




  _gtv11 = (map(( (analogRead (1))), (0), (1023), (-20), (80)));
  UB_142171746_ubi_125089190 =  (analogRead (0));
  UB_142171746_Instance1 = _func_UB_142171746(UB_142171746_Instance1, UB_142171746_ubi_125089190, 96, 250, 402, 635);
  _gtv3 = UB_142171746_Instance1.ubo_101667604;
  _gtv4 = UB_142171746_Instance1.ubo_51674151;
  _gtv5 = UB_142171746_Instance1.ubo_137412502;
  _gtv2 = UB_142171746_Instance1.ubo_174461762;
  _gtv1 = UB_142171746_Instance1.ubo_157422683;
  if (_gtv1)
  {
    if (_tim1I) {
      if (_isTimer(_tim1P, 2000)) {
        _tim1O = 1;
      }
    } else {
      _tim1I = 1;
      _tim1P = millis();
    }
  } else {
    _tim1O = 0;
    _tim1I = 0;
  }
  if (_tim2O) _trgr2 = 0;
  if (_tim1O) _trgr2 = 1;
  if (_trgr2) {
    if (_trgrt3I) {
      _trgrt3 = 0;
    } else {
      _trgrt3 = 1;
      _trgrt3I = 1;
    }
  } else {
    _trgrt3 = 0;
    _trgrt3I = 0;
  };
  if (_trgrt1) {
    _tim2O = 1;
    _tim2I = 1;
  } else {
    if (_tim2I) {
      _tim2I = 0;
      _tim2P = millis();
    } else {
      if (_tim2O) {
        if ( _isTimer(_tim2P, 200)) _tim2O = 0;
      }
    }
  }
  if (!(_gtv1)) {
    if (_trgrt1I) {
      _trgrt1 = 0;
    } else {
      _trgrt1 = 1;
      _trgrt1I = 1;
    }
  } else {
    _trgrt1 = 0;
    _trgrt1I = 0;
  };
  _gtv8 = _trgrt3;
  _gtv7 = ( (!(_trgr2)) && (_trgrt1) );
  if (1)
  {
    if (_tim3I) {
      if (_isTimer(_tim3P, 200)) {
        _tim3O = 1;
      }
    } else {
      _tim3I = 1;
      _tim3P = millis();
    }
  } else {
    _tim3O = 0;
    _tim3I = 0;
  }
  if (!(_gtv7)) {
    if (_trgrt2I) {
      _trgrt2 = 0;
    } else {
      _trgrt2 = 1;
      _trgrt2I = 1;
    }
  } else {
    _trgrt2 = 0;
    _trgrt2I = 0;
  };
  if (( (_gtv9) && (_gtv8) )) _trgr1 = 0;
  if (( (_tim3O) && (_trgrt2) )) _trgr1 = 1;
  _gtv6 = _trgr1;
  if (_gtv6) {
    _tempVariable_bool  =  1;
    if ( ! _MenuBlock_47814740_OEIS ) {
      _MenuBlock_47814740_OEIS = 1;
      _MainMenus[0].currentItem = _MenuItems[0];
    }
    _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 10]);
    _MenuBlock_47814740_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1])));
    _MenuBlock_47814740_VNO = _menuOutputValueString (0);
    _MenuBlock_47814740_AMMO = (pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 5]) ) == 0;
    _tempVariable_byte  =  pgm_read_byte(&_menuParametrsArray[(((_MainMenus[0]).currentItem).startInArrayIndex) + 12]);
    if (_tempVariable_byte == 0 ) {
      _MenuBlock_47814740_ASO_1 =  "";
    } else {
      _MenuBlock_47814740_ASO_1 =  _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1])));
    }
  } else {
    _tempVariable_bool  =  0;
    if (_MenuBlock_47814740_OEIS) {
      _MenuBlock_47814740_OEIS = 0;
      _menuUpdateToEEpromItems();
    }
    _MenuBlock_47814740_AMMO = 0;
    _MenuBlock_47814740_ASO_1 =  "";
    _MenuBlock_47814740_MNO = "";
    _MenuBlock_47814740_VNO = "";
  }
  if (_gtv4) {
    if ( ! _MenuBlock_47814740_OMUIS) {
      _MenuBlock_47814740_OMUIS = 1; if (_tempVariable_bool) {
        _menuUpEvents(0);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OMUIS = 0;
  }
  if (_gtv5) {
    if ( ! _MenuBlock_47814740_OMDIS) {
      _MenuBlock_47814740_OMDIS = 1; if (_tempVariable_bool) {
        _menuDownEvents(0);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OMDIS = 0;
  }
  if (( (_gtv7) && (_gtv6) )) {
    if ( ! _MenuBlock_47814740_OEMIS) {
      _MenuBlock_47814740_OEMIS = 1; if (_tempVariable_bool) {
        _menuEnterTheMenuEvents (0);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OEMIS = 0;
  }
  if (_gtv8) {
    if ( ! _MenuBlock_47814740_OExFMIS) {
      _MenuBlock_47814740_OExFMIS = 1; if (_tempVariable_bool) {
        _menuExitFromMenuEvents (0);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OExFMIS = 0;
  }
  if (_gtv3) {
    if ( ! _MenuBlock_47814740_OVUIS) {
      _MenuBlock_47814740_OVUIS = 1;
      if (_tempVariable_bool) {
        _valueUpEvents(0);
        _MenuBlock_47814740_VUDST = millis();
      }
    } if (_tempVariable_bool) {
      if (_MenuBlock_47814740_VUDSM == 0) {
        if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) {
          _MenuBlock_47814740_VUDSM = 1;
          _MenuBlock_47814740_VUDSPT = millis();
          _MenuBlock_47814740_VUDPT  = 500;
        }
      }  else {
        if (_MenuBlock_47814740_VUDSM == 1) {
          if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) {
            _MenuBlock_47814740_VUDSM = 2;
            _MenuBlock_47814740_VUDPT  = 200;
          }
        } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) {
          _valueUpEvents(0);
          _MenuBlock_47814740_VUDSPT = millis();
        }
      }
    }
  } else {
    _MenuBlock_47814740_OVUIS = 0;
    if ( ! ( _gtv2)) {
      _MenuBlock_47814740_VUDSM = 0;
    }
  }
  if (_gtv2) {
    if ( ! _MenuBlock_47814740_OVDIS) {
      _MenuBlock_47814740_OVDIS = 1;
      if (_tempVariable_bool) {
        _valueDownEvents(0);
        _MenuBlock_47814740_VUDST = millis();
      }
    } if (_tempVariable_bool) {
      if (_MenuBlock_47814740_VUDSM == 0) {
        if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) {
          _MenuBlock_47814740_VUDSM = 1;
          _MenuBlock_47814740_VUDSPT = millis();
          _MenuBlock_47814740_VUDPT  = 500;
        }
      }  else {
        if (_MenuBlock_47814740_VUDSM == 1) {
          if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) {
            _MenuBlock_47814740_VUDSM = 2;
            _MenuBlock_47814740_VUDPT  = 200;
          }
        } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) {
          _valueDownEvents(0);
          _MenuBlock_47814740_VUDSPT = millis();
        }
      }
    }
  } else {
    _MenuBlock_47814740_OVDIS = 0;
    if ( ! ( _gtv3)) {
      _MenuBlock_47814740_VUDSM = 0;
    }
  }
  if (_gtv6) {
    _dispTempLength1 = ((_MenuBlock_47814740_MNO)).length();
    if (_disp2oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp2oldLength = _dispTempLength1;
    _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 0);
    _lcd1.print((_MenuBlock_47814740_MNO));
  } else {
    if (_disp2oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp2oldLength = 0;
    }
  }
  if (_gtv6) {
    _dispTempLength1 = ((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))).length();
    if (_disp1oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp1oldLength = _dispTempLength1;
    _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 1);
    _lcd1.print((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1))));
  } else {
    if (_disp1oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp1oldLength = 0;
    }
  }
  _gtv9 = _MenuBlock_47814740_AMMO;
  if ((_gtv11) > (Menu_Value_2_TVD)) _trgr3 = 0;
  if ((_gtv11) < (Menu_Value_1_TVD)) _trgr3 = 1;
  digitalWrite(2, !(_trgr3));
  if (!(_gtv6)) {
    Menu_Value_1_TVD = _menuValueArray_int[3];
  }
  _gtv10 = _trgr3;
  if (!(_gtv6)) {
    Menu_Value_2_TVD = _menuValueArray_int[2];
  }
  if ((_gtv11) < (Menu_Value_4_TVD)) _trgr4 = 0;
  if ((_gtv11) > (Menu_Value_3_TVD)) _trgr4 = 1;
  if (!(_gtv6)) {
    Menu_Value_3_TVD = _menuValueArray_int[1];
  }
  digitalWrite(3, !(_trgr4));
  _gtv12 = _trgr4;
  if (!(_gtv6)) {
    Menu_Value_4_TVD = _menuValueArray_int[0];
  }
  digitalWrite(11, ( (( (_gtv12) || (_gtv10) )) && ((_menuValueArray_bool[0])) ));
  if (_gtv10)
  {
    _swi1 = String("H - ON");
  }
  else
  {
    _swi1 = String("H - OFF");
  }
  if (_gtv12)
  {
    _swi2 = String("V - ON");
  }
  else
  {
    _swi2 = String("V - OFF");
  }
  if (!(_gtv6)) {
    _dispTempLength1 = ((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))).length();
    if (_disp3oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp3oldLength = _dispTempLength1;
    _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 0);
    _lcd1.print((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C")))));
  } else {
    if (_disp3oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp3oldLength = 0;
    }
  }
  if (!(_gtv6)) {
    _dispTempLength1 = ((((_swi1) + (String("  ")) + (_swi2)))).length();
    if (_disp4oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp4oldLength = _dispTempLength1;
    _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 1);
    _lcd1.print((((_swi1) + (String("  ")) + (_swi2))));
  } else {
    if (_disp4oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp4oldLength = 0;
    }
  }




}
String  _floatToStringWitRaz(float value, int raz)
{

  return String(value, raz);
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
  unsigned long currentTime;
  currentTime = millis();
  if (currentTime >= startTime) {
    return (currentTime >= (startTime + period));
  } else {
    return (currentTime >= (4294967295 - startTime + period));
  }
}
void _menuUpEvents (byte menuIndex)
{
  byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
  byte parIndex = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]);
  byte parentStartIndex;
  byte parentStopIndex;
  if (parIndex == 0) {
    parentStartIndex = (_MainMenus[menuIndex]).startIndex;
    parentStopIndex = (_MainMenus[menuIndex]).stopIndex;
  }
  else {
    parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]);
    parentStopIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 4]);
  }
  if (tempIndex == parentStartIndex) {
    if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) {
      (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStopIndex - 1];
      return;
    } else {
      return;
    }
  }
  (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex - 2];
  return;
}
void _menuDownEvents (byte menuIndex)
{
  byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
  byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]);
  byte parentStartIndex;
  byte parentStopIndex;
  if (parIndex == 0) {
    parentStartIndex = (_MainMenus[menuIndex]).startIndex;
    parentStopIndex = (_MainMenus[menuIndex]).stopIndex;
  }
  else {
    parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]);
    parentStopIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[parIndex - 1]).startInArrayIndex) + 4]);
  }
  if (tempIndex == parentStopIndex) {
    if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) {
      (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStartIndex - 1];
      return;
    } else {
      return;
    }
  }
  (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex];
  return;
}
void _valueUpEvents (byte menuIndex)
{
  byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]);
  byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]);
  byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]);
  if (itemType == 3) {
    _menuValueArray_bool[valIndex - 1 ] = 1;
    return;
  }
  if (itemType == 4) {
    _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] + (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1]));
  }
}
void _valueDownEvents (byte menuIndex)
{

  byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]);
  byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]);
  byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]);
  if (itemType == 3) {
    _menuValueArray_bool[valIndex - 1] = 0;
    return;
  }
  if (itemType == 4) {
    _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] - (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1]));
  }
}
void _menuEnterTheMenuEvents (byte menuIndex)
{
  byte itemType =  pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  if (!(itemType == 0)) {
    return;
  }
  byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
  byte newIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[tempIndex - 1]).startInArrayIndex) + 3]);
  if (newIndex == 0) {
    return;
  }
  (_MainMenus[menuIndex]).currentItem = _MenuItems[newIndex - 1];
  return;
}
void _menuExitFromMenuEvents (byte menuIndex)
{
  byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]);
  if (parIndex == 0) {
    return;
  }
  (_MainMenus[menuIndex]).currentItem = _MenuItems[parIndex - 1];
  return;
}
String _menuOutputValueString (byte menuIndex)
{
  byte itemType = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  byte valueStrIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 11]);
  if (itemType == 0) {
    if ( valueStrIndex == 0) {
      return "";
    } else {
      return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[valueStrIndex - 1])));
    }
  }
  byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]);
  byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]);
  byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]);
  if ( valIndex == 0) {
    return "";
  }
  byte convFormat = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 9]);
  if (itemType == 3) {
    return _convertBoolean(itemType, convFormat, valIndex, indexMax, indexMin);
  }
  if (itemType == 4) {
    return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin);
  }
  return "";
}
void _menuUpdateToEEpromItems()
{
  EEPROM.updateInt(2, (_menuValueArray_int[0]));
  EEPROM.updateInt(4, (_menuValueArray_int[1]));
  EEPROM.updateBit(1, 0, (_menuValueArray_bool[0]));
  EEPROM.updateInt(6, (_menuValueArray_int[2]));
  EEPROM.updateInt(8, (_menuValueArray_int[3]));
}
String _readStringFromProgmem (char *string)
{
  String result = String("");
  while (pgm_read_byte(string) != '\0')
  {
    result = result + char(pgm_read_byte(string));
    string++;
  }
  return result;
}
String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
  if (itemType == 4) {
    if (convFormat == 4) {
      return String((_menuValueArray_int[valIndex - 1 ]), DEC);
    }
    if (convFormat == 5) {
      return String((_menuValueArray_int[valIndex - 1]), HEX);
    }
    if (convFormat == 6) {
      return String((_menuValueArray_int[valIndex - 1]), BIN);
    }
  }
}
String _convertBoolean(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
  if (convFormat == 1) {
    if (_menuValueArray_bool[valIndex - 1]) {
      return "1";
    } else {
      return "0";
    }
  }
  if (convFormat == 2) {
    if (_menuValueArray_bool[valIndex - 1]) {
      return "True";
    } else {
      return "False";
    }
  }
  if (convFormat == 3) {
    if (_menuValueArray_bool[valIndex - 1 ]) {
      return "Да";
    } else {
      return "Нет";
    }
  }
  if (_menuValueArray_bool[valIndex - 1]) {
    return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMax - 1])));
  } else {
    return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMin - 1])));
  }
}
struct UB_142171746 _func_UB_142171746(struct UB_142171746 _ubInstans, int ubi_125089190, int ubpar_125440348, int ubpar_79146376, int ubpar_175158211, int ubpar_40719224)
{
  bool ubo_101667604 = _ubInstans.ubo_101667604;
  bool ubo_51674151 = _ubInstans.ubo_51674151;
  bool ubo_137412502 = _ubInstans.ubo_137412502;
  bool ubo_174461762 = _ubInstans.ubo_174461762;
  bool ubo_157422683 = _ubInstans.ubo_157422683;
  int _gtv1 = _ubInstans._gtv1;
  int _gtv2 = _ubInstans._gtv2;
  int _gtv3 = _ubInstans._gtv3;
  int _gtv4 = _ubInstans._gtv4;
  int _gtv5 = _ubInstans._gtv5;
  bool _bounse1S = _ubInstans._bounse1S;
  bool _bounse1O = _ubInstans._bounse1O;
  unsigned long _bounse1P = _ubInstans._bounse1P;
  bool _bounse2S = _ubInstans._bounse2S;
  bool _bounse2O = _ubInstans._bounse2O;
  unsigned long _bounse2P = _ubInstans._bounse2P;
  bool _bounse3S = _ubInstans._bounse3S;
  bool _bounse3O = _ubInstans._bounse3O;
  unsigned long _bounse3P = _ubInstans._bounse3P;
  bool _bounse4S = _ubInstans._bounse4S;
  bool _bounse4O = _ubInstans._bounse4O;
  unsigned long _bounse4P = _ubInstans._bounse4P;
  bool _bounse5S = _ubInstans._bounse5S;
  bool _bounse5O = _ubInstans._bounse5O;
  unsigned long _bounse5P = _ubInstans._bounse5P;
  bool   _bounceTmpD1 = (ubi_125089190) < (_gtv1);

  if (_bounse1S)
  {
    if (millis() >= (_bounse1P + 40))
    {
      _bounse1O =  _bounceTmpD1;
      _bounse1S = 0;
    }
  }
  else
  {
    if ( _bounceTmpD1 != _bounse1O )
    {
      _bounse1S = 1;
      _bounse1P = millis();
    }
  }
  bool   _bounceTmpD2 = ( ((ubi_125089190) > (_gtv1)) && ((ubi_125089190) < (_gtv2)) );

  if (_bounse2S)
  {
    if (millis() >= (_bounse2P + 40))
    {
      _bounse2O =  _bounceTmpD2;
      _bounse2S = 0;
    }
  }
  else
  {
    if ( _bounceTmpD2 != _bounse2O )
    {
      _bounse2S = 1;
      _bounse2P = millis();
    }
  }
  bool   _bounceTmpD3 = ( ((ubi_125089190) > (_gtv2)) && ((ubi_125089190) < (_gtv3)) );

  if (_bounse3S)
  {
    if (millis() >= (_bounse3P + 40))
    {
      _bounse3O =  _bounceTmpD3;
      _bounse3S = 0;
    }
  }
  else
  {
    if ( _bounceTmpD3 != _bounse3O )
    {
      _bounse3S = 1;
      _bounse3P = millis();
    }
  }
  bool   _bounceTmpD4 = ( ((ubi_125089190) > (_gtv3)) && ((ubi_125089190) < (_gtv4)) );

  if (_bounse4S)
  {
    if (millis() >= (_bounse4P + 40))
    {
      _bounse4O =  _bounceTmpD4;
      _bounse4S = 0;
    }
  }
  else
  {
    if ( _bounceTmpD4 != _bounse4O )
    {
      _bounse4S = 1;
      _bounse4P = millis();
    }
  }
  bool   _bounceTmpD5 = ( ((ubi_125089190) > (_gtv4)) && ((ubi_125089190) < (_gtv5)) );

  if (_bounse5S)
  {
    if (millis() >= (_bounse5P + 40))
    {
      _bounse5O =  _bounceTmpD5;
      _bounse5S = 0;
    }
  }
  else
  {
    if ( _bounceTmpD5 != _bounse5O )
    {
      _bounse5S = 1;
      _bounse5P = millis();
    }
  }
  _gtv1 = (ubpar_125440348) / (2);
  _gtv2 = (((ubpar_79146376) - (ubpar_125440348)) / (2)) + (ubpar_125440348);
  _gtv3 = (((ubpar_175158211) - (ubpar_79146376)) / (2)) + (ubpar_79146376);
  _gtv4 = (((ubpar_40719224) - (ubpar_175158211)) / (2)) + (ubpar_175158211);
  _gtv5 = (((1023) - (ubpar_40719224)) / (2)) + (ubpar_40719224);
  ubo_101667604 = _bounse1O;
  ubo_51674151 = _bounse2O;
  ubo_137412502 = _bounse3O;
  ubo_174461762 = _bounse4O;
  ubo_157422683 = _bounse5O;
  _ubInstans.ubo_101667604 = ubo_101667604;
  _ubInstans.ubo_51674151 = ubo_51674151;
  _ubInstans.ubo_137412502 = ubo_137412502;
  _ubInstans.ubo_174461762 = ubo_174461762;
  _ubInstans.ubo_157422683 = ubo_157422683;
  _ubInstans._gtv1 = _gtv1;
  _ubInstans._gtv2 = _gtv2;
  _ubInstans._gtv3 = _gtv3;
  _ubInstans._gtv4 = _gtv4;
  _ubInstans._gtv5 = _gtv5;
  _ubInstans._bounse1S = _bounse1S;
  _ubInstans._bounse1O = _bounse1O;
  _ubInstans._bounse1P = _bounse1P;
  _ubInstans._bounse2S = _bounse2S;
  _ubInstans._bounse2O = _bounse2O;
  _ubInstans._bounse2P = _bounse2P;
  _ubInstans._bounse3S = _bounse3S;
  _ubInstans._bounse3O = _bounse3O;
  _ubInstans._bounse3P = _bounse3P;
  _ubInstans._bounse4S = _bounse4S;
  _ubInstans._bounse4O = _bounse4O;
  _ubInstans._bounse4P = _bounse4P;
  _ubInstans._bounse5S = _bounse5S;
  _ubInstans._bounse5O = _bounse5O;
  _ubInstans._bounse5P = _bounse5P;
  return _ubInstans;
}

Теперь немного «прокачаем» проект. Заменим LCD Keypad Shield на матричную клавиатуру 4х4 и дисплей 4х20 подключенный по I2C.



Это позволит задавать значение не пошагово, а простым вводом цифр. Кроме того это позволит сделать вход в меню по паролю. Изменённая схема проекта.



Целиком проект.
image

Рассмотрим изменённые платы



Используется стандартный блок опроса матричной клавиатуры из библиотеки элементов.



При нажатии кнопки «*» активируется меню. Только на этот раз не основное меню, а меню для ввода пароля.



Настройки парольного меню



Данное меню состоит из одного пункта, служащего для ввода пароля. Использован тип Long Integer для увеличения количества символов пароля.



На этой плате проверяется правильность ввода пароля. При совпадении введённого пароля и сохранённого в основном меню включается основное меню. При выходе из меню в значение вводимого пароля записывается 0 (подготовка к следующему вводу)



В основное дерево меню добавлен пункт для настройки сохранённого пароля.



Так же изменения коснулись закладки «Управление значением»



Управление значением переведено на непосредственный ввод цифр. Остальные платы не изменились.

Результат компиляции проекта
#include <Wire.h>
#include <EEPROMex.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C _lcd2(0x27, 20, 4);
int _dispTempLength2 = 0;
boolean _isNeedClearDisp2;



const byte _menuParametrsArray[]  PROGMEM =  {1, 5, 1, 0, 0, 0, 0, 0, 1, 4, 1, 0, 0, 2, 0, 0, 6, 7, 0, 0, 0, 0, 0, 8, 11, 0, 3, 0, 0, 8, 9, 0, 0, 0, 0, 0, 6, 11, 0, 4, 3, 1, 0, 0, 0, 12, 13, 1, 8, 3, 0, 0, 5, 5, 2, 0, 0, 0, 0, 0, 1, 4, 2, 0, 0, 6, 4, 2, 0, 0, 2, 0, 0, 1, 4, 5, 0, 10, 7, 4, 4, 0, 0, 2, 0, 0, 1, 4, 9, 0, 10, 8, 4, 3, 0, 0, 3, 0, 0, 1, 4, 7, 0, 10, 9, 4, 1, 0, 0, 3, 0, 0, 1, 4, 4, 0, 10};
bool _menuValueArray_bool[1];
const bool _menuConstantValuesArray_bool[]  PROGMEM =  {1};
int _menuValueArray_int[4];
const int _menuConstantValuesArray_int[]  PROGMEM =  {1};
long _menuValueArray_long[2];
const long _menuConstantValuesArray_long[]  PROGMEM =  {1};
const char _flprogMenuNameString1[] PROGMEM = "Enter Password";
const char _flprogMenuNameString2[] PROGMEM = "ChangePassword";
const char _flprogMenuNameString3[] PROGMEM = "Sound";
const char _flprogMenuNameString4[] PROGMEM = "Vent-Off";
const char _flprogMenuNameString5[] PROGMEM = "Heater-On";
const char _flprogMenuNameString6[] PROGMEM = "Vent Setting";
const char _flprogMenuNameString7[] PROGMEM = "Vent-On";
const char _flprogMenuNameString8[] PROGMEM = "HeaterSetting";
const char _flprogMenuNameString9[] PROGMEM = "Heater-Off";
const char _flprogMenuNameString10[] PROGMEM = "C";
const char _flprogMenuNameString11[] PROGMEM = "Enter to submenu";
const char _flprogMenuNameString12[] PROGMEM = "On";
const char _flprogMenuNameString13[] PROGMEM = "Off";
const char* const _flprogMenuStringsArray[] PROGMEM = { _flprogMenuNameString1,  _flprogMenuNameString2,  _flprogMenuNameString3,  _flprogMenuNameString4,  _flprogMenuNameString5,  _flprogMenuNameString6,  _flprogMenuNameString7,  _flprogMenuNameString8,  _flprogMenuNameString9,  _flprogMenuNameString10,  _flprogMenuNameString11,  _flprogMenuNameString12,  _flprogMenuNameString13};
struct _menuItemStricture {
  int startInArrayIndex;
};
struct _menuMainStricture {
  String tempString;
  byte startIndex;
  byte stopIndex;
  bool isSwitchMenuAroundRing;
  _menuItemStricture  currentItem;
};
_menuItemStricture _MenuItems[9];
_menuMainStricture _MainMenus[2];
bool _gtv6;
bool _gtv10 = 0;
float _gtv11;
bool _gtv12 = 0;
bool _gtv1;
bool _gtv2;
bool _gtv3;
bool _gtv4;
bool _gtv5;
bool _gtv13;
bool _gtv14;
bool _gtv15;
bool _gtv16;
bool _gtv17;
bool _gtv18;
bool _gtv19;
bool _gtv20;
bool _gtv21;
bool _gtv22;
bool _gtv23;
bool _gtv7;
bool _gtv8;
int _disp1oldLength = 0;
int Menu_Value_4_TVD = 0;
int Menu_Value_2_TVD = 0;
bool _trgr4 = 0;
String _swi1;
bool _trgr1 = 0;
bool _trgr3 = 0;
int _disp2oldLength = 0;
bool _trgt1 = 0;
bool _trgt1I = 0;
int Menu_Value_3_TVD = 0;
String _MenuBlock_47814740_ASO_1;
String _MenuBlock_47814740_MNO;
String _MenuBlock_47814740_VNO;
bool _MenuBlock_47814740_OEIS = 0;
bool _MenuBlock_47814740_OMUIS = 0;
bool _MenuBlock_47814740_OMDIS = 0;
bool _MenuBlock_47814740_OEMIS = 0;
bool _MenuBlock_47814740_OExFMIS = 0;
bool _MenuBlock_47814740_IDI_0 = 0;
bool _MenuBlock_47814740_IDI_1 = 0;
bool _MenuBlock_47814740_IDI_2 = 0;
bool _MenuBlock_47814740_IDI_3 = 0;
bool _MenuBlock_47814740_IDI_4 = 0;
bool _MenuBlock_47814740_IDI_5 = 0;
bool _MenuBlock_47814740_IDI_6 = 0;
bool _MenuBlock_47814740_IDI_7 = 0;
bool _MenuBlock_47814740_IDI_8 = 0;
bool _MenuBlock_47814740_IDI_9 = 0;
bool _MenuBlock_47814740MinusIOS = 0;
int Menu_Value_1_TVD = 0;
bool _mkb1C1xP1 = 0;
bool _mkb1C1xP2 = 0;
bool _mkb1C1xP3 = 0;
bool _mkb1C1xP4 = 0;
bool _mkb1C2xP1 = 0;
bool _mkb1C2xP2 = 0;
bool _mkb1C2xP3 = 0;
bool _mkb1C2xP4 = 0;
bool _mkb1C3xP1 = 0;
bool _mkb1C3xP2 = 0;
bool _mkb1C3xP3 = 0;
bool _mkb1C3xP4 = 0;
bool _mkb1C4xP1 = 0;
bool _mkb1C4xP2 = 0;
bool _mkb1C4xP3 = 0;
bool _mkb1C4xP4 = 0;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
int _disp6oldLength = 0;
int _disp4oldLength = 0;
int _disp5oldLength = 0;
String _MenuBlock_360159546_MNO;
String _MenuBlock_360159546_VNO;
bool _MenuBlock_360159546_OEIS = 0;
bool _MenuBlock_360159546_IDI_0 = 0;
bool _MenuBlock_360159546_IDI_1 = 0;
bool _MenuBlock_360159546_IDI_2 = 0;
bool _MenuBlock_360159546_IDI_3 = 0;
bool _MenuBlock_360159546_IDI_4 = 0;
bool _MenuBlock_360159546_IDI_5 = 0;
bool _MenuBlock_360159546_IDI_6 = 0;
bool _MenuBlock_360159546_IDI_7 = 0;
bool _MenuBlock_360159546_IDI_8 = 0;
bool _MenuBlock_360159546_IDI_9 = 0;
int _disp7oldLength = 0;
int _disp3oldLength = 0;
String _swi2;
void setup()
{
  if ((EEPROM.read(0)) != 99) {
    EEPROM.write(0, 99) ;
    EEPROM.updateInt(12, 25);
    EEPROM.updateLong(2, 123456);
    EEPROM.updateInt(6, 30);
    EEPROM.updateInt(10, 40);
    EEPROM.updateBit(1, 0, 0);
    EEPROM.updateInt(8, 10);
  }
  Wire.begin();
  pinMode(16, OUTPUT);
  pinMode(15, OUTPUT);
  pinMode(17, OUTPUT);

  _lcd2.init();
  _lcd2.backlight();
  pinMode(6, INPUT);
  digitalWrite(6, HIGH);
  pinMode(7, INPUT);
  digitalWrite(7, HIGH);
  pinMode(8, INPUT);
  digitalWrite(8, HIGH);
  pinMode(9, INPUT);
  digitalWrite(9, HIGH);
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  _MenuItems[0].startInArrayIndex = 0;
  _MenuItems[1].startInArrayIndex = 13;
  _MenuItems[2].startInArrayIndex = 26;
  _MenuItems[3].startInArrayIndex = 39;
  _MenuItems[4].startInArrayIndex = 52;
  _MenuItems[5].startInArrayIndex = 65;
  _MenuItems[6].startInArrayIndex = 78;
  _MenuItems[7].startInArrayIndex = 91;
  _MenuItems[8].startInArrayIndex = 104;
  _MainMenus[0].tempString = "";
  _MainMenus[0].startIndex = 1;
  _MainMenus[0].isSwitchMenuAroundRing = 0;
  _MainMenus[0].stopIndex = 1;
  _MainMenus[0].currentItem = _MenuItems[0];
  _MainMenus[1].tempString = "";
  _MainMenus[1].startIndex = 2;
  _MainMenus[1].isSwitchMenuAroundRing = 1;
  _MainMenus[1].stopIndex = 5;
  _MainMenus[1].currentItem = _MenuItems[1];
  _menuValueArray_long[1] = (EEPROM.readLong(2));
  _menuValueArray_bool[0] = (EEPROM.readBit(1, 0));
  _menuValueArray_int[0] = (EEPROM.readInt(6));
  _menuValueArray_int[1] = (EEPROM.readInt(8));
  _menuValueArray_int[2] = (EEPROM.readInt(10));
  _menuValueArray_int[3] = (EEPROM.readInt(12));
}
void loop()
{ bool _tempVariable_bool;
  byte _tempVariable_byte;
  if (_isNeedClearDisp2) {
    _lcd2.clear();
    _isNeedClearDisp2 = 0;
  }




  _gtv11 = (map(( (analogRead (0))), (0), (1023), (-20), (80)));
  digitalWrite(2, 0);
  _mkb1C1xP1 = ! (digitalRead(6));
  _mkb1C1xP2 = ! (digitalRead(7));
  _mkb1C1xP3 = ! (digitalRead(8));
  _mkb1C1xP4 = ! (digitalRead(9));
  digitalWrite(2, 1);
  digitalWrite(3, 0);
  _mkb1C2xP1 = ! (digitalRead(6));
  _mkb1C2xP2 = ! (digitalRead(7));
  _mkb1C2xP3 = ! (digitalRead(8));
  _mkb1C2xP4 = ! (digitalRead(9));
  digitalWrite(3, 1);
  digitalWrite(4, 0);
  _mkb1C3xP1 = ! (digitalRead(6));
  _mkb1C3xP2 = ! (digitalRead(7));
  _mkb1C3xP3 = ! (digitalRead(8));
  _mkb1C3xP4 = ! (digitalRead(9));
  digitalWrite(4, 1);
  digitalWrite(5, 0);
  _mkb1C4xP1 = ! (digitalRead(6));
  _mkb1C4xP2 = ! (digitalRead(7));
  _mkb1C4xP3 = ! (digitalRead(8));
  _mkb1C4xP4 = ! (digitalRead(9));
  digitalWrite(5, 1);
  _gtv1 = _mkb1C1xP1;
  _gtv2 = _mkb1C1xP2;
  _gtv3 = _mkb1C1xP3;
  _gtv18 = _mkb1C1xP4;
  _gtv4 = _mkb1C2xP1;
  _gtv5 = _mkb1C2xP2;
  _gtv13 = _mkb1C2xP3;
  _gtv19 = _mkb1C2xP4;
  _gtv14 = _mkb1C3xP1;
  _gtv15 = _mkb1C3xP2;
  _gtv16 = _mkb1C3xP3;
  _gtv20 = _mkb1C3xP4;
  _gtv23 = _mkb1C4xP1;
  _gtv17 = _mkb1C4xP2;
  _gtv22 = _mkb1C4xP3;
  _gtv21 = _mkb1C4xP4;
  bool  _tmp1 = _gtv23;
  if (_tmp1)  {
    if (! _trgt1I) _trgt1 = ! _trgt1;
  }
  _trgt1I = _tmp1;
  _gtv6 = _trgt1;
  if (_gtv7) {
    _tempVariable_bool  =  1;
    if ( ! _MenuBlock_360159546_OEIS ) {
      _MenuBlock_360159546_OEIS = 1;
      (_MainMenus[0]).tempString = "";
    }
    _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 10]);
    _MenuBlock_360159546_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1])));
    _MenuBlock_360159546_VNO = _menuOutputValueString (0);
  } else {
    _tempVariable_bool  =  0;
    if (_MenuBlock_360159546_OEIS) {
      _MenuBlock_360159546_OEIS = 0;
      _menuUpdateToEEpromItems();
    }
    _MenuBlock_360159546_MNO = "";
    _MenuBlock_360159546_VNO = "";
  }
  if (_gtv17) {
    if ( ! _MenuBlock_360159546_IDI_0) {
      _MenuBlock_360159546_IDI_0 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '0');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_0 = 0;
  }
  if (_gtv1) {
    if ( ! _MenuBlock_360159546_IDI_1) {
      _MenuBlock_360159546_IDI_1 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '1');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_1 = 0;
  }
  if (_gtv2) {
    if ( ! _MenuBlock_360159546_IDI_2) {
      _MenuBlock_360159546_IDI_2 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '2');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_2 = 0;
  }
  if (_gtv3) {
    if ( ! _MenuBlock_360159546_IDI_3) {
      _MenuBlock_360159546_IDI_3 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '3');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_3 = 0;
  }
  if (_gtv4) {
    if ( ! _MenuBlock_360159546_IDI_4) {
      _MenuBlock_360159546_IDI_4 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '4');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_4 = 0;
  }
  if (_gtv5) {
    if ( ! _MenuBlock_360159546_IDI_5) {
      _MenuBlock_360159546_IDI_5 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '5');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_5 = 0;
  }
  if (_gtv13) {
    if ( ! _MenuBlock_360159546_IDI_6) {
      _MenuBlock_360159546_IDI_6 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '6');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_6 = 0;
  }
  if (_gtv14) {
    if ( ! _MenuBlock_360159546_IDI_7) {
      _MenuBlock_360159546_IDI_7 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '7');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_7 = 0;
  }
  if (_gtv15) {
    if ( ! _MenuBlock_360159546_IDI_8) {
      _MenuBlock_360159546_IDI_8 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '8');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_8 = 0;
  }
  if (_gtv16) {
    if ( ! _MenuBlock_360159546_IDI_9) {
      _MenuBlock_360159546_IDI_9 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '9');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_9 = 0;
  }
  if (_gtv7) {
    _dispTempLength2 = ((_MenuBlock_360159546_MNO)).length();
    if (_disp6oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp6oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0);
    _lcd2.print((_MenuBlock_360159546_MNO));
  } else {
    if (_disp6oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp6oldLength = 0;
    }
  }
  if (_gtv7) {
    _dispTempLength2 = ((_MenuBlock_360159546_VNO)).length();
    if (_disp7oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp7oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1);
    _lcd2.print((_MenuBlock_360159546_VNO));
  } else {
    if (_disp7oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp7oldLength = 0;
    }
  }
  if (_trgrt1) _trgr1 = 0;
  if (((_menuValueArray_long[0])) == ((_menuValueArray_long[1]))) _trgr1 = 1;
  if (!(_gtv6)) {
    if (_trgrt1I) {
      _trgrt1 = 0;
    } else {
      _trgrt1 = 1;
      _trgrt1I = 1;
    }
  } else {
    _trgrt1 = 0;
    _trgrt1I = 0;
  };
  _gtv7 = ( (_gtv6) && (!(_trgr1)) );
  _gtv8 = ( (_trgr1) && (_gtv6) );
  if (_trgrt1) {
    _menuValueArray_long[0] = 0L;
  }
  if (_gtv8) {
    _tempVariable_bool  =  1;
    if ( ! _MenuBlock_47814740_OEIS ) {
      _MenuBlock_47814740_OEIS = 1;
      _MainMenus[1].currentItem = _MenuItems[1];
      (_MainMenus[1]).tempString = "";
    }
    _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[1].currentItem ).startInArrayIndex) + 10]);
    _MenuBlock_47814740_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1])));
    _MenuBlock_47814740_VNO = _menuOutputValueString (1);
    _tempVariable_byte  =  pgm_read_byte(&_menuParametrsArray[(((_MainMenus[1]).currentItem).startInArrayIndex) + 12]);
    if (_tempVariable_byte == 0 ) {
      _MenuBlock_47814740_ASO_1 =  "";
    } else {
      _MenuBlock_47814740_ASO_1 =  _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1])));
    }
  } else {
    _tempVariable_bool  =  0;
    if (_MenuBlock_47814740_OEIS) {
      _MenuBlock_47814740_OEIS = 0;
      _menuUpdateToEEpromItems();
    }
    _MenuBlock_47814740_ASO_1 =  "";
    _MenuBlock_47814740_MNO = "";
    _MenuBlock_47814740_VNO = "";
  }
  if (_gtv20) {
    if ( ! _MenuBlock_47814740_OMUIS) {
      _MenuBlock_47814740_OMUIS = 1; if (_tempVariable_bool) {
        _menuUpEvents(1);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OMUIS = 0;
  }
  if (_gtv21) {
    if ( ! _MenuBlock_47814740_OMDIS) {
      _MenuBlock_47814740_OMDIS = 1; if (_tempVariable_bool) {
        _menuDownEvents(1);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OMDIS = 0;
  }
  if (_gtv18) {
    if ( ! _MenuBlock_47814740_OEMIS) {
      _MenuBlock_47814740_OEMIS = 1; if (_tempVariable_bool) {
        _menuEnterTheMenuEvents (1);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OEMIS = 0;
  }
  if (_gtv19) {
    if ( ! _MenuBlock_47814740_OExFMIS) {
      _MenuBlock_47814740_OExFMIS = 1; if (_tempVariable_bool) {
        _menuExitFromMenuEvents (1);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OExFMIS = 0;
  }
  if (_gtv17) {
    if ( ! _MenuBlock_47814740_IDI_0) {
      _MenuBlock_47814740_IDI_0 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '0');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_0 = 0;
  }
  if (_gtv1) {
    if ( ! _MenuBlock_47814740_IDI_1) {
      _MenuBlock_47814740_IDI_1 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '1');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_1 = 0;
  }
  if (_gtv2) {
    if ( ! _MenuBlock_47814740_IDI_2) {
      _MenuBlock_47814740_IDI_2 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '2');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_2 = 0;
  }
  if (_gtv3) {
    if ( ! _MenuBlock_47814740_IDI_3) {
      _MenuBlock_47814740_IDI_3 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '3');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_3 = 0;
  }
  if (_gtv4) {
    if ( ! _MenuBlock_47814740_IDI_4) {
      _MenuBlock_47814740_IDI_4 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '4');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_4 = 0;
  }
  if (_gtv5) {
    if ( ! _MenuBlock_47814740_IDI_5) {
      _MenuBlock_47814740_IDI_5 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '5');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_5 = 0;
  }
  if (_gtv13) {
    if ( ! _MenuBlock_47814740_IDI_6) {
      _MenuBlock_47814740_IDI_6 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '6');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_6 = 0;
  }
  if (_gtv14) {
    if ( ! _MenuBlock_47814740_IDI_7) {
      _MenuBlock_47814740_IDI_7 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '7');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_7 = 0;
  }
  if (_gtv15) {
    if ( ! _MenuBlock_47814740_IDI_8) {
      _MenuBlock_47814740_IDI_8 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '8');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_8 = 0;
  }
  if (_gtv16) {
    if ( ! _MenuBlock_47814740_IDI_9) {
      _MenuBlock_47814740_IDI_9 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '9');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_9 = 0;
  }
  if (_gtv22) {
    if ( ! _MenuBlock_47814740MinusIOS) {
      _MenuBlock_47814740MinusIOS = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '-' );
      }
    }
  } else {
    _MenuBlock_47814740MinusIOS = 0;
  }
  if (_gtv8) {
    _dispTempLength2 = ((_MenuBlock_47814740_MNO)).length();
    if (_disp2oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp2oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0);
    _lcd2.print((_MenuBlock_47814740_MNO));
  } else {
    if (_disp2oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp2oldLength = 0;
    }
  }
  if (_gtv8) {
    _dispTempLength2 = ((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))).length();
    if (_disp1oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp1oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1);
    _lcd2.print((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1))));
  } else {
    if (_disp1oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp1oldLength = 0;
    }
  }
  if ((_gtv11) > (Menu_Value_2_TVD)) _trgr3 = 0;
  if ((_gtv11) < (Menu_Value_1_TVD)) _trgr3 = 1;
  digitalWrite(16, !(_trgr3));
  if (!(_gtv6)) {
    Menu_Value_1_TVD = _menuValueArray_int[1];
  }
  _gtv10 = _trgr3;
  if (!(_gtv6)) {
    Menu_Value_2_TVD = _menuValueArray_int[3];
  }
  if ((_gtv11) < (Menu_Value_4_TVD)) _trgr4 = 0;
  if ((_gtv11) > (Menu_Value_3_TVD)) _trgr4 = 1;
  if (!(_gtv6)) {
    Menu_Value_3_TVD = _menuValueArray_int[2];
  }
  digitalWrite(15, !(_trgr4));
  _gtv12 = _trgr4;
  if (!(_gtv6)) {
    Menu_Value_4_TVD = _menuValueArray_int[0];
  }
  digitalWrite(17, ( (( (_gtv12) || (_gtv10) )) && ((_menuValueArray_bool[0])) ));
  if (_gtv10)
  {
    _swi1 = String("Heater - ON");
  }
  else
  {
    _swi1 = String("Heater - OFF");
  }
  if (_gtv12)
  {
    _swi2 = String("Ventilation - ON");
  }
  else
  {
    _swi2 = String("Ventilation - OFF");
  }
  if (!(_gtv6)) {
    _dispTempLength2 = ((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))).length();
    if (_disp3oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp3oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0);
    _lcd2.print((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C")))));
  } else {
    if (_disp3oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp3oldLength = 0;
    }
  }
  if (!(_gtv6)) {
    _dispTempLength2 = ((_swi1)).length();
    if (_disp4oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp4oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1);
    _lcd2.print((_swi1));
  } else {
    if (_disp4oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp4oldLength = 0;
    }
  }
  if (!(_gtv6)) {
    _dispTempLength2 = ((_swi2)).length();
    if (_disp5oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp5oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 2);
    _lcd2.print((_swi2));
  } else {
    if (_disp5oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp5oldLength = 0;
    }
  }




}
String  _floatToStringWitRaz(float value, int raz)
{

  return String(value, raz);
}
void _menuUpEvents (byte menuIndex)
{
  (_MainMenus[menuIndex]).tempString = "";
  byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
  byte parIndex = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]);
  byte parentStartIndex;
  byte parentStopIndex;
  if (parIndex == 0) {
    parentStartIndex = (_MainMenus[menuIndex]).startIndex;
    parentStopIndex = (_MainMenus[menuIndex]).stopIndex;
  }
  else {
    parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]);
    parentStopIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 4]);
  }
  if (tempIndex == parentStartIndex) {
    if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) {
      (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStopIndex - 1];
      return;
    } else {
      return;
    }
  }
  (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex - 2];
  return;
}
void _menuDownEvents (byte menuIndex)
{
  (_MainMenus[menuIndex]).tempString = "";
  byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
  byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]);
  byte parentStartIndex;
  byte parentStopIndex;
  if (parIndex == 0) {
    parentStartIndex = (_MainMenus[menuIndex]).startIndex;
    parentStopIndex = (_MainMenus[menuIndex]).stopIndex;
  }
  else {
    parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]);
    parentStopIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[parIndex - 1]).startInArrayIndex) + 4]);
  }
  if (tempIndex == parentStopIndex) {
    if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) {
      (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStartIndex - 1];
      return;
    } else {
      return;
    }
  }
  (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex];
  return;
}
void _menuEnterTheMenuEvents (byte menuIndex)
{
  byte itemType =  pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  if (!(itemType == 0)) {
    return;
  }
  byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
  byte newIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[tempIndex - 1]).startInArrayIndex) + 3]);
  if (newIndex == 0) {
    return;
  }
  (_MainMenus[menuIndex]).tempString = "";
  (_MainMenus[menuIndex]).currentItem = _MenuItems[newIndex - 1];
  return;
}
void _menuExitFromMenuEvents (byte menuIndex)
{
  byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]);
  if (parIndex == 0) {
    return;
  }
  (_MainMenus[menuIndex]).tempString = "";
  (_MainMenus[menuIndex]).currentItem = _MenuItems[parIndex - 1];
  return;
}
String _menuOutputValueString (byte menuIndex)
{
  byte itemType = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  byte valueStrIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 11]);
  if (itemType == 0) {
    if ( valueStrIndex == 0) {
      return "";
    } else {
      return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[valueStrIndex - 1])));
    }
  }
  byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]);
  byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]);
  byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]);
  if ( valIndex == 0) {
    return "";
  }
  byte convFormat = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 9]);
  if (itemType == 3) {
    return _convertBoolean(itemType, convFormat, valIndex, indexMax, indexMin);
  }
  if (itemType == 4) {
    return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin);
  }
  if (itemType == 5) {
    return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin);
  }
  return "";
}
void _menuDirectInputKeyPressEvents(byte menuIndex, char inputSymbol)
{
  byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]);
  byte temp;
  if (valIndex == 0) {
    return;
  }
  byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  if (itemType == 7) {
    return;
  }
  if (itemType == 3) {
    (_MainMenus[menuIndex]).tempString = "";
  }
  if (inputSymbol == '-') {
    temp = ((_MainMenus[menuIndex]).tempString).length() ;  if (temp == 0) {
      (_MainMenus[menuIndex]).tempString = "-";
    } else
    { if (((_MainMenus[menuIndex]).tempString).charAt(0)  == '-') {
        (_MainMenus[menuIndex]).tempString = ((_MainMenus[menuIndex]).tempString).substring(1);
      } else
      {
        (_MainMenus[menuIndex]).tempString = "-" + (_MainMenus[menuIndex]).tempString;
      }
    }
  } else {
    (_MainMenus[menuIndex]).tempString = (_MainMenus[menuIndex]).tempString + inputSymbol;
  }
  if (itemType == 3) {
    _menuValueArray_bool[valIndex - 1]  =  ((((_MainMenus[menuIndex]).tempString )).toInt());
  }
  if (itemType == 4) {
    _menuValueArray_int[valIndex - 1]  =  (((_MainMenus[menuIndex]).tempString )).toInt();
  }
  if (itemType == 5) {
    _menuValueArray_long[valIndex - 1]  =  (((_MainMenus[menuIndex]).tempString ).toInt());
  }
}
void _menuUpdateToEEpromItems()
{
  EEPROM.updateLong(2, (_menuValueArray_long[1]));
  EEPROM.updateBit(1, 0, (_menuValueArray_bool[0]));
  EEPROM.updateInt(6, (_menuValueArray_int[0]));
  EEPROM.updateInt(8, (_menuValueArray_int[1]));
  EEPROM.updateInt(10, (_menuValueArray_int[2]));
  EEPROM.updateInt(12, (_menuValueArray_int[3]));
}
String _readStringFromProgmem (char *string)
{
  String result = String("");
  while (pgm_read_byte(string) != '\0')
  {
    result = result + char(pgm_read_byte(string));
    string++;
  }
  return result;
}
String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
  if (itemType == 4) {
    if (convFormat == 4) {
      return String((_menuValueArray_int[valIndex - 1 ]), DEC);
    }
    if (convFormat == 5) {
      return String((_menuValueArray_int[valIndex - 1]), HEX);
    }
    if (convFormat == 6) {
      return String((_menuValueArray_int[valIndex - 1]), BIN);
    }
  }
  if (itemType == 5) {
    if (convFormat == 4) {
      return String((_menuValueArray_long[valIndex - 1 ]), DEC);
    }
    if (convFormat == 5) {
      return String((_menuValueArray_long[valIndex - 1]), HEX);
    }
    if (convFormat == 6) {
      return String((_menuValueArray_long[valIndex - 1]), BIN);
    }
  }
}
String _convertBoolean(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
  if (convFormat == 1) {
    if (_menuValueArray_bool[valIndex - 1]) {
      return "1";
    } else {
      return "0";
    }
  }
  if (convFormat == 2) {
    if (_menuValueArray_bool[valIndex - 1]) {
      return "True";
    } else {
      return "False";
    }
  }
  if (convFormat == 3) {
    if (_menuValueArray_bool[valIndex - 1 ]) {
      return "Да";
    } else {
      return "Нет";
    }
  }
  if (_menuValueArray_bool[valIndex - 1]) {
    return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMax - 1])));
  } else {
    return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMin - 1])));
  }
}

Использование резистора в качестве задания температуры удобно для отладки, но в реальном применении все таки необходим датчик температуры. Используем датчик температуры DS18B20. Для этого необходимо изменить первую плату в обоих проектах.



Блок «ScanOneWare» служит для автоматического определения адреса датчика. Это позволяет заменить в случае необходимости датчик температуры без перепрошивки контроллера.

Изменённые принципиальные схемы
Схема с LCD Keypad Shield.



Схема с матричной клавиатурой



Результат кода для схемы с LCD Keypad Shield.
#include <EEPROMex.h>
#include <LiquidCrystal.h>
#include <OneWire.h>
LiquidCrystal _lcd1(8, 9, 4, 5, 6, 7);
int _dispTempLength1 = 0;
boolean _isNeedClearDisp1;


struct UB_142171746
{
  bool ubo_101667604 = 0;
  bool ubo_51674151 = 0;
  bool ubo_137412502 = 0;
  bool ubo_174461762 = 0;
  bool ubo_157422683 = 0;
  int _gtv1 = 0;
  int _gtv2 = 0;
  int _gtv3 = 0;
  int _gtv4 = 0;
  int _gtv5 = 0;
  bool _bounse1S = 0;
  bool _bounse1O = 0;
  unsigned long _bounse1P = 0UL;
  bool _bounse2S = 0;
  bool _bounse2O = 0;
  unsigned long _bounse2P = 0UL;
  bool _bounse3S = 0;
  bool _bounse3O = 0;
  unsigned long _bounse3P = 0UL;
  bool _bounse4S = 0;
  bool _bounse4O = 0;
  unsigned long _bounse4P = 0UL;
  bool _bounse5S = 0;
  bool _bounse5O = 0;
  unsigned long _bounse5P = 0UL;
};
UB_142171746 UB_142171746_Instance1;
int UB_142171746_ubi_125089190 = 0;
OneWire  _ow12(12);
byte _FLPArray27618413[9];
const byte _menuParametrsArray[]  PROGMEM =  {1, 0, 0, 4, 5, 0, 0, 0, 0, 0, 1, 9, 0, 2, 0, 0, 6, 7, 0, 0, 0, 0, 0, 6, 9, 0, 3, 3, 1, 0, 0, 0, 10, 11, 1, 8, 3, 0, 0, 4, 4, 2, 0, 0, 1, 0, 0, 1, 4, 4, 0, 8, 5, 4, 4, 0, 0, 1, 0, 0, 1, 4, 7, 0, 8, 6, 4, 1, 0, 0, 2, 0, 0, 1, 4, 2, 0, 8, 7, 4, 3, 0, 0, 2, 0, 0, 1, 4, 5, 0, 8};
bool _menuValueArray_bool[1];
const bool _menuConstantValuesArray_bool[]  PROGMEM =  {1};
int _menuValueArray_int[4];
const int _menuConstantValuesArray_int[]  PROGMEM =  {1};
const char _flprogMenuNameString1[] PROGMEM = "HeaterSetting";
const char _flprogMenuNameString2[] PROGMEM = "Vent-On";
const char _flprogMenuNameString3[] PROGMEM = "Sound";
const char _flprogMenuNameString4[] PROGMEM = "Heater-On";
const char _flprogMenuNameString5[] PROGMEM = "Vent-Off";
const char _flprogMenuNameString6[] PROGMEM = "Vent Setting";
const char _flprogMenuNameString7[] PROGMEM = "Heater-Off";
const char _flprogMenuNameString8[] PROGMEM = "C";
const char _flprogMenuNameString9[] PROGMEM = "Enter to submenu";
const char _flprogMenuNameString10[] PROGMEM = "On";
const char _flprogMenuNameString11[] PROGMEM = "Off";
const char* const _flprogMenuStringsArray[] PROGMEM = { _flprogMenuNameString1,  _flprogMenuNameString2,  _flprogMenuNameString3,  _flprogMenuNameString4,  _flprogMenuNameString5,  _flprogMenuNameString6,  _flprogMenuNameString7,  _flprogMenuNameString8,  _flprogMenuNameString9,  _flprogMenuNameString10,  _flprogMenuNameString11};
struct _menuItemStricture {
  int startInArrayIndex;
};
struct _menuMainStricture {
  byte startIndex;
  byte stopIndex;
  bool isSwitchMenuAroundRing;
  _menuItemStricture  currentItem;
};
_menuItemStricture _MenuItems[7];
_menuMainStricture _MainMenus[1];
bool _gtv1;
bool _gtv2;
bool _gtv3;
bool _gtv4;
bool _gtv5;
bool _gtv6;
bool _gtv7;
bool _gtv8;
bool _gtv9;
bool _gtv10 = 0;
float _gtv11;
bool _gtv12 = 0;
int Menu_Value_3_TVD = 0;
int Menu_Value_1_TVD = 0;
String _swi2;
bool _trgrt4 = 0;
bool _trgrt4I = 0;
String _swi1;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
int _disp1oldLength = 0;
bool _trgrt2 = 0;
bool _trgrt2I = 0;
int _disp3oldLength = 0;
bool _sowb1_needScan = 0;
bool _sowb1_ost = 0;
bool _sowb1_FLPArray27618413 = 0;
int Menu_Value_4_TVD = 0;
bool _trgrt3 = 0;
bool _trgrt3I = 0;
int Menu_Value_2_TVD = 0;
int _disp4oldLength = 0;
bool _trgr4 = 0;
bool _trgr2 = 0;
bool _trgr1 = 0;
bool _trgr3 = 0;
String _MenuBlock_47814740_ASO_1;
String _MenuBlock_47814740_MNO;
String _MenuBlock_47814740_VNO;
bool _MenuBlock_47814740_OEIS = 0;
bool _MenuBlock_47814740_OMUIS = 0;
bool _MenuBlock_47814740_OMDIS = 0;
bool _MenuBlock_47814740_OEMIS = 0;
bool _MenuBlock_47814740_OExFMIS = 0;
bool _MenuBlock_47814740_OVUIS = 0;
bool _MenuBlock_47814740_OVDIS = 0;
unsigned long _MenuBlock_47814740_VUDST = 0UL;
unsigned long _MenuBlock_47814740_VUDSPT = 0UL;
byte _MenuBlock_47814740_VUDSM = 0;
int _MenuBlock_47814740_VUDPT = 0;
bool _MenuBlock_47814740_AMMO = 0;
bool _tim2I = 0;
bool _tim2O = 0;
unsigned long _tim2P = 0UL;
bool _tim3I = 0;
bool _tim3O = 0;
unsigned long _tim3P = 0UL;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
int _disp2oldLength = 0;
void setup()
{
  if ((EEPROM.read(0)) != 97) {
    EEPROM.write(0, 97) ;
    EEPROM.updateInt(8, 25);
    EEPROM.updateBit(1, 0, 0);
    EEPROM.updateInt(4, 10);
    EEPROM.updateInt(6, 30);
    EEPROM.updateInt(2, 40);
  }
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);

  _lcd1.begin(16, 2);
  _MenuItems[0].startInArrayIndex = 0;
  _MenuItems[1].startInArrayIndex = 13;
  _MenuItems[2].startInArrayIndex = 26;
  _MenuItems[3].startInArrayIndex = 39;
  _MenuItems[4].startInArrayIndex = 52;
  _MenuItems[5].startInArrayIndex = 65;
  _MenuItems[6].startInArrayIndex = 78;
  _MainMenus[0].startIndex = 1;
  _MainMenus[0].isSwitchMenuAroundRing = 1;
  _MainMenus[0].stopIndex = 3;
  _MainMenus[0].currentItem = _MenuItems[0];
  _menuValueArray_int[0] = (EEPROM.readInt(2));
  _menuValueArray_bool[0] = (EEPROM.readBit(1, 0));
  _menuValueArray_int[1] = (EEPROM.readInt(4));
  _menuValueArray_int[2] = (EEPROM.readInt(6));
  _menuValueArray_int[3] = (EEPROM.readInt(8));
}
void loop()
{ bool _tempVariable_bool;
  byte _tempVariable_byte;
  if (_isNeedClearDisp1) {
    _lcd1.clear();
    _isNeedClearDisp1 = 0;
  }




  if (1) {
    if (_trgrt4I) {
      _trgrt4 = 0;
    } else {
      _trgrt4 = 1;
      _trgrt4I = 1;
    }
  } else {
    _trgrt4 = 0;
    _trgrt4I = 0;
  };
  if (_isTimer(_d18x2x1Tti, 1000)) {
    _d18x2x1Tti = millis();
    _d18x2x1O =  _readDS18_ow12(_FLPArray27618413, _FLPArray27618413[8]);
  }
  if (_sowb1_needScan) {
    if ( _oneWireSeach (_FLPArray27618413, _ow12)) {
      _sowb1_FLPArray27618413 = 1;
    }
    _ow12.reset_search();
    _sowb1_needScan = 0;
  }
  if (_trgrt4) {
    if (! _sowb1_ost) {
      _sowb1_ost = 1;
      _sowb1_needScan = 1;
      _sowb1_FLPArray27618413 = 0;
    }
  } else {
    _sowb1_ost = 0;
  }
  _gtv11 = (_d18x2x1O);
  UB_142171746_ubi_125089190 =  (analogRead (0));
  UB_142171746_Instance1 = _func_UB_142171746(UB_142171746_Instance1, UB_142171746_ubi_125089190, 96, 250, 402, 635);
  _gtv3 = UB_142171746_Instance1.ubo_101667604;
  _gtv4 = UB_142171746_Instance1.ubo_51674151;
  _gtv5 = UB_142171746_Instance1.ubo_137412502;
  _gtv2 = UB_142171746_Instance1.ubo_174461762;
  _gtv1 = UB_142171746_Instance1.ubo_157422683;
  if (_gtv1)
  {
    if (_tim1I) {
      if (_isTimer(_tim1P, 2000)) {
        _tim1O = 1;
      }
    } else {
      _tim1I = 1;
      _tim1P = millis();
    }
  } else {
    _tim1O = 0;
    _tim1I = 0;
  }
  if (_tim2O) _trgr2 = 0;
  if (_tim1O) _trgr2 = 1;
  if (_trgr2) {
    if (_trgrt3I) {
      _trgrt3 = 0;
    } else {
      _trgrt3 = 1;
      _trgrt3I = 1;
    }
  } else {
    _trgrt3 = 0;
    _trgrt3I = 0;
  };
  if (_trgrt1) {
    _tim2O = 1;
    _tim2I = 1;
  } else {
    if (_tim2I) {
      _tim2I = 0;
      _tim2P = millis();
    } else {
      if (_tim2O) {
        if ( _isTimer(_tim2P, 200)) _tim2O = 0;
      }
    }
  }
  if (!(_gtv1)) {
    if (_trgrt1I) {
      _trgrt1 = 0;
    } else {
      _trgrt1 = 1;
      _trgrt1I = 1;
    }
  } else {
    _trgrt1 = 0;
    _trgrt1I = 0;
  };
  _gtv8 = _trgrt3;
  _gtv7 = ( (!(_trgr2)) && (_trgrt1) );
  if (1)
  {
    if (_tim3I) {
      if (_isTimer(_tim3P, 200)) {
        _tim3O = 1;
      }
    } else {
      _tim3I = 1;
      _tim3P = millis();
    }
  } else {
    _tim3O = 0;
    _tim3I = 0;
  }
  if (!(_gtv7)) {
    if (_trgrt2I) {
      _trgrt2 = 0;
    } else {
      _trgrt2 = 1;
      _trgrt2I = 1;
    }
  } else {
    _trgrt2 = 0;
    _trgrt2I = 0;
  };
  if (( (_gtv9) && (_gtv8) )) _trgr1 = 0;
  if (( (_tim3O) && (_trgrt2) )) _trgr1 = 1;
  _gtv6 = _trgr1;
  if (_gtv6) {
    _tempVariable_bool  =  1;
    if ( ! _MenuBlock_47814740_OEIS ) {
      _MenuBlock_47814740_OEIS = 1;
      _MainMenus[0].currentItem = _MenuItems[0];
    }
    _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 10]);
    _MenuBlock_47814740_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1])));
    _MenuBlock_47814740_VNO = _menuOutputValueString (0);
    _MenuBlock_47814740_AMMO = (pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 5]) ) == 0;
    _tempVariable_byte  =  pgm_read_byte(&_menuParametrsArray[(((_MainMenus[0]).currentItem).startInArrayIndex) + 12]);
    if (_tempVariable_byte == 0 ) {
      _MenuBlock_47814740_ASO_1 =  "";
    } else {
      _MenuBlock_47814740_ASO_1 =  _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1])));
    }
  } else {
    _tempVariable_bool  =  0;
    if (_MenuBlock_47814740_OEIS) {
      _MenuBlock_47814740_OEIS = 0;
      _menuUpdateToEEpromItems();
    }
    _MenuBlock_47814740_AMMO = 0;
    _MenuBlock_47814740_ASO_1 =  "";
    _MenuBlock_47814740_MNO = "";
    _MenuBlock_47814740_VNO = "";
  }
  if (_gtv4) {
    if ( ! _MenuBlock_47814740_OMUIS) {
      _MenuBlock_47814740_OMUIS = 1; if (_tempVariable_bool) {
        _menuUpEvents(0);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OMUIS = 0;
  }
  if (_gtv5) {
    if ( ! _MenuBlock_47814740_OMDIS) {
      _MenuBlock_47814740_OMDIS = 1; if (_tempVariable_bool) {
        _menuDownEvents(0);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OMDIS = 0;
  }
  if (( (_gtv7) && (_gtv6) )) {
    if ( ! _MenuBlock_47814740_OEMIS) {
      _MenuBlock_47814740_OEMIS = 1; if (_tempVariable_bool) {
        _menuEnterTheMenuEvents (0);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OEMIS = 0;
  }
  if (_gtv8) {
    if ( ! _MenuBlock_47814740_OExFMIS) {
      _MenuBlock_47814740_OExFMIS = 1; if (_tempVariable_bool) {
        _menuExitFromMenuEvents (0);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OExFMIS = 0;
  }
  if (_gtv3) {
    if ( ! _MenuBlock_47814740_OVUIS) {
      _MenuBlock_47814740_OVUIS = 1;
      if (_tempVariable_bool) {
        _valueUpEvents(0);
        _MenuBlock_47814740_VUDST = millis();
      }
    } if (_tempVariable_bool) {
      if (_MenuBlock_47814740_VUDSM == 0) {
        if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) {
          _MenuBlock_47814740_VUDSM = 1;
          _MenuBlock_47814740_VUDSPT = millis();
          _MenuBlock_47814740_VUDPT  = 500;
        }
      }  else {
        if (_MenuBlock_47814740_VUDSM == 1) {
          if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) {
            _MenuBlock_47814740_VUDSM = 2;
            _MenuBlock_47814740_VUDPT  = 200;
          }
        } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) {
          _valueUpEvents(0);
          _MenuBlock_47814740_VUDSPT = millis();
        }
      }
    }
  } else {
    _MenuBlock_47814740_OVUIS = 0;
    if ( ! ( _gtv2)) {
      _MenuBlock_47814740_VUDSM = 0;
    }
  }
  if (_gtv2) {
    if ( ! _MenuBlock_47814740_OVDIS) {
      _MenuBlock_47814740_OVDIS = 1;
      if (_tempVariable_bool) {
        _valueDownEvents(0);
        _MenuBlock_47814740_VUDST = millis();
      }
    } if (_tempVariable_bool) {
      if (_MenuBlock_47814740_VUDSM == 0) {
        if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) {
          _MenuBlock_47814740_VUDSM = 1;
          _MenuBlock_47814740_VUDSPT = millis();
          _MenuBlock_47814740_VUDPT  = 500;
        }
      }  else {
        if (_MenuBlock_47814740_VUDSM == 1) {
          if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) {
            _MenuBlock_47814740_VUDSM = 2;
            _MenuBlock_47814740_VUDPT  = 200;
          }
        } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) {
          _valueDownEvents(0);
          _MenuBlock_47814740_VUDSPT = millis();
        }
      }
    }
  } else {
    _MenuBlock_47814740_OVDIS = 0;
    if ( ! ( _gtv3)) {
      _MenuBlock_47814740_VUDSM = 0;
    }
  }
  if (_gtv6) {
    _dispTempLength1 = ((_MenuBlock_47814740_MNO)).length();
    if (_disp2oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp2oldLength = _dispTempLength1;
    _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 0);
    _lcd1.print((_MenuBlock_47814740_MNO));
  } else {
    if (_disp2oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp2oldLength = 0;
    }
  }
  if (_gtv6) {
    _dispTempLength1 = ((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))).length();
    if (_disp1oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp1oldLength = _dispTempLength1;
    _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 1);
    _lcd1.print((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1))));
  } else {
    if (_disp1oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp1oldLength = 0;
    }
  }
  _gtv9 = _MenuBlock_47814740_AMMO;
  if ((_gtv11) > (Menu_Value_2_TVD)) _trgr3 = 0;
  if ((_gtv11) < (Menu_Value_1_TVD)) _trgr3 = 1;
  digitalWrite(2, !(_trgr3));
  if (!(_gtv6)) {
    Menu_Value_1_TVD = _menuValueArray_int[1];
  }
  _gtv10 = _trgr3;
  if (!(_gtv6)) {
    Menu_Value_2_TVD = _menuValueArray_int[3];
  }
  if ((_gtv11) < (Menu_Value_4_TVD)) _trgr4 = 0;
  if ((_gtv11) > (Menu_Value_3_TVD)) _trgr4 = 1;
  if (!(_gtv6)) {
    Menu_Value_3_TVD = _menuValueArray_int[0];
  }
  digitalWrite(3, !(_trgr4));
  _gtv12 = _trgr4;
  if (!(_gtv6)) {
    Menu_Value_4_TVD = _menuValueArray_int[2];
  }
  digitalWrite(11, ( (( (_gtv12) || (_gtv10) )) && ((_menuValueArray_bool[0])) ));
  if (_gtv10)
  {
    _swi1 = String("H - ON");
  }
  else
  {
    _swi1 = String("H - OFF");
  }
  if (_gtv12)
  {
    _swi2 = String("V - ON");
  }
  else
  {
    _swi2 = String("V - OFF");
  }
  if (!(_gtv6)) {
    _dispTempLength1 = ((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))).length();
    if (_disp3oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp3oldLength = _dispTempLength1;
    _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 0);
    _lcd1.print((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C")))));
  } else {
    if (_disp3oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp3oldLength = 0;
    }
  }
  if (!(_gtv6)) {
    _dispTempLength1 = ((((_swi1) + (String("  ")) + (_swi2)))).length();
    if (_disp4oldLength > _dispTempLength1) {
      _isNeedClearDisp1 = 1;
    }
    _disp4oldLength = _dispTempLength1;
    _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 1);
    _lcd1.print((((_swi1) + (String("  ")) + (_swi2))));
  } else {
    if (_disp4oldLength > 0) {
      _isNeedClearDisp1 = 1;
      _disp4oldLength = 0;
    }
  }




}
String  _floatToStringWitRaz(float value, int raz)
{

  return String(value, raz);
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
  unsigned long currentTime;
  currentTime = millis();
  if (currentTime >= startTime) {
    return (currentTime >= (startTime + period));
  } else {
    return (currentTime >= (4294967295 - startTime + period));
  }
}
void _menuUpEvents (byte menuIndex)
{
  byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
  byte parIndex = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]);
  byte parentStartIndex;
  byte parentStopIndex;
  if (parIndex == 0) {
    parentStartIndex = (_MainMenus[menuIndex]).startIndex;
    parentStopIndex = (_MainMenus[menuIndex]).stopIndex;
  }
  else {
    parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]);
    parentStopIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 4]);
  }
  if (tempIndex == parentStartIndex) {
    if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) {
      (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStopIndex - 1];
      return;
    } else {
      return;
    }
  }
  (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex - 2];
  return;
}
void _menuDownEvents (byte menuIndex)
{
  byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
  byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]);
  byte parentStartIndex;
  byte parentStopIndex;
  if (parIndex == 0) {
    parentStartIndex = (_MainMenus[menuIndex]).startIndex;
    parentStopIndex = (_MainMenus[menuIndex]).stopIndex;
  }
  else {
    parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]);
    parentStopIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[parIndex - 1]).startInArrayIndex) + 4]);
  }
  if (tempIndex == parentStopIndex) {
    if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) {
      (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStartIndex - 1];
      return;
    } else {
      return;
    }
  }
  (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex];
  return;
}
void _valueUpEvents (byte menuIndex)
{
  byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]);
  byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]);
  byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]);
  if (itemType == 3) {
    _menuValueArray_bool[valIndex - 1 ] = 1;
    return;
  }
  if (itemType == 4) {
    _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] + (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1]));
  }
}
void _valueDownEvents (byte menuIndex)
{

  byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]);
  byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]);
  byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]);
  if (itemType == 3) {
    _menuValueArray_bool[valIndex - 1] = 0;
    return;
  }
  if (itemType == 4) {
    _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] - (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1]));
  }
}
void _menuEnterTheMenuEvents (byte menuIndex)
{
  byte itemType =  pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  if (!(itemType == 0)) {
    return;
  }
  byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
  byte newIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[tempIndex - 1]).startInArrayIndex) + 3]);
  if (newIndex == 0) {
    return;
  }
  (_MainMenus[menuIndex]).currentItem = _MenuItems[newIndex - 1];
  return;
}
void _menuExitFromMenuEvents (byte menuIndex)
{
  byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]);
  if (parIndex == 0) {
    return;
  }
  (_MainMenus[menuIndex]).currentItem = _MenuItems[parIndex - 1];
  return;
}
String _menuOutputValueString (byte menuIndex)
{
  byte itemType = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  byte valueStrIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 11]);
  if (itemType == 0) {
    if ( valueStrIndex == 0) {
      return "";
    } else {
      return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[valueStrIndex - 1])));
    }
  }
  byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]);
  byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]);
  byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]);
  if ( valIndex == 0) {
    return "";
  }
  byte convFormat = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 9]);
  if (itemType == 3) {
    return _convertBoolean(itemType, convFormat, valIndex, indexMax, indexMin);
  }
  if (itemType == 4) {
    return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin);
  }
  return "";
}
void _menuUpdateToEEpromItems()
{
  EEPROM.updateInt(2, (_menuValueArray_int[0]));
  EEPROM.updateBit(1, 0, (_menuValueArray_bool[0]));
  EEPROM.updateInt(4, (_menuValueArray_int[1]));
  EEPROM.updateInt(6, (_menuValueArray_int[2]));
  EEPROM.updateInt(8, (_menuValueArray_int[3]));
}
String _readStringFromProgmem (char *string)
{
  String result = String("");
  while (pgm_read_byte(string) != '\0')
  {
    result = result + char(pgm_read_byte(string));
    string++;
  }
  return result;
}
String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
  if (itemType == 4) {
    if (convFormat == 4) {
      return String((_menuValueArray_int[valIndex - 1 ]), DEC);
    }
    if (convFormat == 5) {
      return String((_menuValueArray_int[valIndex - 1]), HEX);
    }
    if (convFormat == 6) {
      return String((_menuValueArray_int[valIndex - 1]), BIN);
    }
  }
}
String _convertBoolean(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
  if (convFormat == 1) {
    if (_menuValueArray_bool[valIndex - 1]) {
      return "1";
    } else {
      return "0";
    }
  }
  if (convFormat == 2) {
    if (_menuValueArray_bool[valIndex - 1]) {
      return "True";
    } else {
      return "False";
    }
  }
  if (convFormat == 3) {
    if (_menuValueArray_bool[valIndex - 1 ]) {
      return "Да";
    } else {
      return "Нет";
    }
  }
  if (_menuValueArray_bool[valIndex - 1]) {
    return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMax - 1])));
  } else {
    return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMin - 1])));
  }
}
float _convertDS18x2xData(byte type_s, byte data[12])
{
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s)
  {
    raw = raw << 3;
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  }
  else
  {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;   else if (cfg == 0x20) raw = raw & ~3;  else if (cfg == 0x40) raw = raw & ~1;
  }
  return  (float)raw / 16.0;
}
float _readDS18_ow12(byte addr[8], byte type_s)
{ byte data[12];
  byte i;
  _ow12.reset();
  _ow12.select(addr);
  _ow12.write(0xBE);
  for ( i = 0; i < 9; i++) {
    data[i] = _ow12.read();
  }
  _ow12.reset();
  _ow12.select(addr);
  _ow12.write(0x44, 1);
  return _convertDS18x2xData(type_s, data);
}
bool _oneWireSeach (byte array[], OneWire ow )
{
  byte temp[8];
  byte i;
  if ( !ow.search(temp)) {
    return false;
  }
  if (OneWire::crc8(temp, 7) != temp[7]) {
    return false;
  }

  switch (temp[0]) {
    case 0x10:
      array[8] = 1;
      break;
    case 0x28:
      array[8] = 0;
      break;
    case 0x22:
      array[8] = 0;
      break;
    default:
      return false;
  }

  for ( i = 0; i < 8; i++) {
    array[i] = temp[i];
  }
  return true;
} struct UB_142171746 _func_UB_142171746(struct UB_142171746 _ubInstans, int ubi_125089190, int ubpar_125440348, int ubpar_79146376, int ubpar_175158211, int ubpar_40719224)
{
  bool ubo_101667604 = _ubInstans.ubo_101667604;
  bool ubo_51674151 = _ubInstans.ubo_51674151;
  bool ubo_137412502 = _ubInstans.ubo_137412502;
  bool ubo_174461762 = _ubInstans.ubo_174461762;
  bool ubo_157422683 = _ubInstans.ubo_157422683;
  int _gtv1 = _ubInstans._gtv1;
  int _gtv2 = _ubInstans._gtv2;
  int _gtv3 = _ubInstans._gtv3;
  int _gtv4 = _ubInstans._gtv4;
  int _gtv5 = _ubInstans._gtv5;
  bool _bounse1S = _ubInstans._bounse1S;
  bool _bounse1O = _ubInstans._bounse1O;
  unsigned long _bounse1P = _ubInstans._bounse1P;
  bool _bounse2S = _ubInstans._bounse2S;
  bool _bounse2O = _ubInstans._bounse2O;
  unsigned long _bounse2P = _ubInstans._bounse2P;
  bool _bounse3S = _ubInstans._bounse3S;
  bool _bounse3O = _ubInstans._bounse3O;
  unsigned long _bounse3P = _ubInstans._bounse3P;
  bool _bounse4S = _ubInstans._bounse4S;
  bool _bounse4O = _ubInstans._bounse4O;
  unsigned long _bounse4P = _ubInstans._bounse4P;
  bool _bounse5S = _ubInstans._bounse5S;
  bool _bounse5O = _ubInstans._bounse5O;
  unsigned long _bounse5P = _ubInstans._bounse5P;
  bool   _bounceTmpD1 = (ubi_125089190) < (_gtv1);

  if (_bounse1S)
  {
    if (millis() >= (_bounse1P + 40))
    {
      _bounse1O =  _bounceTmpD1;
      _bounse1S = 0;
    }
  }
  else
  {
    if ( _bounceTmpD1 != _bounse1O )
    {
      _bounse1S = 1;
      _bounse1P = millis();
    }
  }
  bool   _bounceTmpD2 = ( ((ubi_125089190) > (_gtv1)) && ((ubi_125089190) < (_gtv2)) );

  if (_bounse2S)
  {
    if (millis() >= (_bounse2P + 40))
    {
      _bounse2O =  _bounceTmpD2;
      _bounse2S = 0;
    }
  }
  else
  {
    if ( _bounceTmpD2 != _bounse2O )
    {
      _bounse2S = 1;
      _bounse2P = millis();
    }
  }
  bool   _bounceTmpD3 = ( ((ubi_125089190) > (_gtv2)) && ((ubi_125089190) < (_gtv3)) );

  if (_bounse3S)
  {
    if (millis() >= (_bounse3P + 40))
    {
      _bounse3O =  _bounceTmpD3;
      _bounse3S = 0;
    }
  }
  else
  {
    if ( _bounceTmpD3 != _bounse3O )
    {
      _bounse3S = 1;
      _bounse3P = millis();
    }
  }
  bool   _bounceTmpD4 = ( ((ubi_125089190) > (_gtv3)) && ((ubi_125089190) < (_gtv4)) );

  if (_bounse4S)
  {
    if (millis() >= (_bounse4P + 40))
    {
      _bounse4O =  _bounceTmpD4;
      _bounse4S = 0;
    }
  }
  else
  {
    if ( _bounceTmpD4 != _bounse4O )
    {
      _bounse4S = 1;
      _bounse4P = millis();
    }
  }
  bool   _bounceTmpD5 = ( ((ubi_125089190) > (_gtv4)) && ((ubi_125089190) < (_gtv5)) );

  if (_bounse5S)
  {
    if (millis() >= (_bounse5P + 40))
    {
      _bounse5O =  _bounceTmpD5;
      _bounse5S = 0;
    }
  }
  else
  {
    if ( _bounceTmpD5 != _bounse5O )
    {
      _bounse5S = 1;
      _bounse5P = millis();
    }
  }
  _gtv1 = (ubpar_125440348) / (2);
  _gtv2 = (((ubpar_79146376) - (ubpar_125440348)) / (2)) + (ubpar_125440348);
  _gtv3 = (((ubpar_175158211) - (ubpar_79146376)) / (2)) + (ubpar_79146376);
  _gtv4 = (((ubpar_40719224) - (ubpar_175158211)) / (2)) + (ubpar_175158211);
  _gtv5 = (((1023) - (ubpar_40719224)) / (2)) + (ubpar_40719224);
  ubo_101667604 = _bounse1O;
  ubo_51674151 = _bounse2O;
  ubo_137412502 = _bounse3O;
  ubo_174461762 = _bounse4O;
  ubo_157422683 = _bounse5O;
  _ubInstans.ubo_101667604 = ubo_101667604;
  _ubInstans.ubo_51674151 = ubo_51674151;
  _ubInstans.ubo_137412502 = ubo_137412502;
  _ubInstans.ubo_174461762 = ubo_174461762;
  _ubInstans.ubo_157422683 = ubo_157422683;
  _ubInstans._gtv1 = _gtv1;
  _ubInstans._gtv2 = _gtv2;
  _ubInstans._gtv3 = _gtv3;
  _ubInstans._gtv4 = _gtv4;
  _ubInstans._gtv5 = _gtv5;
  _ubInstans._bounse1S = _bounse1S;
  _ubInstans._bounse1O = _bounse1O;
  _ubInstans._bounse1P = _bounse1P;
  _ubInstans._bounse2S = _bounse2S;
  _ubInstans._bounse2O = _bounse2O;
  _ubInstans._bounse2P = _bounse2P;
  _ubInstans._bounse3S = _bounse3S;
  _ubInstans._bounse3O = _bounse3O;
  _ubInstans._bounse3P = _bounse3P;
  _ubInstans._bounse4S = _bounse4S;
  _ubInstans._bounse4O = _bounse4O;
  _ubInstans._bounse4P = _bounse4P;
  _ubInstans._bounse5S = _bounse5S;
  _ubInstans._bounse5O = _bounse5O;
  _ubInstans._bounse5P = _bounse5P;
  return _ubInstans;
}

Результат кода для матричной клавиатуры
#include <Wire.h>
#include <EEPROMex.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C _lcd2(0x27, 20, 4);
int _dispTempLength2 = 0;
boolean _isNeedClearDisp2;


OneWire  _ow12(12);
byte _FLPArray27618413[9];
const byte _menuParametrsArray[]  PROGMEM =  {1, 5, 1, 0, 0, 0, 0, 0, 1, 4, 1, 0, 0, 2, 0, 0, 6, 7, 0, 0, 0, 0, 0, 9, 11, 0, 3, 0, 0, 8, 9, 0, 0, 0, 0, 0, 7, 11, 0, 4, 3, 1, 0, 0, 0, 12, 13, 1, 8, 4, 0, 0, 5, 5, 2, 0, 0, 0, 0, 0, 1, 4, 2, 0, 0, 6, 4, 4, 0, 0, 2, 0, 0, 1, 4, 8, 0, 10, 7, 4, 2, 0, 0, 2, 0, 0, 1, 4, 5, 0, 10, 8, 4, 3, 0, 0, 3, 0, 0, 1, 4, 6, 0, 10, 9, 4, 1, 0, 0, 3, 0, 0, 1, 4, 3, 0, 10};
bool _menuValueArray_bool[1];
const bool _menuConstantValuesArray_bool[]  PROGMEM =  {1};
int _menuValueArray_int[4];
const int _menuConstantValuesArray_int[]  PROGMEM =  {1};
long _menuValueArray_long[2];
const long _menuConstantValuesArray_long[]  PROGMEM =  {1};
const char _flprogMenuNameString1[] PROGMEM = "Enter Password";
const char _flprogMenuNameString2[] PROGMEM = "ChangePassword";
const char _flprogMenuNameString3[] PROGMEM = "Vent-Off";
const char _flprogMenuNameString4[] PROGMEM = "Sound";
const char _flprogMenuNameString5[] PROGMEM = "Heater-Off";
const char _flprogMenuNameString6[] PROGMEM = "Vent-On";
const char _flprogMenuNameString7[] PROGMEM = "Vent Setting";
const char _flprogMenuNameString8[] PROGMEM = "Heater-On";
const char _flprogMenuNameString9[] PROGMEM = "HeaterSetting";
const char _flprogMenuNameString10[] PROGMEM = "C";
const char _flprogMenuNameString11[] PROGMEM = "Enter to submenu";
const char _flprogMenuNameString12[] PROGMEM = "On";
const char _flprogMenuNameString13[] PROGMEM = "Off";
const char* const _flprogMenuStringsArray[] PROGMEM = { _flprogMenuNameString1,  _flprogMenuNameString2,  _flprogMenuNameString3,  _flprogMenuNameString4,  _flprogMenuNameString5,  _flprogMenuNameString6,  _flprogMenuNameString7,  _flprogMenuNameString8,  _flprogMenuNameString9,  _flprogMenuNameString10,  _flprogMenuNameString11,  _flprogMenuNameString12,  _flprogMenuNameString13};
struct _menuItemStricture {
  int startInArrayIndex;
};
struct _menuMainStricture {
  String tempString;
  byte startIndex;
  byte stopIndex;
  bool isSwitchMenuAroundRing;
  _menuItemStricture  currentItem;
};
_menuItemStricture _MenuItems[9];
_menuMainStricture _MainMenus[2];
bool _gtv6;
bool _gtv10 = 0;
float _gtv11;
bool _gtv12 = 0;
bool _gtv1;
bool _gtv2;
bool _gtv3;
bool _gtv4;
bool _gtv5;
bool _gtv13;
bool _gtv14;
bool _gtv15;
bool _gtv16;
bool _gtv17;
bool _gtv18;
bool _gtv19;
bool _gtv20;
bool _gtv21;
bool _gtv22;
bool _gtv23;
bool _gtv7;
bool _gtv8;
bool _trgr4 = 0;
int Menu_Value_1_TVD = 0;
bool _trgrt2 = 0;
bool _trgrt2I = 0;
bool _trgt1 = 0;
bool _trgt1I = 0;
int _disp4oldLength = 0;
String _MenuBlock_47814740_ASO_1;
String _MenuBlock_47814740_MNO;
String _MenuBlock_47814740_VNO;
bool _MenuBlock_47814740_OEIS = 0;
bool _MenuBlock_47814740_OMUIS = 0;
bool _MenuBlock_47814740_OMDIS = 0;
bool _MenuBlock_47814740_OEMIS = 0;
bool _MenuBlock_47814740_OExFMIS = 0;
bool _MenuBlock_47814740_OVUIS = 0;
bool _MenuBlock_47814740_OVDIS = 0;
unsigned long _MenuBlock_47814740_VUDST = 0UL;
unsigned long _MenuBlock_47814740_VUDSPT = 0UL;
byte _MenuBlock_47814740_VUDSM = 0;
int _MenuBlock_47814740_VUDPT = 0;
bool _MenuBlock_47814740_IDI_0 = 0;
bool _MenuBlock_47814740_IDI_1 = 0;
bool _MenuBlock_47814740_IDI_2 = 0;
bool _MenuBlock_47814740_IDI_3 = 0;
bool _MenuBlock_47814740_IDI_4 = 0;
bool _MenuBlock_47814740_IDI_5 = 0;
bool _MenuBlock_47814740_IDI_6 = 0;
bool _MenuBlock_47814740_IDI_7 = 0;
bool _MenuBlock_47814740_IDI_8 = 0;
bool _MenuBlock_47814740_IDI_9 = 0;
bool _MenuBlock_47814740MinusIOS = 0;
bool _trgr1 = 0;
bool _trgr3 = 0;
bool _mkb1C1xP1 = 0;
bool _mkb1C1xP2 = 0;
bool _mkb1C1xP3 = 0;
bool _mkb1C1xP4 = 0;
bool _mkb1C2xP1 = 0;
bool _mkb1C2xP2 = 0;
bool _mkb1C2xP3 = 0;
bool _mkb1C2xP4 = 0;
bool _mkb1C3xP1 = 0;
bool _mkb1C3xP2 = 0;
bool _mkb1C3xP3 = 0;
bool _mkb1C3xP4 = 0;
bool _mkb1C4xP1 = 0;
bool _mkb1C4xP2 = 0;
bool _mkb1C4xP3 = 0;
bool _mkb1C4xP4 = 0;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
int Menu_Value_4_TVD = 0;
int _disp7oldLength = 0;
String _swi2;
int _disp2oldLength = 0;
String _MenuBlock_360159546_MNO;
String _MenuBlock_360159546_VNO;
bool _MenuBlock_360159546_OEIS = 0;
bool _MenuBlock_360159546_OMUIS = 0;
bool _MenuBlock_360159546_OMDIS = 0;
bool _MenuBlock_360159546_OVUIS = 0;
bool _MenuBlock_360159546_OVDIS = 0;
bool _MenuBlock_360159546_IDI_0 = 0;
bool _MenuBlock_360159546_IDI_1 = 0;
bool _MenuBlock_360159546_IDI_2 = 0;
bool _MenuBlock_360159546_IDI_3 = 0;
bool _MenuBlock_360159546_IDI_4 = 0;
bool _MenuBlock_360159546_IDI_5 = 0;
bool _MenuBlock_360159546_IDI_6 = 0;
bool _MenuBlock_360159546_IDI_7 = 0;
bool _MenuBlock_360159546_IDI_8 = 0;
bool _MenuBlock_360159546_IDI_9 = 0;
int Menu_Value_3_TVD = 0;
int Menu_Value_2_TVD = 0;
String _swi1;
int _disp1oldLength = 0;
int _disp3oldLength = 0;
int _disp6oldLength = 0;
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
int _disp5oldLength = 0;
bool _sowb1_needScan = 0;
bool _sowb1_ost = 0;
bool _sowb1_FLPArray27618413 = 0;
void setup()
{
  if ((EEPROM.read(0)) != 99) {
    EEPROM.write(0, 99) ;
    EEPROM.updateInt(10, 40);
    EEPROM.updateBit(1, 0, 0);
    EEPROM.updateInt(6, 30);
    EEPROM.updateInt(12, 10);
    EEPROM.updateLong(2, 123456);
    EEPROM.updateInt(8, 25);
  }
  Wire.begin();
  pinMode(16, OUTPUT);
  pinMode(15, OUTPUT);
  pinMode(17, OUTPUT);

  _lcd2.init();
  _lcd2.backlight();
  pinMode(6, INPUT);
  digitalWrite(6, HIGH);
  pinMode(7, INPUT);
  digitalWrite(7, HIGH);
  pinMode(8, INPUT);
  digitalWrite(8, HIGH);
  pinMode(9, INPUT);
  digitalWrite(9, HIGH);
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  pinMode(3, OUTPUT);
  digitalWrite(3, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);
  _MenuItems[0].startInArrayIndex = 0;
  _MenuItems[1].startInArrayIndex = 13;
  _MenuItems[2].startInArrayIndex = 26;
  _MenuItems[3].startInArrayIndex = 39;
  _MenuItems[4].startInArrayIndex = 52;
  _MenuItems[5].startInArrayIndex = 65;
  _MenuItems[6].startInArrayIndex = 78;
  _MenuItems[7].startInArrayIndex = 91;
  _MenuItems[8].startInArrayIndex = 104;
  _MainMenus[0].tempString = "";
  _MainMenus[0].startIndex = 1;
  _MainMenus[0].isSwitchMenuAroundRing = 0;
  _MainMenus[0].stopIndex = 1;
  _MainMenus[0].currentItem = _MenuItems[0];
  _MainMenus[1].tempString = "";
  _MainMenus[1].startIndex = 2;
  _MainMenus[1].isSwitchMenuAroundRing = 1;
  _MainMenus[1].stopIndex = 5;
  _MainMenus[1].currentItem = _MenuItems[1];
  _menuValueArray_long[1] = (EEPROM.readLong(2));
  _menuValueArray_int[0] = (EEPROM.readInt(6));
  _menuValueArray_bool[0] = (EEPROM.readBit(1, 0));
  _menuValueArray_int[1] = (EEPROM.readInt(8));
  _menuValueArray_int[2] = (EEPROM.readInt(10));
  _menuValueArray_int[3] = (EEPROM.readInt(12));
}
void loop()
{ bool _tempVariable_bool;
  byte _tempVariable_byte;
  if (_isNeedClearDisp2) {
    _lcd2.clear();
    _isNeedClearDisp2 = 0;
  }




  if (1) {
    if (_trgrt2I) {
      _trgrt2 = 0;
    } else {
      _trgrt2 = 1;
      _trgrt2I = 1;
    }
  } else {
    _trgrt2 = 0;
    _trgrt2I = 0;
  };
  if (_isTimer(_d18x2x1Tti, 1000)) {
    _d18x2x1Tti = millis();
    _d18x2x1O =  _readDS18_ow12(_FLPArray27618413, _FLPArray27618413[8]);
  }
  if (_sowb1_needScan) {
    if ( _oneWireSeach (_FLPArray27618413, _ow12)) {
      _sowb1_FLPArray27618413 = 1;
    }
    _ow12.reset_search();
    _sowb1_needScan = 0;
  }
  if (_trgrt2) {
    if (! _sowb1_ost) {
      _sowb1_ost = 1;
      _sowb1_needScan = 1;
      _sowb1_FLPArray27618413 = 0;
    }
  } else {
    _sowb1_ost = 0;
  }
  _gtv11 = (_d18x2x1O);
  digitalWrite(2, 0);
  _mkb1C1xP1 = ! (digitalRead(6));
  _mkb1C1xP2 = ! (digitalRead(7));
  _mkb1C1xP3 = ! (digitalRead(8));
  _mkb1C1xP4 = ! (digitalRead(9));
  digitalWrite(2, 1);
  digitalWrite(3, 0);
  _mkb1C2xP1 = ! (digitalRead(6));
  _mkb1C2xP2 = ! (digitalRead(7));
  _mkb1C2xP3 = ! (digitalRead(8));
  _mkb1C2xP4 = ! (digitalRead(9));
  digitalWrite(3, 1);
  digitalWrite(4, 0);
  _mkb1C3xP1 = ! (digitalRead(6));
  _mkb1C3xP2 = ! (digitalRead(7));
  _mkb1C3xP3 = ! (digitalRead(8));
  _mkb1C3xP4 = ! (digitalRead(9));
  digitalWrite(4, 1);
  digitalWrite(5, 0);
  _mkb1C4xP1 = ! (digitalRead(6));
  _mkb1C4xP2 = ! (digitalRead(7));
  _mkb1C4xP3 = ! (digitalRead(8));
  _mkb1C4xP4 = ! (digitalRead(9));
  digitalWrite(5, 1);
  _gtv1 = _mkb1C1xP1;
  _gtv2 = _mkb1C1xP2;
  _gtv3 = _mkb1C1xP3;
  _gtv18 = _mkb1C1xP4;
  _gtv4 = _mkb1C2xP1;
  _gtv5 = _mkb1C2xP2;
  _gtv13 = _mkb1C2xP3;
  _gtv19 = _mkb1C2xP4;
  _gtv14 = _mkb1C3xP1;
  _gtv15 = _mkb1C3xP2;
  _gtv16 = _mkb1C3xP3;
  _gtv20 = _mkb1C3xP4;
  _gtv23 = _mkb1C4xP1;
  _gtv17 = _mkb1C4xP2;
  _gtv22 = _mkb1C4xP3;
  _gtv21 = _mkb1C4xP4;
  bool  _tmp1 = _gtv23;
  if (_tmp1)  {
    if (! _trgt1I) _trgt1 = ! _trgt1;
  }
  _trgt1I = _tmp1;
  _gtv6 = _trgt1;
  if (_gtv7) {
    _tempVariable_bool  =  1;
    if ( ! _MenuBlock_360159546_OEIS ) {
      _MenuBlock_360159546_OEIS = 1;
      (_MainMenus[0]).tempString = "";
    }
    _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 10]);
    _MenuBlock_360159546_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1])));
    _MenuBlock_360159546_VNO = _menuOutputValueString (0);
  } else {
    _tempVariable_bool  =  0;
    if (_MenuBlock_360159546_OEIS) {
      _MenuBlock_360159546_OEIS = 0;
      _menuUpdateToEEpromItems();
    }
    _MenuBlock_360159546_MNO = "";
    _MenuBlock_360159546_VNO = "";
  }
  if (0) {
    if ( ! _MenuBlock_360159546_OMUIS) {
      _MenuBlock_360159546_OMUIS = 1; if (_tempVariable_bool) {
        _menuUpEvents(0);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_360159546_OMUIS = 0;
  }
  if (0) {
    if ( ! _MenuBlock_360159546_OMDIS) {
      _MenuBlock_360159546_OMDIS = 1; if (_tempVariable_bool) {
        _menuDownEvents(0);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_360159546_OMDIS = 0;
  }
  if (0) {
    if ( ! _MenuBlock_360159546_OVUIS) {
      _MenuBlock_360159546_OVUIS = 1;
      if (_tempVariable_bool) {
        _valueUpEvents(0);
      }
    }
  } else {
    _MenuBlock_360159546_OVUIS = 0;
  }
  if (0) {
    if ( ! _MenuBlock_360159546_OVDIS) {
      _MenuBlock_360159546_OVDIS = 1;
      if (_tempVariable_bool) {
        _valueDownEvents(0);
      }
    }
  } else {
    _MenuBlock_360159546_OVDIS = 0;
  }
  if (_gtv17) {
    if ( ! _MenuBlock_360159546_IDI_0) {
      _MenuBlock_360159546_IDI_0 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '0');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_0 = 0;
  }
  if (_gtv1) {
    if ( ! _MenuBlock_360159546_IDI_1) {
      _MenuBlock_360159546_IDI_1 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '1');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_1 = 0;
  }
  if (_gtv2) {
    if ( ! _MenuBlock_360159546_IDI_2) {
      _MenuBlock_360159546_IDI_2 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '2');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_2 = 0;
  }
  if (_gtv3) {
    if ( ! _MenuBlock_360159546_IDI_3) {
      _MenuBlock_360159546_IDI_3 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '3');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_3 = 0;
  }
  if (_gtv4) {
    if ( ! _MenuBlock_360159546_IDI_4) {
      _MenuBlock_360159546_IDI_4 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '4');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_4 = 0;
  }
  if (_gtv5) {
    if ( ! _MenuBlock_360159546_IDI_5) {
      _MenuBlock_360159546_IDI_5 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '5');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_5 = 0;
  }
  if (_gtv13) {
    if ( ! _MenuBlock_360159546_IDI_6) {
      _MenuBlock_360159546_IDI_6 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '6');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_6 = 0;
  }
  if (_gtv14) {
    if ( ! _MenuBlock_360159546_IDI_7) {
      _MenuBlock_360159546_IDI_7 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '7');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_7 = 0;
  }
  if (_gtv15) {
    if ( ! _MenuBlock_360159546_IDI_8) {
      _MenuBlock_360159546_IDI_8 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '8');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_8 = 0;
  }
  if (_gtv16) {
    if ( ! _MenuBlock_360159546_IDI_9) {
      _MenuBlock_360159546_IDI_9 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(0, '9');
      }
    }
  } else {
    _MenuBlock_360159546_IDI_9 = 0;
  }
  if (_gtv7) {
    _dispTempLength2 = ((_MenuBlock_360159546_MNO)).length();
    if (_disp6oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp6oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0);
    _lcd2.print((_MenuBlock_360159546_MNO));
  } else {
    if (_disp6oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp6oldLength = 0;
    }
  }
  if (_gtv7) {
    _dispTempLength2 = ((_MenuBlock_360159546_VNO)).length();
    if (_disp7oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp7oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1);
    _lcd2.print((_MenuBlock_360159546_VNO));
  } else {
    if (_disp7oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp7oldLength = 0;
    }
  }
  if (_trgrt1) _trgr1 = 0;
  if (((_menuValueArray_long[0])) == ((_menuValueArray_long[1]))) _trgr1 = 1;
  if (!(_gtv6)) {
    if (_trgrt1I) {
      _trgrt1 = 0;
    } else {
      _trgrt1 = 1;
      _trgrt1I = 1;
    }
  } else {
    _trgrt1 = 0;
    _trgrt1I = 0;
  };
  _gtv7 = ( (_gtv6) && (!(_trgr1)) );
  _gtv8 = ( (_trgr1) && (_gtv6) );
  if (_trgrt1) {
    _menuValueArray_long[0] = 0L;
  }
  if (_gtv8) {
    _tempVariable_bool  =  1;
    if ( ! _MenuBlock_47814740_OEIS ) {
      _MenuBlock_47814740_OEIS = 1;
      _MainMenus[1].currentItem = _MenuItems[1];
      (_MainMenus[1]).tempString = "";
    }
    _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[1].currentItem ).startInArrayIndex) + 10]);
    _MenuBlock_47814740_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1])));
    _MenuBlock_47814740_VNO = _menuOutputValueString (1);
    _tempVariable_byte  =  pgm_read_byte(&_menuParametrsArray[(((_MainMenus[1]).currentItem).startInArrayIndex) + 12]);
    if (_tempVariable_byte == 0 ) {
      _MenuBlock_47814740_ASO_1 =  "";
    } else {
      _MenuBlock_47814740_ASO_1 =  _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1])));
    }
  } else {
    _tempVariable_bool  =  0;
    if (_MenuBlock_47814740_OEIS) {
      _MenuBlock_47814740_OEIS = 0;
      _menuUpdateToEEpromItems();
    }
    _MenuBlock_47814740_ASO_1 =  "";
    _MenuBlock_47814740_MNO = "";
    _MenuBlock_47814740_VNO = "";
  }
  if (_gtv20) {
    if ( ! _MenuBlock_47814740_OMUIS) {
      _MenuBlock_47814740_OMUIS = 1; if (_tempVariable_bool) {
        _menuUpEvents(1);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OMUIS = 0;
  }
  if (_gtv21) {
    if ( ! _MenuBlock_47814740_OMDIS) {
      _MenuBlock_47814740_OMDIS = 1; if (_tempVariable_bool) {
        _menuDownEvents(1);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OMDIS = 0;
  }
  if (_gtv18) {
    if ( ! _MenuBlock_47814740_OEMIS) {
      _MenuBlock_47814740_OEMIS = 1; if (_tempVariable_bool) {
        _menuEnterTheMenuEvents (1);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OEMIS = 0;
  }
  if (_gtv19) {
    if ( ! _MenuBlock_47814740_OExFMIS) {
      _MenuBlock_47814740_OExFMIS = 1; if (_tempVariable_bool) {
        _menuExitFromMenuEvents (1);
        _menuUpdateToEEpromItems();
      }
    }
  } else {
    _MenuBlock_47814740_OExFMIS = 0;
  }
  if (0) {
    if ( ! _MenuBlock_47814740_OVUIS) {
      _MenuBlock_47814740_OVUIS = 1;
      if (_tempVariable_bool) {
        _valueUpEvents(1);
        _MenuBlock_47814740_VUDST = millis();
      }
    } if (_tempVariable_bool) {
      if (_MenuBlock_47814740_VUDSM == 0) {
        if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) {
          _MenuBlock_47814740_VUDSM = 1;
          _MenuBlock_47814740_VUDSPT = millis();
          _MenuBlock_47814740_VUDPT  = 500;
        }
      }  else {
        if (_MenuBlock_47814740_VUDSM == 1) {
          if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) {
            _MenuBlock_47814740_VUDSM = 2;
            _MenuBlock_47814740_VUDPT  = 200;
          }
        } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) {
          _valueUpEvents(1);
          _MenuBlock_47814740_VUDSPT = millis();
        }
      }
    }
  } else {
    _MenuBlock_47814740_OVUIS = 0;
    if ( ! ( 0)) {
      _MenuBlock_47814740_VUDSM = 0;
    }
  }
  if (0) {
    if ( ! _MenuBlock_47814740_OVDIS) {
      _MenuBlock_47814740_OVDIS = 1;
      if (_tempVariable_bool) {
        _valueDownEvents(1);
        _MenuBlock_47814740_VUDST = millis();
      }
    } if (_tempVariable_bool) {
      if (_MenuBlock_47814740_VUDSM == 0) {
        if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) {
          _MenuBlock_47814740_VUDSM = 1;
          _MenuBlock_47814740_VUDSPT = millis();
          _MenuBlock_47814740_VUDPT  = 500;
        }
      }  else {
        if (_MenuBlock_47814740_VUDSM == 1) {
          if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) {
            _MenuBlock_47814740_VUDSM = 2;
            _MenuBlock_47814740_VUDPT  = 200;
          }
        } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) {
          _valueDownEvents(1);
          _MenuBlock_47814740_VUDSPT = millis();
        }
      }
    }
  } else {
    _MenuBlock_47814740_OVDIS = 0;
    if ( ! ( 0)) {
      _MenuBlock_47814740_VUDSM = 0;
    }
  }
  if (_gtv17) {
    if ( ! _MenuBlock_47814740_IDI_0) {
      _MenuBlock_47814740_IDI_0 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '0');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_0 = 0;
  }
  if (_gtv1) {
    if ( ! _MenuBlock_47814740_IDI_1) {
      _MenuBlock_47814740_IDI_1 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '1');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_1 = 0;
  }
  if (_gtv2) {
    if ( ! _MenuBlock_47814740_IDI_2) {
      _MenuBlock_47814740_IDI_2 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '2');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_2 = 0;
  }
  if (_gtv3) {
    if ( ! _MenuBlock_47814740_IDI_3) {
      _MenuBlock_47814740_IDI_3 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '3');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_3 = 0;
  }
  if (_gtv4) {
    if ( ! _MenuBlock_47814740_IDI_4) {
      _MenuBlock_47814740_IDI_4 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '4');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_4 = 0;
  }
  if (_gtv5) {
    if ( ! _MenuBlock_47814740_IDI_5) {
      _MenuBlock_47814740_IDI_5 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '5');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_5 = 0;
  }
  if (_gtv13) {
    if ( ! _MenuBlock_47814740_IDI_6) {
      _MenuBlock_47814740_IDI_6 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '6');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_6 = 0;
  }
  if (_gtv14) {
    if ( ! _MenuBlock_47814740_IDI_7) {
      _MenuBlock_47814740_IDI_7 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '7');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_7 = 0;
  }
  if (_gtv15) {
    if ( ! _MenuBlock_47814740_IDI_8) {
      _MenuBlock_47814740_IDI_8 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '8');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_8 = 0;
  }
  if (_gtv16) {
    if ( ! _MenuBlock_47814740_IDI_9) {
      _MenuBlock_47814740_IDI_9 = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '9');
      }
    }
  } else {
    _MenuBlock_47814740_IDI_9 = 0;
  }
  if (_gtv22) {
    if ( ! _MenuBlock_47814740MinusIOS) {
      _MenuBlock_47814740MinusIOS = 1;
      if (_tempVariable_bool) {
        _menuDirectInputKeyPressEvents(1, '-' );
      }
    }
  } else {
    _MenuBlock_47814740MinusIOS = 0;
  }
  if (_gtv8) {
    _dispTempLength2 = ((_MenuBlock_47814740_MNO)).length();
    if (_disp2oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp2oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0);
    _lcd2.print((_MenuBlock_47814740_MNO));
  } else {
    if (_disp2oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp2oldLength = 0;
    }
  }
  if (_gtv8) {
    _dispTempLength2 = ((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))).length();
    if (_disp1oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp1oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1);
    _lcd2.print((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1))));
  } else {
    if (_disp1oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp1oldLength = 0;
    }
  }
  if ((_gtv11) > (Menu_Value_2_TVD)) _trgr3 = 0;
  if ((_gtv11) < (Menu_Value_1_TVD)) _trgr3 = 1;
  digitalWrite(16, !(_trgr3));
  if (!(_gtv6)) {
    Menu_Value_1_TVD = _menuValueArray_int[3];
  }
  _gtv10 = _trgr3;
  if (!(_gtv6)) {
    Menu_Value_2_TVD = _menuValueArray_int[1];
  }
  if ((_gtv11) < (Menu_Value_4_TVD)) _trgr4 = 0;
  if ((_gtv11) > (Menu_Value_3_TVD)) _trgr4 = 1;
  if (!(_gtv6)) {
    Menu_Value_3_TVD = _menuValueArray_int[2];
  }
  digitalWrite(15, !(_trgr4));
  _gtv12 = _trgr4;
  if (!(_gtv6)) {
    Menu_Value_4_TVD = _menuValueArray_int[0];
  }
  digitalWrite(17, ( (( (_gtv12) || (_gtv10) )) && ((_menuValueArray_bool[0])) ));
  if (_gtv10)
  {
    _swi1 = String("Heater - ON");
  }
  else
  {
    _swi1 = String("Heater - OFF");
  }
  if (_gtv12)
  {
    _swi2 = String("Ventilation - ON");
  }
  else
  {
    _swi2 = String("Ventilation - OFF");
  }
  if (!(_gtv6)) {
    _dispTempLength2 = ((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))).length();
    if (_disp3oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp3oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0);
    _lcd2.print((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C")))));
  } else {
    if (_disp3oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp3oldLength = 0;
    }
  }
  if (!(_gtv6)) {
    _dispTempLength2 = ((_swi1)).length();
    if (_disp4oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp4oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1);
    _lcd2.print((_swi1));
  } else {
    if (_disp4oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp4oldLength = 0;
    }
  }
  if (!(_gtv6)) {
    _dispTempLength2 = ((_swi2)).length();
    if (_disp5oldLength > _dispTempLength2) {
      _isNeedClearDisp2 = 1;
    }
    _disp5oldLength = _dispTempLength2;
    _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 2);
    _lcd2.print((_swi2));
  } else {
    if (_disp5oldLength > 0) {
      _isNeedClearDisp2 = 1;
      _disp5oldLength = 0;
    }
  }




}
String  _floatToStringWitRaz(float value, int raz)
{

  return String(value, raz);
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
  unsigned long currentTime;
  currentTime = millis();
  if (currentTime >= startTime) {
    return (currentTime >= (startTime + period));
  } else {
    return (currentTime >= (4294967295 - startTime + period));
  }
}
void _menuUpEvents (byte menuIndex)
{
  (_MainMenus[menuIndex]).tempString = "";
  byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
  byte parIndex = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]);
  byte parentStartIndex;
  byte parentStopIndex;
  if (parIndex == 0) {
    parentStartIndex = (_MainMenus[menuIndex]).startIndex;
    parentStopIndex = (_MainMenus[menuIndex]).stopIndex;
  }
  else {
    parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]);
    parentStopIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 4]);
  }
  if (tempIndex == parentStartIndex) {
    if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) {
      (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStopIndex - 1];
      return;
    } else {
      return;
    }
  }
  (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex - 2];
  return;
}
void _menuDownEvents (byte menuIndex)
{
  (_MainMenus[menuIndex]).tempString = "";
  byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
  byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]);
  byte parentStartIndex;
  byte parentStopIndex;
  if (parIndex == 0) {
    parentStartIndex = (_MainMenus[menuIndex]).startIndex;
    parentStopIndex = (_MainMenus[menuIndex]).stopIndex;
  }
  else {
    parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]);
    parentStopIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[parIndex - 1]).startInArrayIndex) + 4]);
  }
  if (tempIndex == parentStopIndex) {
    if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) {
      (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStartIndex - 1];
      return;
    } else {
      return;
    }
  }
  (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex];
  return;
}
void _valueUpEvents (byte menuIndex)
{
  byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]);
  byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]);
  byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]);
  if (itemType == 3) {
    _menuValueArray_bool[valIndex - 1 ] = 1;
    return;
  }
  if (itemType == 4) {
    _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] + (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1]));
  }
  if (itemType == 5) {
    _menuValueArray_long[valIndex - 1] = _menuValueArray_long[valIndex - 1] + (pgm_read_dword(&_menuConstantValuesArray_long[indexStep - 1]));
  }
}
void _valueDownEvents (byte menuIndex)
{

  byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]);
  byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]);
  byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]);
  if (itemType == 3) {
    _menuValueArray_bool[valIndex - 1] = 0;
    return;
  }
  if (itemType == 4) {
    _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] - (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1]));
  }
  if (itemType == 5) {
    _menuValueArray_long[valIndex - 1] = _menuValueArray_long[valIndex - 1] - (pgm_read_dword(&_menuConstantValuesArray_long[indexStep - 1]));
  }
}
void _menuEnterTheMenuEvents (byte menuIndex)
{
  byte itemType =  pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  if (!(itemType == 0)) {
    return;
  }
  byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
  byte newIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[tempIndex - 1]).startInArrayIndex) + 3]);
  if (newIndex == 0) {
    return;
  }
  (_MainMenus[menuIndex]).tempString = "";
  (_MainMenus[menuIndex]).currentItem = _MenuItems[newIndex - 1];
  return;
}
void _menuExitFromMenuEvents (byte menuIndex)
{
  byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]);
  if (parIndex == 0) {
    return;
  }
  (_MainMenus[menuIndex]).tempString = "";
  (_MainMenus[menuIndex]).currentItem = _MenuItems[parIndex - 1];
  return;
}
String _menuOutputValueString (byte menuIndex)
{
  byte itemType = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  byte valueStrIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 11]);
  if (itemType == 0) {
    if ( valueStrIndex == 0) {
      return "";
    } else {
      return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[valueStrIndex - 1])));
    }
  }
  byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]);
  byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]);
  byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]);
  if ( valIndex == 0) {
    return "";
  }
  byte convFormat = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 9]);
  if (itemType == 3) {
    return _convertBoolean(itemType, convFormat, valIndex, indexMax, indexMin);
  }
  if (itemType == 4) {
    return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin);
  }
  if (itemType == 5) {
    return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin);
  }
  return "";
}
void _menuDirectInputKeyPressEvents(byte menuIndex, char inputSymbol)
{
  byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]);
  byte temp;
  if (valIndex == 0) {
    return;
  }
  byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]);
  if (itemType == 7) {
    return;
  }
  if (itemType == 3) {
    (_MainMenus[menuIndex]).tempString = "";
  }
  if (inputSymbol == '-') {
    temp = ((_MainMenus[menuIndex]).tempString).length() ;  if (temp == 0) {
      (_MainMenus[menuIndex]).tempString = "-";
    } else
    { if (((_MainMenus[menuIndex]).tempString).charAt(0)  == '-') {
        (_MainMenus[menuIndex]).tempString = ((_MainMenus[menuIndex]).tempString).substring(1);
      } else
      {
        (_MainMenus[menuIndex]).tempString = "-" + (_MainMenus[menuIndex]).tempString;
      }
    }
  } else {
    (_MainMenus[menuIndex]).tempString = (_MainMenus[menuIndex]).tempString + inputSymbol;
  }
  if (itemType == 3) {
    _menuValueArray_bool[valIndex - 1]  =  ((((_MainMenus[menuIndex]).tempString )).toInt());
  }
  if (itemType == 4) {
    _menuValueArray_int[valIndex - 1]  =  (((_MainMenus[menuIndex]).tempString )).toInt();
  }
  if (itemType == 5) {
    _menuValueArray_long[valIndex - 1]  =  (((_MainMenus[menuIndex]).tempString ).toInt());
  }
}
void _menuUpdateToEEpromItems()
{
  EEPROM.updateLong(2, (_menuValueArray_long[1]));
  EEPROM.updateInt(6, (_menuValueArray_int[0]));
  EEPROM.updateBit(1, 0, (_menuValueArray_bool[0]));
  EEPROM.updateInt(8, (_menuValueArray_int[1]));
  EEPROM.updateInt(10, (_menuValueArray_int[2]));
  EEPROM.updateInt(12, (_menuValueArray_int[3]));
}
String _readStringFromProgmem (char *string)
{
  String result = String("");
  while (pgm_read_byte(string) != '\0')
  {
    result = result + char(pgm_read_byte(string));
    string++;
  }
  return result;
}
String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
  if (itemType == 4) {
    if (convFormat == 4) {
      return String((_menuValueArray_int[valIndex - 1 ]), DEC);
    }
    if (convFormat == 5) {
      return String((_menuValueArray_int[valIndex - 1]), HEX);
    }
    if (convFormat == 6) {
      return String((_menuValueArray_int[valIndex - 1]), BIN);
    }
  }
  if (itemType == 5) {
    if (convFormat == 4) {
      return String((_menuValueArray_long[valIndex - 1 ]), DEC);
    }
    if (convFormat == 5) {
      return String((_menuValueArray_long[valIndex - 1]), HEX);
    }
    if (convFormat == 6) {
      return String((_menuValueArray_long[valIndex - 1]), BIN);
    }
  }
}
String _convertBoolean(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
  if (convFormat == 1) {
    if (_menuValueArray_bool[valIndex - 1]) {
      return "1";
    } else {
      return "0";
    }
  }
  if (convFormat == 2) {
    if (_menuValueArray_bool[valIndex - 1]) {
      return "True";
    } else {
      return "False";
    }
  }
  if (convFormat == 3) {
    if (_menuValueArray_bool[valIndex - 1 ]) {
      return "Да";
    } else {
      return "Нет";
    }
  }
  if (_menuValueArray_bool[valIndex - 1]) {
    return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMax - 1])));
  } else {
    return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMin - 1])));
  }
}
float _convertDS18x2xData(byte type_s, byte data[12])
{
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s)
  {
    raw = raw << 3;
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  }
  else
  {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;   else if (cfg == 0x20) raw = raw & ~3;  else if (cfg == 0x40) raw = raw & ~1;
  }
  return  (float)raw / 16.0;
}
float _readDS18_ow12(byte addr[8], byte type_s)
{ byte data[12];
  byte i;
  _ow12.reset();
  _ow12.select(addr);
  _ow12.write(0xBE);
  for ( i = 0; i < 9; i++) {
    data[i] = _ow12.read();
  }
  _ow12.reset();
  _ow12.select(addr);
  _ow12.write(0x44, 1);
  return _convertDS18x2xData(type_s, data);
}
bool _oneWireSeach (byte array[], OneWire ow )
{
  byte temp[8];
  byte i;
  if ( !ow.search(temp)) {
    return false;
  }
  if (OneWire::crc8(temp, 7) != temp[7]) {
    return false;
  }

  switch (temp[0]) {
    case 0x10:
      array[8] = 1;
      break;
    case 0x28:
      array[8] = 0;
      break;
    case 0x22:
      array[8] = 0;
      break;
    default:
      return false;
  }

  for ( i = 0; i < 8; i++) {
    array[i] = temp[i];
  }
  return true;
}


Исходники проектов

» Схема с LCD Keypad Shield и резистором
» Схема с LCD Keypad Shield и датчиком
» Схема с матричной клавиатурой и резистором
» Схема с матричной клавиатурой и датчиком

Ну, вот и всё, если что то не понятно, задавайте вопросы в комментариях — отвечу.
Автор: @totuin
FLProg
рейтинг 45,64
Простое программирование микроконтроллеров
Похожие публикации

Комментарии (46)

  • +1
    Да куда уж можно легче Arduino IDE
  • +1
    Вопрос относительный. Что проще -написать около тысячи строчек кода или нпкликать мышкой в графическом интерфейсе десяток блоков. Ну это кому что нравится
    • +2
      Тысячу строчек или десяток блоков? Скорее десяток блоков или десяток строк… Тысячу строк на блоках только мазохист будет делать. Или тру мамин Ардуинщик
      • +1
        А давайте заключим пари! В данном уроке в проекте присутствует 15 — 20 функциональных блоков. Если Вы напишете код в Arduino IDE в 20....., нет, дам Вам фору, в 50 строк, выполняющий тот же функционал что и описанный в уроке, я напишу пост с признанием что проект FLProg — бесполезен. Вы же великий «Гуру» в программировании. Ну а если не напишите и сольетесь — тогда понятно кто Вы. Очередной пустомеля который считает что насрав в комментариях становишся хоть чем — то.
        • +1

          Не то, чтобы я был потив визуального программирования вообще, но в данном конкретном посте Вы выходите за рамки своей кометенции. Не очень трудно написать такую программу 1 в 1 — один Ваш блок превращается в одну строку кода, вызывающую некую функцию из набора стандартных. И что дальше? Если Вам не жалко денег, давайте заключим пари, но это как раз будет тот случай, когда "Из двух спорящих один — дурак, а второй — подлец" и я заранее знаю свою роль в этом споре.

          • 0
            Во первых, уточните где я выхожу за рамки своей компетенции? Я написал данную программу (FLProg) которая создаёт рабочую прошивка контроллера в соответствии с тем что и хотел пользователь. Значит я достаточно компетентен что бы писать данный пост.
            Во вторых, с чего Вы решили что один блок превращается в одну строку текста? Программа анализирует весь проект и создаёт код на С который обеспечивает работу контроллера в соответствии со схемой проекта.
            Ну и напоследок, советую Вам что бы в будущем не оказывается идиотом, хотя бы прочитать пост к которому Вы пишете глубоко мысленные комментарии. И в идеале ещё заглянуть под споллеры. Там как раз показан код сформированный программой.
            Но конечно если Вы покажете код в 50 строк который выполняет тот же функционал который описан в посту, то тогда да, я признаю свою некомпетентность. Дерзайте!
            • 0

              Я напишу код в одну строку, который только подчеркнет Вашу некомпетентность в этом вопросе. Вы совершенно не понимаете, что такое программирование на обычном языке программирования и чем определяется сложность программ. Вот он этот код в одну строку.
              void main(void) { DoFunctionAnalogPosta(); };
              Реализация вызываемой функции может занять разное количество строк в зависимости от используемых языков программирования и библиотек, но в любом случае Ваше техническое задание выполнено и перевыполнено, гда могу получить свой выигрыш?
              Надеюсь, что Ваша некомпетентность в данном вопросе стала очевидна.
              Ну и напоследок, чтобы в будущем не оказываться идиотом, почитайте какие-нибудь книжки по теоретическому программированию, я рекомендую "Програмирование для математиков" с ВМК МГУ, хорошо прочищает мозги от всякого мусора.

              • 0
                То есть содержимое функций мы не учитываемых.? Функции, подключаемые библиотеки разве не входят в код программы? Они волшебным образом реализуются сами? Извините, но Вы не программист, Вы испорченный фрамеворками и готовыми библиотеками школьник. Вот когда научилась думать и программировать, тогда и поговорим.
                А насчёт пари. Я вставляют ваш код в одну строчку в Arduino Ide и почему то ничего не работает. Даже компилироваться не хочет. Странно — правда?
                • 0

                  То есть Вы можете отделить "встроенные" в язык функции от реализуемых? Для Вас есть принципиальная разница между использованием printf(...) и DoFunctoinAnalogPosta()?
                  Вы искренне полагаете, что функция Delay из пакета Ардуино есть часть языка С — как все запущено…
                  На секундочку, программа в среде Ардуино, использующая стандартный ввод-вывод (Вы можете не знать, что это такое, настоятельно рекомендую продолжать чтение книг) "компилироваться" не будет, если Вы не подключите соответствующую бибилиотеку stdio и то, что среда сделала это за Вас, не избавляет от необходимости знать столь очевидные вещи.
                  Ну и напоследок — разберитесь в терминологии, если собираетесь спорить с профессионалами в данной предметной области. Предложенная мной программ в 1 строку скомпилируется в любом компиляторе, поддерживающем стандарт языка С. Проблеммы возникнут при сборке исполняемого модуля, поскольку не будет обнаружена соответствующая точка входа ни в одном из компонуемых модулей. Малоквалифицированных пользователи, "испорченные библиотеками школьники", не в силах осознать столь тонкие различия, что и порождает многочисленные сообщения на форумах "у меня программа не компилируется, подскажите, где ошибка", но Вы то себя позиционируете, как человека, глубоко разбирающегося в теме и для такой ситуации подобное высказывание неприемлемо.


                  Когда прочитаете упомянутую книжку и еще 2-3 по теме, научитесь программировать (это в принципе не сложно и доступно многим) и думать (а вот тут посложнее, на это способны не все, но может, Вы окажетесь в числе счастливчиков), вот тогда и поговорим.


                  Если я дополнительно передам Вам "бинарную" реализацию упомянутой функции без исходников и все заработает, текст программы из одной строки волшебным образом изменится? Ну не спорьте о том, в чем не разбираетесь.

                  • 0
                    Я прекрасно различаю встроенные и реализуемые функции. А у вас по моему с эти проблема. Вы почему то решили что если вы написали вызов только что придуманной Вами функции, то она «волшебным» образом тут же и реализуется. Разве функция управления многоуровневая меню, с дополнительными возможностями управления тремя нагрузками уже входит встандартые функции языка? Я что то упустил? Или все таки её реализацию придётся писать ( не важно как функцию или библиотеку). Мне почему то кажется что придётся писать, даже используя Вашу «волшебную» строку. Учите матчасть Сэр.
                    • 0

                      Я в конце задал простой вопрос, на который Вы не ответили, я так думаю, из за того, что его не поняли (что неудивительно, учитывая Ваш общий уровень в этой теме). Повторю его в максимально доступной для Вас формулировке — если разработать скетч — библиотеку, которую Вы сможете включить в свой проект командой "Libraries" — "Include" и далее в теле Вашего скетча останется только моя однострочная программа, а текст реализации Вы никогда не увидите — будет ли задача решена.


                      Печально не то, что Вы демонстрируете отсутствие знаний в данной предметной области (это не Ваша вина, это Ваша беда), печально то, что Вы уверены в их наличии и более того, в их правильности. Учите теорию, сэр, упомянутая книга (и множество других) могла бы Вам помочь в этом непростом деле, но для этого ее нужно прочитать, считаю, что в Вашем случае смеси невежества и апломба подобное развитие ситуации крайне маловероятно, буду рад ошибиться.


                      Ну и напоследок, я не зря взял "встроенный" в кавычки. В языке С нет встроенных функций, от слова совсем, это так, для общего развития.

                      • 0
                        Повторю его в максимально доступной для Вас формулировке — если разработать скетч — библиотеку, которую Вы сможете включить в свой проект командой «Libraries» — «Include» и далее в теле Вашего скетча останется только моя однострочная программа, а текст реализации Вы никогда не увидите — будет ли задача решена.

                        Нет не будет. Интересно, кто напишет данную библиотеку? Господь. Или Вам все таки придётся её писать самому?
                        Если идти по вашей логике, то и в программе FLProg можно обойтись одним блоком. Кто — то (тот же кто и напишет библиотеку — всевышний) напишет пользовательский блок с данным функционалом, и пользователю останется только его вставить. Ну а самое интересное, если опять таки следовать Вашей логике, в FLProg можно создать законченную прошивку вообще без единого блока. Смешно, да? Для этого надо создать новый проект, в дереве проекта, в ветке Modbus выбрать пункт «Создать мост Modbus TCP -> Modbus RTU», настроить там же параметры TCP, и RTU и все. Ни одного блока в проекте не будет. Потом как обычно нажимаем кнопочку «Компилировать», заливаем контроллер, и получаем достаточно востребованное устройство преобразователя интерфейсов с заданными Вами настройками. Ну как слабо представить программу без единой строчки кода?
                        Так что давайте не будем привлекать высшие силы, и реально смотреть на вещи
                  • 0
                    Ну и повторится насчёт пари ( я все равно в поезде и делать мне нечего, так хоть Вас немного жизни поучить).Вы думаю согласны что для каждого языка существует своя среда разработки. Так вот берём программу FLProg ( среда для проектов FLProg), открываем проект из 20 блоков (ссылка дана в конце поста), нажимаем кнопочку «Компилировать», выбираем ком-порт к которому подключение ардуинка, и о чудо, все работает так км и было заявленной (если конечно схема обвязки ардуинки собранна правильно). Теперь Ваш вариант. Берём любую среду по вашему выбору, вводом туда вашу «волшебную» строку, нажимаем кнопку «Компилировать» и… ловим ошибку. Все на этом заканчивается. Так как насчёт пари?
                    • 0

                      Так насчет поучить жизни — Вы по прежнему уверены, что в языке С есть встроенные функции — это для начала, или до Вас начало доходить?


                      Я НЕ согласен, что для каждого языка существует среда разработки, о великий учитель жизни, для языка есть компиляторы, как часть системы разработки, котрая привязана к используемой операционной системе, и это компиляторы должны соответствовать стандарту на язык, но могут его расширять, хотя это и не приветствуется, но иногда необходимо.
                      А далее совершенно отдельно от них существуют "среды разработки", которые данными системами пользуются, в случае Ардуино это: оболочка Ардуино + их собственный препроцессор + GCC "компилятор" (почему тут поставлены кавычки, Вы можете не догадываться), который существует совершенно отдельно от данной оболочки + библиотеки, входящие в комплект поставки + правила сборки в виде make файлов + вспомогательные файлы и то, что Вы не знаете о существовании данных компонентов, поскольку не можете их увидеть, не делает их несуществующими.
                      Так вот, для тех кто в танке, если мы возьмем обычную Ардуино среду (о существовании других Вы можете не догадываться) и дополним ее путем простых манипуляций указанной мной библиотекой, то программа в одну строчку "скомпилируется", "зашьется" и выполнится. Если Вам не понятен этот, довольно таки очевидный факт, то дело хуже, чем я думал.
                      А в поезде Вы могли бы провести время более продуктивным образом, нежели писать комментарии, обличающие Ваше невежество в данной предметной области, например, занятся самообразованием, скачав вышеупомянутую книгу, гда в первых двух главах просто и понятно объясняются вопросы, которые приводят Вас в явное замешательство.


                      А насчет пари — я рассказал, как именно все будет сделано, если Вы так и не поняли, жду Вашу ставку. Она должна составлять не менее 3 тысяч долларов США, поскольку мне придется потратить определенное время на разработку данной библиотеки, да и обучение ( конечно, не жизни, а всего лишь программированию) тоже стоит денег.

                      • 0
                        Я НЕ согласен, что для каждого языка существует среда разработки, о великий учитель жизни, для языка есть компиляторы, как часть системы разработки, котрая привязана к используемой операционной системе, и это компиляторы должны соответствовать стандарту на язык, но могут его расширять, хотя это и не приветствуется, но иногда необходимо.

                        То есть Вы предлагаете например в Borland Delphi писать на языке С, а в Arduino IDE писать на PHP или Perl. Боюсь не получится. Хотя можете попробовать.

                        А насчет пари — я рассказал, как именно все будет сделано, если Вы так и не поняли, жду Вашу ставку. Она должна составлять не менее 3 тысяч долларов США, поскольку мне придется потратить определенное время на разработку данной библиотеки, да и обучение ( конечно, не жизни, а всего лишь программированию) тоже стоит денег.

                        Вот к этому я Вас и вёл! То есть Вы признаёте что для решения описанной в посту задачи недостаточно Вашей «волшебной» строчки, а надо ещё написать какоето, достаточно большое количество кода (ну раз Вы хотите 3 штуки баков за это).
                        Теперь рассмотрим условия пари. Вы заявляли что пользователь сможет в 50 строк (Вы даже взяли расширенные обязательства что это одна строка) повторить функционал писанный в посту. А что получается в Вашем варианте. Кроме написания этой «волшебной» строчки пользователь должен либо написать ещё кучу строк для её реализации, либо обратиться к Вам и Вы за 3 штуки бакинских сделаете это за него. Теперь рассмотрим мой вариант. Пользователь может скачать программу FLProg (совершенно бесплатно — заметьте, даже регистрация не требуется), и повторить проект использовав те же 20 блоков, и получить готовое устройство. Не написав кстати ни строчки кода, обращаясь ни к кому за помощью, и не заплатив никому ни копейки.
                        Как Вы думаете, кто пари выиграл?
                        • 0

                          " Если Вы напишете код в Arduino IDE в 20....., нет, дам Вам фору, в 50 строк, выполняющий тот же функционал что и описанный в уроке"
                          и больше ничего в Вашем предложении не было.
                          Я Вам показал, как это может быть написано в Ардуино IDE в одну строку. Да одной строки недостаточно для "решения описанной в посту задачи", но такое предложение Вами не озвучивалось. Так что поосторожнее в высказываниях, особенно относительно области, в который Вы откровенно плаваете.
                          Если Вы продолжаете настаивать на первоначальной формулировке задания, я готов принять данное пари.

                          • 0
                            Если Вы напишете код в Arduino IDE в 20....., нет, дам Вам фору, в 50 строк, выполняющий тот же функционал что и описанный в уроке,

                            Извините а это что? Вообще то это написано сразу. Четвёртое сообщение сверху. Внимательнее надо быть. И я изначально настаивал только на этой формулировке.
                            Насчет того что я плаваю… Вообще то я написал программу, которая генерит код на С. Причём генерит динамически в зависимости от схемы составленной пользователем. Кроме того сама программа написана на языке SmallTalk. Данной программой пользуются минимум десять тысяч человек (судя по количеству скачиваний каждой версии) и судя по отзывам она им нравится. Так что я «не плаваю» как минимум в двух языках обычного программирования. Кроме того программа составляет схему на двух промышленных языках -FBD и LAD признанных стандартами в системах автоматизированного управления. Что бы написать редактор данных языков, я как минимум не должен «плавать» и в них. Слава богу помогает 15-ти летний стаж работы в этой области. Я думаю это может служить обоснованием моей компетенции (да почти резюме на работу получилось)))) ).
                            А чем Вы можете обосновать своё заявления о моей некомпетентности кроме бессвязных фраз о готовых библиотеках, которые ещё надо написать.
                          • 0
                            Я Вам показал, как это может быть написано в Ардуино IDE в одну строку.

                            Решение которое не работает. А для того что бы оно заработало, необходимо ещё написать библиотеку, на кучу строк (ну уж точно в 50 не уложишся).

                            А хотя не я не прав. Есть «еврейское» решение. И тогда да, вы сможете уложится в одну строку. Если убрать все переводы строк в коде и написать всё в одну длинную (очень длинную ) строку. Вот тут я прокололся однако.
                            • 0

                              Еще раз, для того, чтобы стало понятно даже Вам.
                              Вы написали программу, которая транслирует графическое описание в вызов некоторых заранее реализованных функций на языке С.
                              Далее Вы гордо постулировали невозможность написать программу, которая напрямую вызовет те же самые, или другие функции из заранее реализованной библиотеки на языке С.
                              Когда Вам указали на такую возможность написать программу на языке С в Ардуино среде, Вы начали заявлять, что Вас неправильно поняли, и закончился все детским лепетом об однострочниках, хотя такую реализацию никто и не предлагал.
                              Если Вы до сих пор так и не поняли, что подобная библиотека может быть реализована предварительно и интерфейс к ней может быть весьма прост, что позволит обойтись небольшим количеством строк вызовов функций в исходном коде на языке С, в предельном случае одна строка, то, видимо, Вы не поймете этого никогда.
                              Первоначальный вопрос стоял "Скорее десяток блоков или десяток строк…", Вы начали утверждать преимущества визуального программирования, причем совершенно безосновательно, чем и загнали себя в неудобное положение, как из которого выбираться, не представляете, вот и идут в ход однострочники и "еврейские" решения.
                              Остается только пожалеть десять тысяч человек, которые пользуются программой, написаной человеком с такими представлениями о программировании и которым она, судя по отзывам, нравится.
                              Что же касается существа дела, то еще в 80х годах прошлого века была написана программа, называемая СИТРАН, которая по описанию языка в ФБН проектировала транслятор, данная программа входила в стандартную поставку РАФОС и сполне спокойно реализовывала задачи, судя по Вашем высказываниям, неслыханной трудности.

                              • 0
                                Вы написали программу, которая транслирует графическое описание в вызов некоторых заранее реализованных функций на языке С.

                                Вы даже не посмотрели код получаемый на выходе программы (он есть в посте под споллерами), а уже судите о принципе её работы. С чего Вы взяли что используется вызов заранее написанных функций и всё. Какие — то действительно вызывают функции которые опять таки генерятся в зависимости от проекта, какие то полностью реализуются в секции loop. В общем всё не так просто.
                                Когда Вам указали на такую возможность написать программу на языке С в Ардуино среде

                                Так и моя программа генерит код в ардуино среду, Не надо мне указывать она возможность написания такой программы, я сам это делаю. Я же был против заявления что данный код можно уложить в 50 строк. И тут начался детский лепет про одну строчку, которая волшебным образом реализует необходимый функционал. Как будто эту реализацию писать не надо!
                                Если Вы до сих пор так и не поняли, что подобная библиотека может быть реализована предварительно и интерфейс к ней может быть весьма прост, что позволит обойтись небольшим количеством строк вызовов функций в исходном коде на языке С

                                Библиотека может быть реализована на что угодно, но на текущий момент такой нет. Значит тому кто решит написать то же меню, сейчас придется писать эту библиотеку.
                                В посту описывается возможность этого не делать. При этом дается возможность достаточно легко в случае необходимости изменить меню в несколько кликов мышкой. Вот в этом и прелесть визуального проектирования. Что проще — в три клика перенести пункт меню из одной ветки в другую, или перелопатить кучу кода, пару десятков раз ошибившись в скобочках и запятых для того достижения того же результата.
                                Первоначальный вопрос стоял «Скорее десяток блоков или десяток строк…», Вы начали утверждать преимущества визуального программирования, причем совершенно безосновательно,

                                Как мы уже поняли, на текущий момент такой библиотеки нет, поэтому вопрос все таки стоит так, что быстрее, пару десятков блоков или сотни или даже тысячи строк. Ну а насчет преимущества визуального программирования — как Вы думаете почему ВСЕ производители промышленного оборудования остановили свой выбор на нём. Уж они то умеют считать деньги, и выгоду от применения того или иного подхода.
                                Остается только пожалеть десять тысяч человек, которые пользуются программой, написаной человеком с такими представлениями о программировании и которым она, судя по отзывам, нравится.

                                Ну пока не жалуются, а даже хвалят. С чего бы это, странно даже. Для интереса, зайдите в гостевую книгу и почитайте. Неужто столько дураков, которые считают программу написанную недопрограммистом хорошей. Хотя в чём то Вы правы, я не профессиональный программист, а любитель — самоучка.
                                • 0

                                  Что Вы не профессиональный пограмист, я понял быстро из нашего диалога. Но это ни в коей мере не утверждение, что любитель-самоучка не может написать достойного программного продукта — вполне может, и я не исключаю возможность того, что Вы именно это и сделали — я не профессионал в области ПА и не могу оценивать его качество.


                                  В комментарии, который вызвал столь оживленный обмен мнениями, утверждалось, что программный интерфейс к управляющей библиотеке может быть ничуть не менее удобен, чем графический способ представления информационных взаимосвязей в проекте. Разумеется, существование такой бибилиотеки подразумевается априори и я даже на секунду не способен вообразить, будто бы комментирующий имел в виду развернутые функции со всеми исходниками, а не вызов функциональных блоков из библиотеки. Похоже, что Вы его не поняли, и я попытался внести ясность в данный вопрос, возможно, не самым лучшим образом.


                                  Что же касается наиболее удобного способа представления и Вашей ссылки на производителей промышленного оборудования, то даже в этой области визуальное программирование не является единственно возможным и я своими глазами видел отдельные модули ПА на чистом С, но там очень сильны привычки, которые пошли еще от схем релейной автоматики и производители должны поддерживать сложившиеся стандарты, если не хотят потерять часть рынка.


                                  В проектировании схем бывает удобно визуальное представление, но иногда описание на VHDL понятнее, а иногда и не имеет разумного визуального представления — следует ли из этого что все, кроме VHDL следует запретить — конечно же, нет.


                                  В программировании, как таковом, визуальный стиль не прижился, несмотря на многочисленные попытки его внедрить. Для этого есть множество оснований и не последним являестя то обстоятельство, что сложность среднего программного продукта многократно превышает сложность топовых систем ПА, не в обиду будь сказано. Поэтому попытка визуализации подобной системы превышает возможности мозга по обработке графической информации. Таково мое скромное мнение, хотя возможно и другие объяснения данного феномена.

                                  • 0
                                    Да, спор у нас вышел очень подобный холивару по поводу винды и линукса. Да и причина похожая — что удобнее, графические окошки винды где большинство задач решается кликами мышки, или терминал линукса, где можно сделать что угодно, но для этого необходимо написать огромные листинги комманд, при этом эти команды надо знать, и следить за синтаксисом. И у того и у другого метода есть поклонники и противники.
                                    Как говорится на цвет и вкус все фломастеры разные.
                                    Кроме того всё таки программа FLProg разрабатывалась для не программистов (это основной девиз проекта, он даже вынесен на главную страницу сайта), а для электриков, электроншиков, и просто радиолюбителей. Для них представление прошивки контроллера в виде принципиальной схемы более привычнее и понятнее. Поэтому в их среде эта программа и пользуется популярностью. Тем неожиданнее для меня был приход в проект пользователей которые очень хорошо разбираются в языке С. Как ни странно им показалось проще отдельный функционал которого пока нет в программе реализовывать на С в виде пользовательских блоков (есть в программе такая возможность) а проект целиком собирать на FBD или LAD. Ребята оказались очень отзывчивые и делают такие блоки по просьбе других пользователей которые не разбираются в С.
                                    Ну и конечно программа разрабатывалась в основном для создания систем автоматизации, в которых всё таки языки FBD и LAD занимают лидирующее положение. Просто с помощью FLProg данные языки перенесены с дорогих промышленных контроллеров на недорогие ардуинки. Хотя если посмотреть что собирают ребята с форума, то видно что они уже далеко ушли из вопросов обычной автоматизации.
              • 0
                Разве вам не потребуется еще одна строчка для #include?..
          • +1
            Хочу увидеть. Автор согласен.
  • +1

    Уж сколько раз твердили миру, что визуальные построители меню не нужны.
    И все пишуть и пишуть, и пишуть и пишуть.

    • 0
      Почему не нужны?
      • 0
        Да их было уже миллион. И почти все — неудачные.
        Пожалуй единственное, что более-менее нормально выглядит — софта к Lego Mindstorms, но оно на весьма специфическую аудиторию.

        Проблема всех этих построителей — облегчение разработки весьма относительное, а усложнение отладки, настройки и поддержки — весьма значительное. Попробуйте сравнить 2 версии прошивки, ну (пусть по 2000 строк в каждой, из них 5 с отличиями) и визуальные представления их же из 40 блоков.

        Попробуйте добавить отладочный вывод чего-нибудь куда-нибудь, а потом, через неделю, убрать оный.

        Пока никто не придумал, как с этим бороться, все впустую.
        • 0
          Сразу видно профессионального программиста, скорее всего даже очень хорошего. Проблема одна, узость кругозора. Вы не поверите я видал проекты на сотни и даже тысячи блоков. С подобными проектами я работаю каждый день на работе. И называется это — промышленное программирование. Конкретно я работаю инженером Асу. И работаю я с газовой турбиной от Сименса. В проекте автоматизации этой турбины блоков значительно более тысячи. И ничего- живём как то. Кстати там нет ни строчки кода, одни кубики.
          • 0
            У вас там в сименсе логи есть?
            А в FLProg они есть?
            • 0
              Вы точно ничего не понимаете в промышленном программировании. Логи ведутся на системе верхнего уровня. Любые данные с контроллера можно отправить туда (то есть на скаду). FLProg так же поддерживает протокол Modbas tcp иModbus rtu так что можно передавать данные с контроллера на любую скада систему и вести там необходимые логи
              • 0
                Не понимаю и не претендую.
                В реальной жизни — человек купил дуину и запрогал ее FLProg ом. Как отладить? где логи? какой modbus? какая скада дома? где это все? если есть скада, неужели надо дрючиться с ардуиной?

                Хотите идею? Возьмите Raspberry Pi или что-то похожее, перенесите туда это все, сделайте логи в облаке и дистанционное управление. И продавайте в виде загрузочной SD карты, куда надо только прописать пароль от домашней вай-фай сети
                • 0
                  В реальной жизни — купил человек ардуинку, запрограммировал её в Arduio IDE. Как отдалить, где логи? Расскажите как это делается, честно интересно. Может и в своей программе что то такое сделаю.
                  • 0
                    А я не знаю. Я с ардуинами не работаю. Те микроконтроллеры, которые мне интересны, позволяют и отладку, и логгирование.
                    • 0
                      Тогда почему Вы критикуете программу которая работает в области в которой Вы не разбираетесь. Лишь бы что то написать? Или просто набираете голоса за комментарии. Ну так и писали бы нейтральные комментарии. А то смешно получается. Я в этом ничерта не смыслю, но надо поругать, глядиш за умного сойду)))
                      • 0
                        Мои комментарии как раз довольно нейтральные, а вот кому-то стоило бы поостыть, да и грамматику подправить.
                        И да, я не работаю с ардуинами (какой кошмар, на костер меня срочно), тем не менее ковыряюсь в микроконтроллерах и в ПО в целом. Разных визуальных билдеров я повидал тоже немало (десятка два-три наверное, а то и больше), потому мнение имею. Это ужасно, да?
                        • 0
                          Ну насчёт грамматики, извините. Просто пишу с телефона, находясь в поезде.
                          А насчёт Вашего комментария. Вы критикует программу даже не попытавшись на неё посмотреть. Вы критикует её за отсутствие логов и внутрисхемной отладки. Так этого нет у самой ардуинки. И никакая программа не сможет этого исправить. Поэтому я и рекомендовал прежде чем что то писать в комментариях, хоть немного посмотреть на пост, и подумать, актуалени Ваш комментарий или нелеп.
                          Ну насчёт визуальных сред -вообще то вся промышленность запрограммирован на на них. Все промышленные контроллеры програмируются только в таких средах. Я просто перенес этот способ программирования на ардуинку
                          • 0
                            Для того, чтобы «посмотреть программу» мне надо добыть ардуину, потом поставить программу, и это только для того чтобы полюбоваться на скрины, щедро рассыпаные по статье. Приступ зубной боли от неприятных ассоциаций прилагается. Нет, спасибо. Скриншотов достаточно.

                            FYI:
                            • 0
                              Ну во Вы и опять опозорились. Я же писал Вам что не следует комментировать если Вы абсолютно не в теме. Очень смешно выглядит. Во первых для ознакомления с программой достаточно просмотреть предыдущие посты в блоге компании. Во вторых Ваши ссылки… Первая -это контроллеры Atmel. В ардуинках стоят совсем другие. Если критикует программу для работы с ардуино — это было бы неплохо знать. Если не знаете — лучше молчите, не смешите народ. Вторая — логгирование на SD карту. Это в FLProg реализованно уже давно. Рекомендации те же. Как то так.
                              • 0
                                > Первая -это контроллеры Atmel. В ардуинках стоят совсем другие.
                                :))
                • +1
                  пишу на ФЛПрог. Отлаживаю с помощью каскады на андроиде, выводя значения переменных из интересующих точек проекта. Это телефон с софтом и блютуз модуль. И не поверите, получается. Получается прямо на работающем контроллере выявлять ошибки. Надо просто голову включать. За год пользования ФЛПрогом, сделал почти десяток готовых проектов и в последствии продал готовые устройства. И, за год работы форума, еще у более двух тысяч, зарегистрированных на форуме, пользователей тоже получается и довольно неплохо. А сколько еще не зарегистрированных пользователей… Мало того, с помощью ФЛПрог осваиваю и код на С, когда надо использовать железо, не поддерживаемое программой. Но все равно блоками программу писать намного быстрее.
                  А в Ардуино ИДЕ тоже нет никакого отладочного модуля. Это минус. Но что теперь ничего не делать?
                  Зачем писать о том, чем не пользуетесь и не представляете о чем речь???
                  • 0
                    Расскажите, пожалуйста, поподробнее о ваших проектах и девайсах, которые вы делаете, интересно!
    • 0
      а вы все читаете, и читаете, и читаете… Не умничайте. Не все шарят код писать и не всем надо по жизни в нем разбираться. ФЛПрог промежуточный вариант и найдет свою нишу на рынке. Никто вам ничего не навязывает.
    • 0
      Да я верю в то что каждое утро Вы подходте к открытому окну, и кричите в него всему миру -«Мир, тебе не нужны визуальные по строители меню». А этот непослушный мир не слышит Вас. И люди в нем все пишут и пишут. И всем почему то плевать на ваши Великие высказывания. Обидно наверное?
  • 0
    Elmot, Напрасно вы так.
    Допустим, мне как инженеру-АСУТПшнику гораздо ближе идеология именно визуального программирования как кода, так и HMI; тратить дополнительное время на написание кода в Arduino IDE для того, реализовать желаемый функционал, откровенно лень (хочется ж как можно скорее сделать :) ).
  • 0
    Teensy поддерживается, включая загрузчик? Библиотеки, идущие в комплекте с Teensy, поддерживаются? Нативные режимы HID и MIDI у Teensy поддерживаются?
    • 0
      Нет. Не поддерживается. К сожалению у меня просто не хватает времени на расширение списка поддерживаемых плат. Так что пока программа пока работает только с классическими ардуинками. Хотя ребята на форуме и писали как заливать проекты на тиньки. Возможно, если Вы задатите там вопрос, Вам помогут.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое