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

#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) != '\0')
  {
    result = result + char(pgm_read_byte(string));
    string++;
  }
  return result;
}
String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
  if (itemType == 4) {
    if (convFormat == 4) {
      return String((_menuValueArray_int[valIndex - 1 ]), DEC);
    }
    if (convFormat == 5) {
      return String((_menuValueArray_int[valIndex - 1]), HEX);
    }
    if (convFormat == 6) {
      return String((_menuValueArray_int[valIndex - 1]), BIN);
    }
  }
  if (itemType == 5) {
    if (convFormat == 4) {
      return String((_menuValueArray_long[valIndex - 1 ]), DEC);
    }
    if (convFormat == 5) {
      return String((_menuValueArray_long[valIndex - 1]), HEX);
    }
    if (convFormat == 6) {
      return String((_menuValueArray_long[valIndex - 1]), BIN);
    }
  }
}
String _convertBoolean(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
  if (convFormat == 1) {
    if (_menuValueArray_bool[valIndex - 1]) {
      return "1";
    } else {
      return "0";
    }
  }
  if (convFormat == 2) {
    if (_menuValueArray_bool[valIndex - 1]) {
      return "True";
    } else {
      return "False";
    }
  }
  if (convFormat == 3) {
    if (_menuValueArray_bool[valIndex - 1 ]) {
      return "Да";
    } else {
      return "Нет";
    }
  }
  if (_menuValueArray_bool[valIndex - 1]) {
    return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMax - 1])));
  } else {
    return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMin - 1])));
  }
}
float _convertDS18x2xData(byte type_s, byte data[12])
{
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s)
  {
    raw = raw << 3;
    if (data[7] == 0x10) {
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  }
  else
  {
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7;   else if (cfg == 0x20) raw = raw & ~3;  else if (cfg == 0x40) raw = raw & ~1;
  }
  return  (float)raw / 16.0;
}
float _readDS18_ow12(byte addr[8], byte type_s)
{ byte data[12];
  byte i;
  _ow12.reset();
  _ow12.select(addr);
  _ow12.write(0xBE);
  for ( i = 0; i < 9; i++) {
    data[i] = _ow12.read();
  }
  _ow12.reset();
  _ow12.select(addr);
  _ow12.write(0x44, 1);
  return _convertDS18x2xData(type_s, data);
}
bool _oneWireSeach (byte array[], OneWire ow )
{
  byte temp[8];
  byte i;
  if ( !ow.search(temp)) {
    return false;
  }
  if (OneWire::crc8(temp, 7) != temp[7]) {
    return false;
  }

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

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

© Geektimes