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

Создание меню с помощью программы FLProg
Добрый день.
В программе 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  #include  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) != '')   {     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  #include  #include  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) != '')   {     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  #include  #include  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) != '')   {     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  #include  #include  #include   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) != '')   {     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 и датчиком

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

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

Ну, вот и всё, если что то не понятно, задавайте вопросы в комментариях — отвечу.

.


Источник

arduino, diy или сделай сам, fbd, flprog, программирование микроконтроллеров

Читайте также