📜 ⬆️ ⬇️

Creating a menu using FLProg


Good day. In the FLProg program since version 2.1. there were blocks of the menu constructor. In this lesson, you will create a menu using these blocks.

In order to be more interesting, consider the real problem. Assemble the temperature control unit, which will include a temperature sensor, heater and fan. In addition, the inclusion of a fan or heater will be accompanied by a beep. Using the menu, we will configure the thresholds for switching on and off devices and the need for a sound signal. To simplify debugging, the temperature sensor will first be simulated using a variable resistor.

The first version of the device will consist of:

Arduino Uno:
image

LCD Keypad Shield:
image

Two relay units:
')

And active buzzer:


Here is a schematic diagram of the device



To start the whole project.
image

Consider each board separately.



Everything is simple here, we get the value from the analog input and scale it to the required range. The temperature value will change from -20 to 80. Scale block settings.





This board analyzes the signal of the LCD Keypad Shield buttons and generates the corresponding signals. The analysis is performed using a custom 5Bin1 block. The creation of this block is discussed in this lesson , you can also download this block.

Since the buttons on the shield are not enough, we will expand the capabilities of the “Select” button.



This scheme works as follows. With a short press of a button, a “Enter into menu” impulse is formed; with a long duration (longer than the TON timer setting), an “Exit from menu” impulse is formed.



On this board, a menu activation signal is generated. The TON timer is required to protect against the accidental generation of this signal when the controller starts. Well, the board itself with the main menu block.



In the description of the menu block (tab “Information” of the editor of the block) I tried to describe the work of the block as fully as possible. Consider the block tincture in this particular case.

Tab - "Menu Tree":


The menu tree consists of two menu groups for setting the heater on and off temperature and ventilation temperatures, as well as a single item to control the sound activity. In general, this block allows you to build menus of any complexity and nesting. The main thing that would be enough memory controller.

Setting the group menu item.


Settings for temperature settings.


I will clarify a little about the starting value in the EEPROM. This value will be written to the EEPROM at the beginning of the first cycle after the program is loaded into the controller. This will happen only once after each new program download to the controller. The remaining menu items related to temperature are similar to this.

Sound control menu item settings:


The texts for True and False will be output to ValStr with the corresponding values ​​of the menu items.

Bookmark - "Menu Management":


Here everything seems to be intuitive.

Bookmark - "Value Management"



In the selected change mode, by briefly pressing the value change button, it changes by the value of the specified step. If you hold this button for more than 2 seconds, the value will change by the value of the specified step every half second. If you continue to hold the button for another 2 seconds, the period of change of the value will decrease to 200 ms.

Exit Bookmark


The output "Active main menu" is necessary for forming the "Activating menu" signal. The next two boards are almost the same, and do not need special explanations.



I will only pay attention to the inputs of CanValUp at MenuValue blocks. With a high level on this input, the value at output Q corresponds to the value of the selected menu item. On the falling edge of this input, the value at the output “freezes” until a high level appears on this input. This is necessary so that the value does not change until the end of its editing (closing the menu).

The remaining boards are just as simple and need no explanation.



The result of compiling the project
#include <LiquidCrystal.h> #include <EEPROMex.h> LiquidCrystal _lcd1(8, 9, 4, 5, 6, 7); int _dispTempLength1 = 0; boolean _isNeedClearDisp1; struct UB_142171746 { bool ubo_101667604 = 0; bool ubo_51674151 = 0; bool ubo_137412502 = 0; bool ubo_174461762 = 0; bool ubo_157422683 = 0; int _gtv1 = 0; int _gtv2 = 0; int _gtv3 = 0; int _gtv4 = 0; int _gtv5 = 0; bool _bounse1S = 0; bool _bounse1O = 0; unsigned long _bounse1P = 0UL; bool _bounse2S = 0; bool _bounse2O = 0; unsigned long _bounse2P = 0UL; bool _bounse3S = 0; bool _bounse3O = 0; unsigned long _bounse3P = 0UL; bool _bounse4S = 0; bool _bounse4O = 0; unsigned long _bounse4P = 0UL; bool _bounse5S = 0; bool _bounse5O = 0; unsigned long _bounse5P = 0UL; }; UB_142171746 UB_142171746_Instance1; int UB_142171746_ubi_125089190 = 0; const byte _menuParametrsArray[] PROGMEM = {1, 0, 0, 4, 5, 0, 0, 0, 0, 0, 6, 9, 0, 2, 0, 0, 6, 7, 0, 0, 0, 0, 0, 7, 9, 0, 3, 3, 1, 0, 0, 0, 10, 11, 1, 8, 3, 0, 0, 4, 4, 4, 0, 0, 1, 0, 0, 1, 4, 5, 0, 8, 5, 4, 3, 0, 0, 1, 0, 0, 1, 4, 4, 0, 8, 6, 4, 2, 0, 0, 2, 0, 0, 1, 4, 2, 0, 8, 7, 4, 1, 0, 0, 2, 0, 0, 1, 4, 1, 0, 8}; bool _menuValueArray_bool[1]; const bool _menuConstantValuesArray_bool[] PROGMEM = {1}; int _menuValueArray_int[4]; const int _menuConstantValuesArray_int[] PROGMEM = {1}; const char _flprogMenuNameString1[] PROGMEM = "Vent-Off"; const char _flprogMenuNameString2[] PROGMEM = "Vent-On"; const char _flprogMenuNameString3[] PROGMEM = "Sound"; const char _flprogMenuNameString4[] PROGMEM = "Heater-Off"; const char _flprogMenuNameString5[] PROGMEM = "Heater-On"; const char _flprogMenuNameString6[] PROGMEM = "HeaterSetting"; const char _flprogMenuNameString7[] PROGMEM = "Vent Setting"; const char _flprogMenuNameString8[] PROGMEM = "C"; const char _flprogMenuNameString9[] PROGMEM = "Enter to submenu"; const char _flprogMenuNameString10[] PROGMEM = "On"; const char _flprogMenuNameString11[] PROGMEM = "Off"; const char* const _flprogMenuStringsArray[] PROGMEM = { _flprogMenuNameString1, _flprogMenuNameString2, _flprogMenuNameString3, _flprogMenuNameString4, _flprogMenuNameString5, _flprogMenuNameString6, _flprogMenuNameString7, _flprogMenuNameString8, _flprogMenuNameString9, _flprogMenuNameString10, _flprogMenuNameString11}; struct _menuItemStricture { int startInArrayIndex; }; struct _menuMainStricture { byte startIndex; byte stopIndex; bool isSwitchMenuAroundRing; _menuItemStricture currentItem; }; _menuItemStricture _MenuItems[7]; _menuMainStricture _MainMenus[1]; bool _gtv1; bool _gtv2; bool _gtv3; bool _gtv4; bool _gtv5; bool _gtv6; bool _gtv7; bool _gtv8; bool _gtv9; bool _gtv10 = 0; float _gtv11; bool _gtv12 = 0; String _swi2; String _swi1; bool _trgrt1 = 0; bool _trgrt1I = 0; int _disp1oldLength = 0; bool _trgrt2 = 0; bool _trgrt2I = 0; int _disp3oldLength = 0; int Menu_Value_4_TVD = 0; bool _trgrt3 = 0; bool _trgrt3I = 0; int Menu_Value_2_TVD = 0; int _disp4oldLength = 0; bool _trgr4 = 0; bool _trgr2 = 0; bool _trgr1 = 0; bool _trgr3 = 0; String _MenuBlock_47814740_ASO_1; String _MenuBlock_47814740_MNO; String _MenuBlock_47814740_VNO; bool _MenuBlock_47814740_OEIS = 0; bool _MenuBlock_47814740_OMUIS = 0; bool _MenuBlock_47814740_OMDIS = 0; bool _MenuBlock_47814740_OEMIS = 0; bool _MenuBlock_47814740_OExFMIS = 0; bool _MenuBlock_47814740_OVUIS = 0; bool _MenuBlock_47814740_OVDIS = 0; unsigned long _MenuBlock_47814740_VUDST = 0UL; unsigned long _MenuBlock_47814740_VUDSPT = 0UL; byte _MenuBlock_47814740_VUDSM = 0; int _MenuBlock_47814740_VUDPT = 0; bool _MenuBlock_47814740_AMMO = 0; bool _tim2I = 0; bool _tim2O = 0; unsigned long _tim2P = 0UL; bool _tim3I = 0; bool _tim3O = 0; unsigned long _tim3P = 0UL; bool _tim1I = 0; bool _tim1O = 0; unsigned long _tim1P = 0UL; int _disp2oldLength = 0; int Menu_Value_3_TVD = 0; int Menu_Value_1_TVD = 0; void setup() { if ((EEPROM.read(0)) != 98) { EEPROM.write(0, 98) ; EEPROM.updateInt(4, 40); EEPROM.updateInt(2, 30); EEPROM.updateBit(1, 0, 0); EEPROM.updateInt(6, 25); EEPROM.updateInt(8, 10); } pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(11, OUTPUT); _lcd1.begin(16, 2); _MenuItems[0].startInArrayIndex = 0; _MenuItems[1].startInArrayIndex = 13; _MenuItems[2].startInArrayIndex = 26; _MenuItems[3].startInArrayIndex = 39; _MenuItems[4].startInArrayIndex = 52; _MenuItems[5].startInArrayIndex = 65; _MenuItems[6].startInArrayIndex = 78; _MainMenus[0].startIndex = 1; _MainMenus[0].isSwitchMenuAroundRing = 1; _MainMenus[0].stopIndex = 3; _MainMenus[0].currentItem = _MenuItems[0]; _menuValueArray_int[0] = (EEPROM.readInt(2)); _menuValueArray_int[1] = (EEPROM.readInt(4)); _menuValueArray_bool[0] = (EEPROM.readBit(1, 0)); _menuValueArray_int[2] = (EEPROM.readInt(6)); _menuValueArray_int[3] = (EEPROM.readInt(8)); } void loop() { bool _tempVariable_bool; byte _tempVariable_byte; if (_isNeedClearDisp1) { _lcd1.clear(); _isNeedClearDisp1 = 0; } _gtv11 = (map(( (analogRead (1))), (0), (1023), (-20), (80))); UB_142171746_ubi_125089190 = (analogRead (0)); UB_142171746_Instance1 = _func_UB_142171746(UB_142171746_Instance1, UB_142171746_ubi_125089190, 96, 250, 402, 635); _gtv3 = UB_142171746_Instance1.ubo_101667604; _gtv4 = UB_142171746_Instance1.ubo_51674151; _gtv5 = UB_142171746_Instance1.ubo_137412502; _gtv2 = UB_142171746_Instance1.ubo_174461762; _gtv1 = UB_142171746_Instance1.ubo_157422683; if (_gtv1) { if (_tim1I) { if (_isTimer(_tim1P, 2000)) { _tim1O = 1; } } else { _tim1I = 1; _tim1P = millis(); } } else { _tim1O = 0; _tim1I = 0; } if (_tim2O) _trgr2 = 0; if (_tim1O) _trgr2 = 1; if (_trgr2) { if (_trgrt3I) { _trgrt3 = 0; } else { _trgrt3 = 1; _trgrt3I = 1; } } else { _trgrt3 = 0; _trgrt3I = 0; }; if (_trgrt1) { _tim2O = 1; _tim2I = 1; } else { if (_tim2I) { _tim2I = 0; _tim2P = millis(); } else { if (_tim2O) { if ( _isTimer(_tim2P, 200)) _tim2O = 0; } } } if (!(_gtv1)) { if (_trgrt1I) { _trgrt1 = 0; } else { _trgrt1 = 1; _trgrt1I = 1; } } else { _trgrt1 = 0; _trgrt1I = 0; }; _gtv8 = _trgrt3; _gtv7 = ( (!(_trgr2)) && (_trgrt1) ); if (1) { if (_tim3I) { if (_isTimer(_tim3P, 200)) { _tim3O = 1; } } else { _tim3I = 1; _tim3P = millis(); } } else { _tim3O = 0; _tim3I = 0; } if (!(_gtv7)) { if (_trgrt2I) { _trgrt2 = 0; } else { _trgrt2 = 1; _trgrt2I = 1; } } else { _trgrt2 = 0; _trgrt2I = 0; }; if (( (_gtv9) && (_gtv8) )) _trgr1 = 0; if (( (_tim3O) && (_trgrt2) )) _trgr1 = 1; _gtv6 = _trgr1; if (_gtv6) { _tempVariable_bool = 1; if ( ! _MenuBlock_47814740_OEIS ) { _MenuBlock_47814740_OEIS = 1; _MainMenus[0].currentItem = _MenuItems[0]; } _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 10]); _MenuBlock_47814740_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); _MenuBlock_47814740_VNO = _menuOutputValueString (0); _MenuBlock_47814740_AMMO = (pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 5]) ) == 0; _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[0]).currentItem).startInArrayIndex) + 12]); if (_tempVariable_byte == 0 ) { _MenuBlock_47814740_ASO_1 = ""; } else { _MenuBlock_47814740_ASO_1 = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); } } else { _tempVariable_bool = 0; if (_MenuBlock_47814740_OEIS) { _MenuBlock_47814740_OEIS = 0; _menuUpdateToEEpromItems(); } _MenuBlock_47814740_AMMO = 0; _MenuBlock_47814740_ASO_1 = ""; _MenuBlock_47814740_MNO = ""; _MenuBlock_47814740_VNO = ""; } if (_gtv4) { if ( ! _MenuBlock_47814740_OMUIS) { _MenuBlock_47814740_OMUIS = 1; if (_tempVariable_bool) { _menuUpEvents(0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OMUIS = 0; } if (_gtv5) { if ( ! _MenuBlock_47814740_OMDIS) { _MenuBlock_47814740_OMDIS = 1; if (_tempVariable_bool) { _menuDownEvents(0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OMDIS = 0; } if (( (_gtv7) && (_gtv6) )) { if ( ! _MenuBlock_47814740_OEMIS) { _MenuBlock_47814740_OEMIS = 1; if (_tempVariable_bool) { _menuEnterTheMenuEvents (0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OEMIS = 0; } if (_gtv8) { if ( ! _MenuBlock_47814740_OExFMIS) { _MenuBlock_47814740_OExFMIS = 1; if (_tempVariable_bool) { _menuExitFromMenuEvents (0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OExFMIS = 0; } if (_gtv3) { if ( ! _MenuBlock_47814740_OVUIS) { _MenuBlock_47814740_OVUIS = 1; if (_tempVariable_bool) { _valueUpEvents(0); _MenuBlock_47814740_VUDST = millis(); } } if (_tempVariable_bool) { if (_MenuBlock_47814740_VUDSM == 0) { if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) { _MenuBlock_47814740_VUDSM = 1; _MenuBlock_47814740_VUDSPT = millis(); _MenuBlock_47814740_VUDPT = 500; } } else { if (_MenuBlock_47814740_VUDSM == 1) { if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) { _MenuBlock_47814740_VUDSM = 2; _MenuBlock_47814740_VUDPT = 200; } } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) { _valueUpEvents(0); _MenuBlock_47814740_VUDSPT = millis(); } } } } else { _MenuBlock_47814740_OVUIS = 0; if ( ! ( _gtv2)) { _MenuBlock_47814740_VUDSM = 0; } } if (_gtv2) { if ( ! _MenuBlock_47814740_OVDIS) { _MenuBlock_47814740_OVDIS = 1; if (_tempVariable_bool) { _valueDownEvents(0); _MenuBlock_47814740_VUDST = millis(); } } if (_tempVariable_bool) { if (_MenuBlock_47814740_VUDSM == 0) { if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) { _MenuBlock_47814740_VUDSM = 1; _MenuBlock_47814740_VUDSPT = millis(); _MenuBlock_47814740_VUDPT = 500; } } else { if (_MenuBlock_47814740_VUDSM == 1) { if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) { _MenuBlock_47814740_VUDSM = 2; _MenuBlock_47814740_VUDPT = 200; } } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) { _valueDownEvents(0); _MenuBlock_47814740_VUDSPT = millis(); } } } } else { _MenuBlock_47814740_OVDIS = 0; if ( ! ( _gtv3)) { _MenuBlock_47814740_VUDSM = 0; } } if (_gtv6) { _dispTempLength1 = ((_MenuBlock_47814740_MNO)).length(); if (_disp2oldLength > _dispTempLength1) { _isNeedClearDisp1 = 1; } _disp2oldLength = _dispTempLength1; _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 0); _lcd1.print((_MenuBlock_47814740_MNO)); } else { if (_disp2oldLength > 0) { _isNeedClearDisp1 = 1; _disp2oldLength = 0; } } if (_gtv6) { _dispTempLength1 = ((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))).length(); if (_disp1oldLength > _dispTempLength1) { _isNeedClearDisp1 = 1; } _disp1oldLength = _dispTempLength1; _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 1); _lcd1.print((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))); } else { if (_disp1oldLength > 0) { _isNeedClearDisp1 = 1; _disp1oldLength = 0; } } _gtv9 = _MenuBlock_47814740_AMMO; if ((_gtv11) > (Menu_Value_2_TVD)) _trgr3 = 0; if ((_gtv11) < (Menu_Value_1_TVD)) _trgr3 = 1; digitalWrite(2, !(_trgr3)); if (!(_gtv6)) { Menu_Value_1_TVD = _menuValueArray_int[3]; } _gtv10 = _trgr3; if (!(_gtv6)) { Menu_Value_2_TVD = _menuValueArray_int[2]; } if ((_gtv11) < (Menu_Value_4_TVD)) _trgr4 = 0; if ((_gtv11) > (Menu_Value_3_TVD)) _trgr4 = 1; if (!(_gtv6)) { Menu_Value_3_TVD = _menuValueArray_int[1]; } digitalWrite(3, !(_trgr4)); _gtv12 = _trgr4; if (!(_gtv6)) { Menu_Value_4_TVD = _menuValueArray_int[0]; } digitalWrite(11, ( (( (_gtv12) || (_gtv10) )) && ((_menuValueArray_bool[0])) )); if (_gtv10) { _swi1 = String("H - ON"); } else { _swi1 = String("H - OFF"); } if (_gtv12) { _swi2 = String("V - ON"); } else { _swi2 = String("V - OFF"); } if (!(_gtv6)) { _dispTempLength1 = ((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))).length(); if (_disp3oldLength > _dispTempLength1) { _isNeedClearDisp1 = 1; } _disp3oldLength = _dispTempLength1; _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 0); _lcd1.print((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))); } else { if (_disp3oldLength > 0) { _isNeedClearDisp1 = 1; _disp3oldLength = 0; } } if (!(_gtv6)) { _dispTempLength1 = ((((_swi1) + (String(" ")) + (_swi2)))).length(); if (_disp4oldLength > _dispTempLength1) { _isNeedClearDisp1 = 1; } _disp4oldLength = _dispTempLength1; _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 1); _lcd1.print((((_swi1) + (String(" ")) + (_swi2)))); } else { if (_disp4oldLength > 0) { _isNeedClearDisp1 = 1; _disp4oldLength = 0; } } } String _floatToStringWitRaz(float value, int raz) { return String(value, raz); } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime >= startTime) { return (currentTime >= (startTime + period)); } else { return (currentTime >= (4294967295 - startTime + period)); } } void _menuUpEvents (byte menuIndex) { byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte parIndex = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); byte parentStartIndex; byte parentStopIndex; if (parIndex == 0) { parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex; } else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]); parentStopIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 4]); } if (tempIndex == parentStartIndex) { if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) { (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStopIndex - 1]; return; } else { return; } } (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex - 2]; return; } void _menuDownEvents (byte menuIndex) { byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); byte parentStartIndex; byte parentStopIndex; if (parIndex == 0) { parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex; } else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]); parentStopIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[parIndex - 1]).startInArrayIndex) + 4]); } if (tempIndex == parentStopIndex) { if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) { (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStartIndex - 1]; return; } else { return; } } (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex]; return; } void _valueUpEvents (byte menuIndex) { byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]); byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]); if (itemType == 3) { _menuValueArray_bool[valIndex - 1 ] = 1; return; } if (itemType == 4) { _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] + (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1])); } } void _valueDownEvents (byte menuIndex) { byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]); byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]); if (itemType == 3) { _menuValueArray_bool[valIndex - 1] = 0; return; } if (itemType == 4) { _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] - (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1])); } } void _menuEnterTheMenuEvents (byte menuIndex) { byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); if (!(itemType == 0)) { return; } byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte newIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[tempIndex - 1]).startInArrayIndex) + 3]); if (newIndex == 0) { return; } (_MainMenus[menuIndex]).currentItem = _MenuItems[newIndex - 1]; return; } void _menuExitFromMenuEvents (byte menuIndex) { byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); if (parIndex == 0) { return; } (_MainMenus[menuIndex]).currentItem = _MenuItems[parIndex - 1]; return; } String _menuOutputValueString (byte menuIndex) { byte itemType = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte valueStrIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 11]); if (itemType == 0) { if ( valueStrIndex == 0) { return ""; } else { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[valueStrIndex - 1]))); } } byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]); byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]); if ( valIndex == 0) { return ""; } byte convFormat = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 9]); if (itemType == 3) { return _convertBoolean(itemType, convFormat, valIndex, indexMax, indexMin); } if (itemType == 4) { return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin); } return ""; } void _menuUpdateToEEpromItems() { EEPROM.updateInt(2, (_menuValueArray_int[0])); EEPROM.updateInt(4, (_menuValueArray_int[1])); EEPROM.updateBit(1, 0, (_menuValueArray_bool[0])); EEPROM.updateInt(6, (_menuValueArray_int[2])); EEPROM.updateInt(8, (_menuValueArray_int[3])); } String _readStringFromProgmem (char *string) { String result = String(""); while (pgm_read_byte(string) != '\0') { result = result + char(pgm_read_byte(string)); string++; } return result; } String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin) { if (itemType == 4) { if (convFormat == 4) { return String((_menuValueArray_int[valIndex - 1 ]), DEC); } if (convFormat == 5) { return String((_menuValueArray_int[valIndex - 1]), HEX); } if (convFormat == 6) { return String((_menuValueArray_int[valIndex - 1]), BIN); } } } String _convertBoolean(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin) { if (convFormat == 1) { if (_menuValueArray_bool[valIndex - 1]) { return "1"; } else { return "0"; } } if (convFormat == 2) { if (_menuValueArray_bool[valIndex - 1]) { return "True"; } else { return "False"; } } if (convFormat == 3) { if (_menuValueArray_bool[valIndex - 1 ]) { return ""; } else { return ""; } } if (_menuValueArray_bool[valIndex - 1]) { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMax - 1]))); } else { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMin - 1]))); } } struct UB_142171746 _func_UB_142171746(struct UB_142171746 _ubInstans, int ubi_125089190, int ubpar_125440348, int ubpar_79146376, int ubpar_175158211, int ubpar_40719224) { bool ubo_101667604 = _ubInstans.ubo_101667604; bool ubo_51674151 = _ubInstans.ubo_51674151; bool ubo_137412502 = _ubInstans.ubo_137412502; bool ubo_174461762 = _ubInstans.ubo_174461762; bool ubo_157422683 = _ubInstans.ubo_157422683; int _gtv1 = _ubInstans._gtv1; int _gtv2 = _ubInstans._gtv2; int _gtv3 = _ubInstans._gtv3; int _gtv4 = _ubInstans._gtv4; int _gtv5 = _ubInstans._gtv5; bool _bounse1S = _ubInstans._bounse1S; bool _bounse1O = _ubInstans._bounse1O; unsigned long _bounse1P = _ubInstans._bounse1P; bool _bounse2S = _ubInstans._bounse2S; bool _bounse2O = _ubInstans._bounse2O; unsigned long _bounse2P = _ubInstans._bounse2P; bool _bounse3S = _ubInstans._bounse3S; bool _bounse3O = _ubInstans._bounse3O; unsigned long _bounse3P = _ubInstans._bounse3P; bool _bounse4S = _ubInstans._bounse4S; bool _bounse4O = _ubInstans._bounse4O; unsigned long _bounse4P = _ubInstans._bounse4P; bool _bounse5S = _ubInstans._bounse5S; bool _bounse5O = _ubInstans._bounse5O; unsigned long _bounse5P = _ubInstans._bounse5P; bool _bounceTmpD1 = (ubi_125089190) < (_gtv1); if (_bounse1S) { if (millis() >= (_bounse1P + 40)) { _bounse1O = _bounceTmpD1; _bounse1S = 0; } } else { if ( _bounceTmpD1 != _bounse1O ) { _bounse1S = 1; _bounse1P = millis(); } } bool _bounceTmpD2 = ( ((ubi_125089190) > (_gtv1)) && ((ubi_125089190) < (_gtv2)) ); if (_bounse2S) { if (millis() >= (_bounse2P + 40)) { _bounse2O = _bounceTmpD2; _bounse2S = 0; } } else { if ( _bounceTmpD2 != _bounse2O ) { _bounse2S = 1; _bounse2P = millis(); } } bool _bounceTmpD3 = ( ((ubi_125089190) > (_gtv2)) && ((ubi_125089190) < (_gtv3)) ); if (_bounse3S) { if (millis() >= (_bounse3P + 40)) { _bounse3O = _bounceTmpD3; _bounse3S = 0; } } else { if ( _bounceTmpD3 != _bounse3O ) { _bounse3S = 1; _bounse3P = millis(); } } bool _bounceTmpD4 = ( ((ubi_125089190) > (_gtv3)) && ((ubi_125089190) < (_gtv4)) ); if (_bounse4S) { if (millis() >= (_bounse4P + 40)) { _bounse4O = _bounceTmpD4; _bounse4S = 0; } } else { if ( _bounceTmpD4 != _bounse4O ) { _bounse4S = 1; _bounse4P = millis(); } } bool _bounceTmpD5 = ( ((ubi_125089190) > (_gtv4)) && ((ubi_125089190) < (_gtv5)) ); if (_bounse5S) { if (millis() >= (_bounse5P + 40)) { _bounse5O = _bounceTmpD5; _bounse5S = 0; } } else { if ( _bounceTmpD5 != _bounse5O ) { _bounse5S = 1; _bounse5P = millis(); } } _gtv1 = (ubpar_125440348) / (2); _gtv2 = (((ubpar_79146376) - (ubpar_125440348)) / (2)) + (ubpar_125440348); _gtv3 = (((ubpar_175158211) - (ubpar_79146376)) / (2)) + (ubpar_79146376); _gtv4 = (((ubpar_40719224) - (ubpar_175158211)) / (2)) + (ubpar_175158211); _gtv5 = (((1023) - (ubpar_40719224)) / (2)) + (ubpar_40719224); ubo_101667604 = _bounse1O; ubo_51674151 = _bounse2O; ubo_137412502 = _bounse3O; ubo_174461762 = _bounse4O; ubo_157422683 = _bounse5O; _ubInstans.ubo_101667604 = ubo_101667604; _ubInstans.ubo_51674151 = ubo_51674151; _ubInstans.ubo_137412502 = ubo_137412502; _ubInstans.ubo_174461762 = ubo_174461762; _ubInstans.ubo_157422683 = ubo_157422683; _ubInstans._gtv1 = _gtv1; _ubInstans._gtv2 = _gtv2; _ubInstans._gtv3 = _gtv3; _ubInstans._gtv4 = _gtv4; _ubInstans._gtv5 = _gtv5; _ubInstans._bounse1S = _bounse1S; _ubInstans._bounse1O = _bounse1O; _ubInstans._bounse1P = _bounse1P; _ubInstans._bounse2S = _bounse2S; _ubInstans._bounse2O = _bounse2O; _ubInstans._bounse2P = _bounse2P; _ubInstans._bounse3S = _bounse3S; _ubInstans._bounse3O = _bounse3O; _ubInstans._bounse3P = _bounse3P; _ubInstans._bounse4S = _bounse4S; _ubInstans._bounse4O = _bounse4O; _ubInstans._bounse4P = _bounse4P; _ubInstans._bounse5S = _bounse5S; _ubInstans._bounse5O = _bounse5O; _ubInstans._bounse5P = _bounse5P; return _ubInstans; } 

Now let's “pump over” the project a little. Replace LCD Keypad Shield with a 4x4 matrix keyboard and 4x20 display connected via I2C.



This will allow you to set the value not in steps, but by simply entering numbers. In addition, it will allow you to enter the menu with a password. Changed project layout.



Entirely project.
image

Consider the modified board



A standard polling unit of the matrix keyboard from the library of elements is used.



Pressing the "*" button activates the menu. Only this time not the main menu, but the menu for entering the password.



Password menu settings



This menu consists of one item that serves to enter a password. The Long Integer type is used to increase the number of characters in the password.



This board verifies that the password is entered correctly. If the entered password matches the one saved in the main menu, the main menu is turned on. When exiting the menu, the value of the entered password is recorded 0 (preparation for the next entry)



An item for setting the saved password has been added to the main menu tree.



Also, changes were made to the tab “Value Management”



Control of the value is translated into direct input of numbers. The remaining fees have not changed.

The result of compiling the project
 #include <Wire.h> #include <EEPROMex.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C _lcd2(0x27, 20, 4); int _dispTempLength2 = 0; boolean _isNeedClearDisp2; const byte _menuParametrsArray[] PROGMEM = {1, 5, 1, 0, 0, 0, 0, 0, 1, 4, 1, 0, 0, 2, 0, 0, 6, 7, 0, 0, 0, 0, 0, 8, 11, 0, 3, 0, 0, 8, 9, 0, 0, 0, 0, 0, 6, 11, 0, 4, 3, 1, 0, 0, 0, 12, 13, 1, 8, 3, 0, 0, 5, 5, 2, 0, 0, 0, 0, 0, 1, 4, 2, 0, 0, 6, 4, 2, 0, 0, 2, 0, 0, 1, 4, 5, 0, 10, 7, 4, 4, 0, 0, 2, 0, 0, 1, 4, 9, 0, 10, 8, 4, 3, 0, 0, 3, 0, 0, 1, 4, 7, 0, 10, 9, 4, 1, 0, 0, 3, 0, 0, 1, 4, 4, 0, 10}; bool _menuValueArray_bool[1]; const bool _menuConstantValuesArray_bool[] PROGMEM = {1}; int _menuValueArray_int[4]; const int _menuConstantValuesArray_int[] PROGMEM = {1}; long _menuValueArray_long[2]; const long _menuConstantValuesArray_long[] PROGMEM = {1}; const char _flprogMenuNameString1[] PROGMEM = "Enter Password"; const char _flprogMenuNameString2[] PROGMEM = "ChangePassword"; const char _flprogMenuNameString3[] PROGMEM = "Sound"; const char _flprogMenuNameString4[] PROGMEM = "Vent-Off"; const char _flprogMenuNameString5[] PROGMEM = "Heater-On"; const char _flprogMenuNameString6[] PROGMEM = "Vent Setting"; const char _flprogMenuNameString7[] PROGMEM = "Vent-On"; const char _flprogMenuNameString8[] PROGMEM = "HeaterSetting"; const char _flprogMenuNameString9[] PROGMEM = "Heater-Off"; const char _flprogMenuNameString10[] PROGMEM = "C"; const char _flprogMenuNameString11[] PROGMEM = "Enter to submenu"; const char _flprogMenuNameString12[] PROGMEM = "On"; const char _flprogMenuNameString13[] PROGMEM = "Off"; const char* const _flprogMenuStringsArray[] PROGMEM = { _flprogMenuNameString1, _flprogMenuNameString2, _flprogMenuNameString3, _flprogMenuNameString4, _flprogMenuNameString5, _flprogMenuNameString6, _flprogMenuNameString7, _flprogMenuNameString8, _flprogMenuNameString9, _flprogMenuNameString10, _flprogMenuNameString11, _flprogMenuNameString12, _flprogMenuNameString13}; struct _menuItemStricture { int startInArrayIndex; }; struct _menuMainStricture { String tempString; byte startIndex; byte stopIndex; bool isSwitchMenuAroundRing; _menuItemStricture currentItem; }; _menuItemStricture _MenuItems[9]; _menuMainStricture _MainMenus[2]; bool _gtv6; bool _gtv10 = 0; float _gtv11; bool _gtv12 = 0; bool _gtv1; bool _gtv2; bool _gtv3; bool _gtv4; bool _gtv5; bool _gtv13; bool _gtv14; bool _gtv15; bool _gtv16; bool _gtv17; bool _gtv18; bool _gtv19; bool _gtv20; bool _gtv21; bool _gtv22; bool _gtv23; bool _gtv7; bool _gtv8; int _disp1oldLength = 0; int Menu_Value_4_TVD = 0; int Menu_Value_2_TVD = 0; bool _trgr4 = 0; String _swi1; bool _trgr1 = 0; bool _trgr3 = 0; int _disp2oldLength = 0; bool _trgt1 = 0; bool _trgt1I = 0; int Menu_Value_3_TVD = 0; String _MenuBlock_47814740_ASO_1; String _MenuBlock_47814740_MNO; String _MenuBlock_47814740_VNO; bool _MenuBlock_47814740_OEIS = 0; bool _MenuBlock_47814740_OMUIS = 0; bool _MenuBlock_47814740_OMDIS = 0; bool _MenuBlock_47814740_OEMIS = 0; bool _MenuBlock_47814740_OExFMIS = 0; bool _MenuBlock_47814740_IDI_0 = 0; bool _MenuBlock_47814740_IDI_1 = 0; bool _MenuBlock_47814740_IDI_2 = 0; bool _MenuBlock_47814740_IDI_3 = 0; bool _MenuBlock_47814740_IDI_4 = 0; bool _MenuBlock_47814740_IDI_5 = 0; bool _MenuBlock_47814740_IDI_6 = 0; bool _MenuBlock_47814740_IDI_7 = 0; bool _MenuBlock_47814740_IDI_8 = 0; bool _MenuBlock_47814740_IDI_9 = 0; bool _MenuBlock_47814740MinusIOS = 0; int Menu_Value_1_TVD = 0; bool _mkb1C1xP1 = 0; bool _mkb1C1xP2 = 0; bool _mkb1C1xP3 = 0; bool _mkb1C1xP4 = 0; bool _mkb1C2xP1 = 0; bool _mkb1C2xP2 = 0; bool _mkb1C2xP3 = 0; bool _mkb1C2xP4 = 0; bool _mkb1C3xP1 = 0; bool _mkb1C3xP2 = 0; bool _mkb1C3xP3 = 0; bool _mkb1C3xP4 = 0; bool _mkb1C4xP1 = 0; bool _mkb1C4xP2 = 0; bool _mkb1C4xP3 = 0; bool _mkb1C4xP4 = 0; bool _trgrt1 = 0; bool _trgrt1I = 0; int _disp6oldLength = 0; int _disp4oldLength = 0; int _disp5oldLength = 0; String _MenuBlock_360159546_MNO; String _MenuBlock_360159546_VNO; bool _MenuBlock_360159546_OEIS = 0; bool _MenuBlock_360159546_IDI_0 = 0; bool _MenuBlock_360159546_IDI_1 = 0; bool _MenuBlock_360159546_IDI_2 = 0; bool _MenuBlock_360159546_IDI_3 = 0; bool _MenuBlock_360159546_IDI_4 = 0; bool _MenuBlock_360159546_IDI_5 = 0; bool _MenuBlock_360159546_IDI_6 = 0; bool _MenuBlock_360159546_IDI_7 = 0; bool _MenuBlock_360159546_IDI_8 = 0; bool _MenuBlock_360159546_IDI_9 = 0; int _disp7oldLength = 0; int _disp3oldLength = 0; String _swi2; void setup() { if ((EEPROM.read(0)) != 99) { EEPROM.write(0, 99) ; EEPROM.updateInt(12, 25); EEPROM.updateLong(2, 123456); EEPROM.updateInt(6, 30); EEPROM.updateInt(10, 40); EEPROM.updateBit(1, 0, 0); EEPROM.updateInt(8, 10); } Wire.begin(); pinMode(16, OUTPUT); pinMode(15, OUTPUT); pinMode(17, OUTPUT); _lcd2.init(); _lcd2.backlight(); pinMode(6, INPUT); digitalWrite(6, HIGH); pinMode(7, INPUT); digitalWrite(7, HIGH); pinMode(8, INPUT); digitalWrite(8, HIGH); pinMode(9, INPUT); digitalWrite(9, HIGH); pinMode(2, OUTPUT); digitalWrite(2, HIGH); pinMode(3, OUTPUT); digitalWrite(3, HIGH); pinMode(4, OUTPUT); digitalWrite(4, HIGH); pinMode(5, OUTPUT); digitalWrite(5, HIGH); _MenuItems[0].startInArrayIndex = 0; _MenuItems[1].startInArrayIndex = 13; _MenuItems[2].startInArrayIndex = 26; _MenuItems[3].startInArrayIndex = 39; _MenuItems[4].startInArrayIndex = 52; _MenuItems[5].startInArrayIndex = 65; _MenuItems[6].startInArrayIndex = 78; _MenuItems[7].startInArrayIndex = 91; _MenuItems[8].startInArrayIndex = 104; _MainMenus[0].tempString = ""; _MainMenus[0].startIndex = 1; _MainMenus[0].isSwitchMenuAroundRing = 0; _MainMenus[0].stopIndex = 1; _MainMenus[0].currentItem = _MenuItems[0]; _MainMenus[1].tempString = ""; _MainMenus[1].startIndex = 2; _MainMenus[1].isSwitchMenuAroundRing = 1; _MainMenus[1].stopIndex = 5; _MainMenus[1].currentItem = _MenuItems[1]; _menuValueArray_long[1] = (EEPROM.readLong(2)); _menuValueArray_bool[0] = (EEPROM.readBit(1, 0)); _menuValueArray_int[0] = (EEPROM.readInt(6)); _menuValueArray_int[1] = (EEPROM.readInt(8)); _menuValueArray_int[2] = (EEPROM.readInt(10)); _menuValueArray_int[3] = (EEPROM.readInt(12)); } void loop() { bool _tempVariable_bool; byte _tempVariable_byte; if (_isNeedClearDisp2) { _lcd2.clear(); _isNeedClearDisp2 = 0; } _gtv11 = (map(( (analogRead (0))), (0), (1023), (-20), (80))); digitalWrite(2, 0); _mkb1C1xP1 = ! (digitalRead(6)); _mkb1C1xP2 = ! (digitalRead(7)); _mkb1C1xP3 = ! (digitalRead(8)); _mkb1C1xP4 = ! (digitalRead(9)); digitalWrite(2, 1); digitalWrite(3, 0); _mkb1C2xP1 = ! (digitalRead(6)); _mkb1C2xP2 = ! (digitalRead(7)); _mkb1C2xP3 = ! (digitalRead(8)); _mkb1C2xP4 = ! (digitalRead(9)); digitalWrite(3, 1); digitalWrite(4, 0); _mkb1C3xP1 = ! (digitalRead(6)); _mkb1C3xP2 = ! (digitalRead(7)); _mkb1C3xP3 = ! (digitalRead(8)); _mkb1C3xP4 = ! (digitalRead(9)); digitalWrite(4, 1); digitalWrite(5, 0); _mkb1C4xP1 = ! (digitalRead(6)); _mkb1C4xP2 = ! (digitalRead(7)); _mkb1C4xP3 = ! (digitalRead(8)); _mkb1C4xP4 = ! (digitalRead(9)); digitalWrite(5, 1); _gtv1 = _mkb1C1xP1; _gtv2 = _mkb1C1xP2; _gtv3 = _mkb1C1xP3; _gtv18 = _mkb1C1xP4; _gtv4 = _mkb1C2xP1; _gtv5 = _mkb1C2xP2; _gtv13 = _mkb1C2xP3; _gtv19 = _mkb1C2xP4; _gtv14 = _mkb1C3xP1; _gtv15 = _mkb1C3xP2; _gtv16 = _mkb1C3xP3; _gtv20 = _mkb1C3xP4; _gtv23 = _mkb1C4xP1; _gtv17 = _mkb1C4xP2; _gtv22 = _mkb1C4xP3; _gtv21 = _mkb1C4xP4; bool _tmp1 = _gtv23; if (_tmp1) { if (! _trgt1I) _trgt1 = ! _trgt1; } _trgt1I = _tmp1; _gtv6 = _trgt1; if (_gtv7) { _tempVariable_bool = 1; if ( ! _MenuBlock_360159546_OEIS ) { _MenuBlock_360159546_OEIS = 1; (_MainMenus[0]).tempString = ""; } _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 10]); _MenuBlock_360159546_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); _MenuBlock_360159546_VNO = _menuOutputValueString (0); } else { _tempVariable_bool = 0; if (_MenuBlock_360159546_OEIS) { _MenuBlock_360159546_OEIS = 0; _menuUpdateToEEpromItems(); } _MenuBlock_360159546_MNO = ""; _MenuBlock_360159546_VNO = ""; } if (_gtv17) { if ( ! _MenuBlock_360159546_IDI_0) { _MenuBlock_360159546_IDI_0 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '0'); } } } else { _MenuBlock_360159546_IDI_0 = 0; } if (_gtv1) { if ( ! _MenuBlock_360159546_IDI_1) { _MenuBlock_360159546_IDI_1 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '1'); } } } else { _MenuBlock_360159546_IDI_1 = 0; } if (_gtv2) { if ( ! _MenuBlock_360159546_IDI_2) { _MenuBlock_360159546_IDI_2 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '2'); } } } else { _MenuBlock_360159546_IDI_2 = 0; } if (_gtv3) { if ( ! _MenuBlock_360159546_IDI_3) { _MenuBlock_360159546_IDI_3 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '3'); } } } else { _MenuBlock_360159546_IDI_3 = 0; } if (_gtv4) { if ( ! _MenuBlock_360159546_IDI_4) { _MenuBlock_360159546_IDI_4 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '4'); } } } else { _MenuBlock_360159546_IDI_4 = 0; } if (_gtv5) { if ( ! _MenuBlock_360159546_IDI_5) { _MenuBlock_360159546_IDI_5 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '5'); } } } else { _MenuBlock_360159546_IDI_5 = 0; } if (_gtv13) { if ( ! _MenuBlock_360159546_IDI_6) { _MenuBlock_360159546_IDI_6 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '6'); } } } else { _MenuBlock_360159546_IDI_6 = 0; } if (_gtv14) { if ( ! _MenuBlock_360159546_IDI_7) { _MenuBlock_360159546_IDI_7 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '7'); } } } else { _MenuBlock_360159546_IDI_7 = 0; } if (_gtv15) { if ( ! _MenuBlock_360159546_IDI_8) { _MenuBlock_360159546_IDI_8 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '8'); } } } else { _MenuBlock_360159546_IDI_8 = 0; } if (_gtv16) { if ( ! _MenuBlock_360159546_IDI_9) { _MenuBlock_360159546_IDI_9 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '9'); } } } else { _MenuBlock_360159546_IDI_9 = 0; } if (_gtv7) { _dispTempLength2 = ((_MenuBlock_360159546_MNO)).length(); if (_disp6oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp6oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0); _lcd2.print((_MenuBlock_360159546_MNO)); } else { if (_disp6oldLength > 0) { _isNeedClearDisp2 = 1; _disp6oldLength = 0; } } if (_gtv7) { _dispTempLength2 = ((_MenuBlock_360159546_VNO)).length(); if (_disp7oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp7oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1); _lcd2.print((_MenuBlock_360159546_VNO)); } else { if (_disp7oldLength > 0) { _isNeedClearDisp2 = 1; _disp7oldLength = 0; } } if (_trgrt1) _trgr1 = 0; if (((_menuValueArray_long[0])) == ((_menuValueArray_long[1]))) _trgr1 = 1; if (!(_gtv6)) { if (_trgrt1I) { _trgrt1 = 0; } else { _trgrt1 = 1; _trgrt1I = 1; } } else { _trgrt1 = 0; _trgrt1I = 0; }; _gtv7 = ( (_gtv6) && (!(_trgr1)) ); _gtv8 = ( (_trgr1) && (_gtv6) ); if (_trgrt1) { _menuValueArray_long[0] = 0L; } if (_gtv8) { _tempVariable_bool = 1; if ( ! _MenuBlock_47814740_OEIS ) { _MenuBlock_47814740_OEIS = 1; _MainMenus[1].currentItem = _MenuItems[1]; (_MainMenus[1]).tempString = ""; } _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[1].currentItem ).startInArrayIndex) + 10]); _MenuBlock_47814740_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); _MenuBlock_47814740_VNO = _menuOutputValueString (1); _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[1]).currentItem).startInArrayIndex) + 12]); if (_tempVariable_byte == 0 ) { _MenuBlock_47814740_ASO_1 = ""; } else { _MenuBlock_47814740_ASO_1 = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); } } else { _tempVariable_bool = 0; if (_MenuBlock_47814740_OEIS) { _MenuBlock_47814740_OEIS = 0; _menuUpdateToEEpromItems(); } _MenuBlock_47814740_ASO_1 = ""; _MenuBlock_47814740_MNO = ""; _MenuBlock_47814740_VNO = ""; } if (_gtv20) { if ( ! _MenuBlock_47814740_OMUIS) { _MenuBlock_47814740_OMUIS = 1; if (_tempVariable_bool) { _menuUpEvents(1); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OMUIS = 0; } if (_gtv21) { if ( ! _MenuBlock_47814740_OMDIS) { _MenuBlock_47814740_OMDIS = 1; if (_tempVariable_bool) { _menuDownEvents(1); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OMDIS = 0; } if (_gtv18) { if ( ! _MenuBlock_47814740_OEMIS) { _MenuBlock_47814740_OEMIS = 1; if (_tempVariable_bool) { _menuEnterTheMenuEvents (1); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OEMIS = 0; } if (_gtv19) { if ( ! _MenuBlock_47814740_OExFMIS) { _MenuBlock_47814740_OExFMIS = 1; if (_tempVariable_bool) { _menuExitFromMenuEvents (1); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OExFMIS = 0; } if (_gtv17) { if ( ! _MenuBlock_47814740_IDI_0) { _MenuBlock_47814740_IDI_0 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '0'); } } } else { _MenuBlock_47814740_IDI_0 = 0; } if (_gtv1) { if ( ! _MenuBlock_47814740_IDI_1) { _MenuBlock_47814740_IDI_1 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '1'); } } } else { _MenuBlock_47814740_IDI_1 = 0; } if (_gtv2) { if ( ! _MenuBlock_47814740_IDI_2) { _MenuBlock_47814740_IDI_2 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '2'); } } } else { _MenuBlock_47814740_IDI_2 = 0; } if (_gtv3) { if ( ! _MenuBlock_47814740_IDI_3) { _MenuBlock_47814740_IDI_3 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '3'); } } } else { _MenuBlock_47814740_IDI_3 = 0; } if (_gtv4) { if ( ! _MenuBlock_47814740_IDI_4) { _MenuBlock_47814740_IDI_4 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '4'); } } } else { _MenuBlock_47814740_IDI_4 = 0; } if (_gtv5) { if ( ! _MenuBlock_47814740_IDI_5) { _MenuBlock_47814740_IDI_5 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '5'); } } } else { _MenuBlock_47814740_IDI_5 = 0; } if (_gtv13) { if ( ! _MenuBlock_47814740_IDI_6) { _MenuBlock_47814740_IDI_6 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '6'); } } } else { _MenuBlock_47814740_IDI_6 = 0; } if (_gtv14) { if ( ! _MenuBlock_47814740_IDI_7) { _MenuBlock_47814740_IDI_7 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '7'); } } } else { _MenuBlock_47814740_IDI_7 = 0; } if (_gtv15) { if ( ! _MenuBlock_47814740_IDI_8) { _MenuBlock_47814740_IDI_8 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '8'); } } } else { _MenuBlock_47814740_IDI_8 = 0; } if (_gtv16) { if ( ! _MenuBlock_47814740_IDI_9) { _MenuBlock_47814740_IDI_9 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '9'); } } } else { _MenuBlock_47814740_IDI_9 = 0; } if (_gtv22) { if ( ! _MenuBlock_47814740MinusIOS) { _MenuBlock_47814740MinusIOS = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '-' ); } } } else { _MenuBlock_47814740MinusIOS = 0; } if (_gtv8) { _dispTempLength2 = ((_MenuBlock_47814740_MNO)).length(); if (_disp2oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp2oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0); _lcd2.print((_MenuBlock_47814740_MNO)); } else { if (_disp2oldLength > 0) { _isNeedClearDisp2 = 1; _disp2oldLength = 0; } } if (_gtv8) { _dispTempLength2 = ((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))).length(); if (_disp1oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp1oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1); _lcd2.print((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))); } else { if (_disp1oldLength > 0) { _isNeedClearDisp2 = 1; _disp1oldLength = 0; } } if ((_gtv11) > (Menu_Value_2_TVD)) _trgr3 = 0; if ((_gtv11) < (Menu_Value_1_TVD)) _trgr3 = 1; digitalWrite(16, !(_trgr3)); if (!(_gtv6)) { Menu_Value_1_TVD = _menuValueArray_int[1]; } _gtv10 = _trgr3; if (!(_gtv6)) { Menu_Value_2_TVD = _menuValueArray_int[3]; } if ((_gtv11) < (Menu_Value_4_TVD)) _trgr4 = 0; if ((_gtv11) > (Menu_Value_3_TVD)) _trgr4 = 1; if (!(_gtv6)) { Menu_Value_3_TVD = _menuValueArray_int[2]; } digitalWrite(15, !(_trgr4)); _gtv12 = _trgr4; if (!(_gtv6)) { Menu_Value_4_TVD = _menuValueArray_int[0]; } digitalWrite(17, ( (( (_gtv12) || (_gtv10) )) && ((_menuValueArray_bool[0])) )); if (_gtv10) { _swi1 = String("Heater - ON"); } else { _swi1 = String("Heater - OFF"); } if (_gtv12) { _swi2 = String("Ventilation - ON"); } else { _swi2 = String("Ventilation - OFF"); } if (!(_gtv6)) { _dispTempLength2 = ((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))).length(); if (_disp3oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp3oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0); _lcd2.print((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))); } else { if (_disp3oldLength > 0) { _isNeedClearDisp2 = 1; _disp3oldLength = 0; } } if (!(_gtv6)) { _dispTempLength2 = ((_swi1)).length(); if (_disp4oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp4oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1); _lcd2.print((_swi1)); } else { if (_disp4oldLength > 0) { _isNeedClearDisp2 = 1; _disp4oldLength = 0; } } if (!(_gtv6)) { _dispTempLength2 = ((_swi2)).length(); if (_disp5oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp5oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 2); _lcd2.print((_swi2)); } else { if (_disp5oldLength > 0) { _isNeedClearDisp2 = 1; _disp5oldLength = 0; } } } String _floatToStringWitRaz(float value, int raz) { return String(value, raz); } void _menuUpEvents (byte menuIndex) { (_MainMenus[menuIndex]).tempString = ""; byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte parIndex = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); byte parentStartIndex; byte parentStopIndex; if (parIndex == 0) { parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex; } else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]); parentStopIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 4]); } if (tempIndex == parentStartIndex) { if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) { (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStopIndex - 1]; return; } else { return; } } (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex - 2]; return; } void _menuDownEvents (byte menuIndex) { (_MainMenus[menuIndex]).tempString = ""; byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); byte parentStartIndex; byte parentStopIndex; if (parIndex == 0) { parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex; } else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]); parentStopIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[parIndex - 1]).startInArrayIndex) + 4]); } if (tempIndex == parentStopIndex) { if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) { (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStartIndex - 1]; return; } else { return; } } (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex]; return; } void _menuEnterTheMenuEvents (byte menuIndex) { byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); if (!(itemType == 0)) { return; } byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte newIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[tempIndex - 1]).startInArrayIndex) + 3]); if (newIndex == 0) { return; } (_MainMenus[menuIndex]).tempString = ""; (_MainMenus[menuIndex]).currentItem = _MenuItems[newIndex - 1]; return; } void _menuExitFromMenuEvents (byte menuIndex) { byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); if (parIndex == 0) { return; } (_MainMenus[menuIndex]).tempString = ""; (_MainMenus[menuIndex]).currentItem = _MenuItems[parIndex - 1]; return; } String _menuOutputValueString (byte menuIndex) { byte itemType = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte valueStrIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 11]); if (itemType == 0) { if ( valueStrIndex == 0) { return ""; } else { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[valueStrIndex - 1]))); } } byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]); byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]); if ( valIndex == 0) { return ""; } byte convFormat = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 9]); if (itemType == 3) { return _convertBoolean(itemType, convFormat, valIndex, indexMax, indexMin); } if (itemType == 4) { return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin); } if (itemType == 5) { return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin); } return ""; } void _menuDirectInputKeyPressEvents(byte menuIndex, char inputSymbol) { byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte temp; if (valIndex == 0) { return; } byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); if (itemType == 7) { return; } if (itemType == 3) { (_MainMenus[menuIndex]).tempString = ""; } if (inputSymbol == '-') { temp = ((_MainMenus[menuIndex]).tempString).length() ; if (temp == 0) { (_MainMenus[menuIndex]).tempString = "-"; } else { if (((_MainMenus[menuIndex]).tempString).charAt(0) == '-') { (_MainMenus[menuIndex]).tempString = ((_MainMenus[menuIndex]).tempString).substring(1); } else { (_MainMenus[menuIndex]).tempString = "-" + (_MainMenus[menuIndex]).tempString; } } } else { (_MainMenus[menuIndex]).tempString = (_MainMenus[menuIndex]).tempString + inputSymbol; } if (itemType == 3) { _menuValueArray_bool[valIndex - 1] = ((((_MainMenus[menuIndex]).tempString )).toInt()); } if (itemType == 4) { _menuValueArray_int[valIndex - 1] = (((_MainMenus[menuIndex]).tempString )).toInt(); } if (itemType == 5) { _menuValueArray_long[valIndex - 1] = (((_MainMenus[menuIndex]).tempString ).toInt()); } } void _menuUpdateToEEpromItems() { EEPROM.updateLong(2, (_menuValueArray_long[1])); EEPROM.updateBit(1, 0, (_menuValueArray_bool[0])); EEPROM.updateInt(6, (_menuValueArray_int[0])); EEPROM.updateInt(8, (_menuValueArray_int[1])); EEPROM.updateInt(10, (_menuValueArray_int[2])); EEPROM.updateInt(12, (_menuValueArray_int[3])); } String _readStringFromProgmem (char *string) { String result = String(""); while (pgm_read_byte(string) != '\0') { result = result + char(pgm_read_byte(string)); string++; } return result; } String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin) { if (itemType == 4) { if (convFormat == 4) { return String((_menuValueArray_int[valIndex - 1 ]), DEC); } if (convFormat == 5) { return String((_menuValueArray_int[valIndex - 1]), HEX); } if (convFormat == 6) { return String((_menuValueArray_int[valIndex - 1]), BIN); } } if (itemType == 5) { if (convFormat == 4) { return String((_menuValueArray_long[valIndex - 1 ]), DEC); } if (convFormat == 5) { return String((_menuValueArray_long[valIndex - 1]), HEX); } if (convFormat == 6) { return String((_menuValueArray_long[valIndex - 1]), BIN); } } } String _convertBoolean(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin) { if (convFormat == 1) { if (_menuValueArray_bool[valIndex - 1]) { return "1"; } else { return "0"; } } if (convFormat == 2) { if (_menuValueArray_bool[valIndex - 1]) { return "True"; } else { return "False"; } } if (convFormat == 3) { if (_menuValueArray_bool[valIndex - 1 ]) { return ""; } else { return ""; } } if (_menuValueArray_bool[valIndex - 1]) { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMax - 1]))); } else { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMin - 1]))); } } = {_flprogMenuNameString1, _flprogMenuNameString2, _flprogMenuNameString3, _flprogMenuNameString4, _flprogMenuNameString5, _flprogMenuNameString6, _flprogMenuNameString7, _flprogMenuNameString8, _flprogMenuNameString9, _flprogMenuNameString10, _flprogMenuNameString11, _flprogMenuNameString12, _flprogMenuNameString13}; #include <Wire.h> #include <EEPROMex.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C _lcd2(0x27, 20, 4); int _dispTempLength2 = 0; boolean _isNeedClearDisp2; const byte _menuParametrsArray[] PROGMEM = {1, 5, 1, 0, 0, 0, 0, 0, 1, 4, 1, 0, 0, 2, 0, 0, 6, 7, 0, 0, 0, 0, 0, 8, 11, 0, 3, 0, 0, 8, 9, 0, 0, 0, 0, 0, 6, 11, 0, 4, 3, 1, 0, 0, 0, 12, 13, 1, 8, 3, 0, 0, 5, 5, 2, 0, 0, 0, 0, 0, 1, 4, 2, 0, 0, 6, 4, 2, 0, 0, 2, 0, 0, 1, 4, 5, 0, 10, 7, 4, 4, 0, 0, 2, 0, 0, 1, 4, 9, 0, 10, 8, 4, 3, 0, 0, 3, 0, 0, 1, 4, 7, 0, 10, 9, 4, 1, 0, 0, 3, 0, 0, 1, 4, 4, 0, 10}; bool _menuValueArray_bool[1]; const bool _menuConstantValuesArray_bool[] PROGMEM = {1}; int _menuValueArray_int[4]; const int _menuConstantValuesArray_int[] PROGMEM = {1}; long _menuValueArray_long[2]; const long _menuConstantValuesArray_long[] PROGMEM = {1}; const char _flprogMenuNameString1[] PROGMEM = "Enter Password"; const char _flprogMenuNameString2[] PROGMEM = "ChangePassword"; const char _flprogMenuNameString3[] PROGMEM = "Sound"; const char _flprogMenuNameString4[] PROGMEM = "Vent-Off"; const char _flprogMenuNameString5[] PROGMEM = "Heater-On"; const char _flprogMenuNameString6[] PROGMEM = "Vent Setting"; const char _flprogMenuNameString7[] PROGMEM = "Vent-On"; const char _flprogMenuNameString8[] PROGMEM = "HeaterSetting"; const char _flprogMenuNameString9[] PROGMEM = "Heater-Off"; const char _flprogMenuNameString10[] PROGMEM = "C"; const char _flprogMenuNameString11[] PROGMEM = "Enter to submenu"; const char _flprogMenuNameString12[] PROGMEM = "On"; const char _flprogMenuNameString13[] PROGMEM = "Off"; const char* const _flprogMenuStringsArray[] PROGMEM = { _flprogMenuNameString1, _flprogMenuNameString2, _flprogMenuNameString3, _flprogMenuNameString4, _flprogMenuNameString5, _flprogMenuNameString6, _flprogMenuNameString7, _flprogMenuNameString8, _flprogMenuNameString9, _flprogMenuNameString10, _flprogMenuNameString11, _flprogMenuNameString12, _flprogMenuNameString13}; struct _menuItemStricture { int startInArrayIndex; }; struct _menuMainStricture { String tempString; byte startIndex; byte stopIndex; bool isSwitchMenuAroundRing; _menuItemStricture currentItem; }; _menuItemStricture _MenuItems[9]; _menuMainStricture _MainMenus[2]; bool _gtv6; bool _gtv10 = 0; float _gtv11; bool _gtv12 = 0; bool _gtv1; bool _gtv2; bool _gtv3; bool _gtv4; bool _gtv5; bool _gtv13; bool _gtv14; bool _gtv15; bool _gtv16; bool _gtv17; bool _gtv18; bool _gtv19; bool _gtv20; bool _gtv21; bool _gtv22; bool _gtv23; bool _gtv7; bool _gtv8; int _disp1oldLength = 0; int Menu_Value_4_TVD = 0; int Menu_Value_2_TVD = 0; bool _trgr4 = 0; String _swi1; bool _trgr1 = 0; bool _trgr3 = 0; int _disp2oldLength = 0; bool _trgt1 = 0; bool _trgt1I = 0; int Menu_Value_3_TVD = 0; String _MenuBlock_47814740_ASO_1; String _MenuBlock_47814740_MNO; String _MenuBlock_47814740_VNO; bool _MenuBlock_47814740_OEIS = 0; bool _MenuBlock_47814740_OMUIS = 0; bool _MenuBlock_47814740_OMDIS = 0; bool _MenuBlock_47814740_OEMIS = 0; bool _MenuBlock_47814740_OExFMIS = 0; bool _MenuBlock_47814740_IDI_0 = 0; bool _MenuBlock_47814740_IDI_1 = 0; bool _MenuBlock_47814740_IDI_2 = 0; bool _MenuBlock_47814740_IDI_3 = 0; bool _MenuBlock_47814740_IDI_4 = 0; bool _MenuBlock_47814740_IDI_5 = 0; bool _MenuBlock_47814740_IDI_6 = 0; bool _MenuBlock_47814740_IDI_7 = 0; bool _MenuBlock_47814740_IDI_8 = 0; bool _MenuBlock_47814740_IDI_9 = 0; bool _MenuBlock_47814740MinusIOS = 0; int Menu_Value_1_TVD = 0; bool _mkb1C1xP1 = 0; bool _mkb1C1xP2 = 0; bool _mkb1C1xP3 = 0; bool _mkb1C1xP4 = 0; bool _mkb1C2xP1 = 0; bool _mkb1C2xP2 = 0; bool _mkb1C2xP3 = 0; bool _mkb1C2xP4 = 0; bool _mkb1C3xP1 = 0; bool _mkb1C3xP2 = 0; bool _mkb1C3xP3 = 0; bool _mkb1C3xP4 = 0; bool _mkb1C4xP1 = 0; bool _mkb1C4xP2 = 0; bool _mkb1C4xP3 = 0; bool _mkb1C4xP4 = 0; bool _trgrt1 = 0; bool _trgrt1I = 0; int _disp6oldLength = 0; int _disp4oldLength = 0; int _disp5oldLength = 0; String _MenuBlock_360159546_MNO; String _MenuBlock_360159546_VNO; bool _MenuBlock_360159546_OEIS = 0; bool _MenuBlock_360159546_IDI_0 = 0; bool _MenuBlock_360159546_IDI_1 = 0; bool _MenuBlock_360159546_IDI_2 = 0; bool _MenuBlock_360159546_IDI_3 = 0; bool _MenuBlock_360159546_IDI_4 = 0; bool _MenuBlock_360159546_IDI_5 = 0; bool _MenuBlock_360159546_IDI_6 = 0; bool _MenuBlock_360159546_IDI_7 = 0; bool _MenuBlock_360159546_IDI_8 = 0; bool _MenuBlock_360159546_IDI_9 = 0; int _disp7oldLength = 0; int _disp3oldLength = 0; String _swi2; void setup() { if ((EEPROM.read(0)) != 99) { EEPROM.write(0, 99) ; EEPROM.updateInt(12, 25); EEPROM.updateLong(2, 123456); EEPROM.updateInt(6, 30); EEPROM.updateInt(10, 40); EEPROM.updateBit(1, 0, 0); EEPROM.updateInt(8, 10); } Wire.begin(); pinMode(16, OUTPUT); pinMode(15, OUTPUT); pinMode(17, OUTPUT); _lcd2.init(); _lcd2.backlight(); pinMode(6, INPUT); digitalWrite(6, HIGH); pinMode(7, INPUT); digitalWrite(7, HIGH); pinMode(8, INPUT); digitalWrite(8, HIGH); pinMode(9, INPUT); digitalWrite(9, HIGH); pinMode(2, OUTPUT); digitalWrite(2, HIGH); pinMode(3, OUTPUT); digitalWrite(3, HIGH); pinMode(4, OUTPUT); digitalWrite(4, HIGH); pinMode(5, OUTPUT); digitalWrite(5, HIGH); _MenuItems[0].startInArrayIndex = 0; _MenuItems[1].startInArrayIndex = 13; _MenuItems[2].startInArrayIndex = 26; _MenuItems[3].startInArrayIndex = 39; _MenuItems[4].startInArrayIndex = 52; _MenuItems[5].startInArrayIndex = 65; _MenuItems[6].startInArrayIndex = 78; _MenuItems[7].startInArrayIndex = 91; _MenuItems[8].startInArrayIndex = 104; _MainMenus[0].tempString = ""; _MainMenus[0].startIndex = 1; _MainMenus[0].isSwitchMenuAroundRing = 0; _MainMenus[0].stopIndex = 1; _MainMenus[0].currentItem = _MenuItems[0]; _MainMenus[1].tempString = ""; _MainMenus[1].startIndex = 2; _MainMenus[1].isSwitchMenuAroundRing = 1; _MainMenus[1].stopIndex = 5; _MainMenus[1].currentItem = _MenuItems[1]; _menuValueArray_long[1] = (EEPROM.readLong(2)); _menuValueArray_bool[0] = (EEPROM.readBit(1, 0)); _menuValueArray_int[0] = (EEPROM.readInt(6)); _menuValueArray_int[1] = (EEPROM.readInt(8)); _menuValueArray_int[2] = (EEPROM.readInt(10)); _menuValueArray_int[3] = (EEPROM.readInt(12)); } void loop() { bool _tempVariable_bool; byte _tempVariable_byte; if (_isNeedClearDisp2) { _lcd2.clear(); _isNeedClearDisp2 = 0; } _gtv11 = (map(( (analogRead (0))), (0), (1023), (-20), (80))); digitalWrite(2, 0); _mkb1C1xP1 = ! (digitalRead(6)); _mkb1C1xP2 = ! (digitalRead(7)); _mkb1C1xP3 = ! (digitalRead(8)); _mkb1C1xP4 = ! (digitalRead(9)); digitalWrite(2, 1); digitalWrite(3, 0); _mkb1C2xP1 = ! (digitalRead(6)); _mkb1C2xP2 = ! (digitalRead(7)); _mkb1C2xP3 = ! (digitalRead(8)); _mkb1C2xP4 = ! (digitalRead(9)); digitalWrite(3, 1); digitalWrite(4, 0); _mkb1C3xP1 = ! (digitalRead(6)); _mkb1C3xP2 = ! (digitalRead(7)); _mkb1C3xP3 = ! (digitalRead(8)); _mkb1C3xP4 = ! (digitalRead(9)); digitalWrite(4, 1); digitalWrite(5, 0); _mkb1C4xP1 = ! (digitalRead(6)); _mkb1C4xP2 = ! (digitalRead(7)); _mkb1C4xP3 = ! (digitalRead(8)); _mkb1C4xP4 = ! (digitalRead(9)); digitalWrite(5, 1); _gtv1 = _mkb1C1xP1; _gtv2 = _mkb1C1xP2; _gtv3 = _mkb1C1xP3; _gtv18 = _mkb1C1xP4; _gtv4 = _mkb1C2xP1; _gtv5 = _mkb1C2xP2; _gtv13 = _mkb1C2xP3; _gtv19 = _mkb1C2xP4; _gtv14 = _mkb1C3xP1; _gtv15 = _mkb1C3xP2; _gtv16 = _mkb1C3xP3; _gtv20 = _mkb1C3xP4; _gtv23 = _mkb1C4xP1; _gtv17 = _mkb1C4xP2; _gtv22 = _mkb1C4xP3; _gtv21 = _mkb1C4xP4; bool _tmp1 = _gtv23; if (_tmp1) { if (! _trgt1I) _trgt1 = ! _trgt1; } _trgt1I = _tmp1; _gtv6 = _trgt1; if (_gtv7) { _tempVariable_bool = 1; if ( ! _MenuBlock_360159546_OEIS ) { _MenuBlock_360159546_OEIS = 1; (_MainMenus[0]).tempString = ""; } _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 10]); _MenuBlock_360159546_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); _MenuBlock_360159546_VNO = _menuOutputValueString (0); } else { _tempVariable_bool = 0; if (_MenuBlock_360159546_OEIS) { _MenuBlock_360159546_OEIS = 0; _menuUpdateToEEpromItems(); } _MenuBlock_360159546_MNO = ""; _MenuBlock_360159546_VNO = ""; } if (_gtv17) { if ( ! _MenuBlock_360159546_IDI_0) { _MenuBlock_360159546_IDI_0 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '0'); } } } else { _MenuBlock_360159546_IDI_0 = 0; } if (_gtv1) { if ( ! _MenuBlock_360159546_IDI_1) { _MenuBlock_360159546_IDI_1 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '1'); } } } else { _MenuBlock_360159546_IDI_1 = 0; } if (_gtv2) { if ( ! _MenuBlock_360159546_IDI_2) { _MenuBlock_360159546_IDI_2 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '2'); } } } else { _MenuBlock_360159546_IDI_2 = 0; } if (_gtv3) { if ( ! _MenuBlock_360159546_IDI_3) { _MenuBlock_360159546_IDI_3 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '3'); } } } else { _MenuBlock_360159546_IDI_3 = 0; } if (_gtv4) { if ( ! _MenuBlock_360159546_IDI_4) { _MenuBlock_360159546_IDI_4 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '4'); } } } else { _MenuBlock_360159546_IDI_4 = 0; } if (_gtv5) { if ( ! _MenuBlock_360159546_IDI_5) { _MenuBlock_360159546_IDI_5 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '5'); } } } else { _MenuBlock_360159546_IDI_5 = 0; } if (_gtv13) { if ( ! _MenuBlock_360159546_IDI_6) { _MenuBlock_360159546_IDI_6 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '6'); } } } else { _MenuBlock_360159546_IDI_6 = 0; } if (_gtv14) { if ( ! _MenuBlock_360159546_IDI_7) { _MenuBlock_360159546_IDI_7 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '7'); } } } else { _MenuBlock_360159546_IDI_7 = 0; } if (_gtv15) { if ( ! _MenuBlock_360159546_IDI_8) { _MenuBlock_360159546_IDI_8 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '8'); } } } else { _MenuBlock_360159546_IDI_8 = 0; } if (_gtv16) { if ( ! _MenuBlock_360159546_IDI_9) { _MenuBlock_360159546_IDI_9 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '9'); } } } else { _MenuBlock_360159546_IDI_9 = 0; } if (_gtv7) { _dispTempLength2 = ((_MenuBlock_360159546_MNO)).length(); if (_disp6oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp6oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0); _lcd2.print((_MenuBlock_360159546_MNO)); } else { if (_disp6oldLength > 0) { _isNeedClearDisp2 = 1; _disp6oldLength = 0; } } if (_gtv7) { _dispTempLength2 = ((_MenuBlock_360159546_VNO)).length(); if (_disp7oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp7oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1); _lcd2.print((_MenuBlock_360159546_VNO)); } else { if (_disp7oldLength > 0) { _isNeedClearDisp2 = 1; _disp7oldLength = 0; } } if (_trgrt1) _trgr1 = 0; if (((_menuValueArray_long[0])) == ((_menuValueArray_long[1]))) _trgr1 = 1; if (!(_gtv6)) { if (_trgrt1I) { _trgrt1 = 0; } else { _trgrt1 = 1; _trgrt1I = 1; } } else { _trgrt1 = 0; _trgrt1I = 0; }; _gtv7 = ( (_gtv6) && (!(_trgr1)) ); _gtv8 = ( (_trgr1) && (_gtv6) ); if (_trgrt1) { _menuValueArray_long[0] = 0L; } if (_gtv8) { _tempVariable_bool = 1; if ( ! _MenuBlock_47814740_OEIS ) { _MenuBlock_47814740_OEIS = 1; _MainMenus[1].currentItem = _MenuItems[1]; (_MainMenus[1]).tempString = ""; } _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[1].currentItem ).startInArrayIndex) + 10]); _MenuBlock_47814740_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); _MenuBlock_47814740_VNO = _menuOutputValueString (1); _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[1]).currentItem).startInArrayIndex) + 12]); if (_tempVariable_byte == 0 ) { _MenuBlock_47814740_ASO_1 = ""; } else { _MenuBlock_47814740_ASO_1 = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); } } else { _tempVariable_bool = 0; if (_MenuBlock_47814740_OEIS) { _MenuBlock_47814740_OEIS = 0; _menuUpdateToEEpromItems(); } _MenuBlock_47814740_ASO_1 = ""; _MenuBlock_47814740_MNO = ""; _MenuBlock_47814740_VNO = ""; } if (_gtv20) { if ( ! _MenuBlock_47814740_OMUIS) { _MenuBlock_47814740_OMUIS = 1; if (_tempVariable_bool) { _menuUpEvents(1); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OMUIS = 0; } if (_gtv21) { if ( ! _MenuBlock_47814740_OMDIS) { _MenuBlock_47814740_OMDIS = 1; if (_tempVariable_bool) { _menuDownEvents(1); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OMDIS = 0; } if (_gtv18) { if ( ! _MenuBlock_47814740_OEMIS) { _MenuBlock_47814740_OEMIS = 1; if (_tempVariable_bool) { _menuEnterTheMenuEvents (1); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OEMIS = 0; } if (_gtv19) { if ( ! _MenuBlock_47814740_OExFMIS) { _MenuBlock_47814740_OExFMIS = 1; if (_tempVariable_bool) { _menuExitFromMenuEvents (1); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OExFMIS = 0; } if (_gtv17) { if ( ! _MenuBlock_47814740_IDI_0) { _MenuBlock_47814740_IDI_0 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '0'); } } } else { _MenuBlock_47814740_IDI_0 = 0; } if (_gtv1) { if ( ! _MenuBlock_47814740_IDI_1) { _MenuBlock_47814740_IDI_1 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '1'); } } } else { _MenuBlock_47814740_IDI_1 = 0; } if (_gtv2) { if ( ! _MenuBlock_47814740_IDI_2) { _MenuBlock_47814740_IDI_2 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '2'); } } } else { _MenuBlock_47814740_IDI_2 = 0; } if (_gtv3) { if ( ! _MenuBlock_47814740_IDI_3) { _MenuBlock_47814740_IDI_3 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '3'); } } } else { _MenuBlock_47814740_IDI_3 = 0; } if (_gtv4) { if ( ! _MenuBlock_47814740_IDI_4) { _MenuBlock_47814740_IDI_4 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '4'); } } } else { _MenuBlock_47814740_IDI_4 = 0; } if (_gtv5) { if ( ! _MenuBlock_47814740_IDI_5) { _MenuBlock_47814740_IDI_5 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '5'); } } } else { _MenuBlock_47814740_IDI_5 = 0; } if (_gtv13) { if ( ! _MenuBlock_47814740_IDI_6) { _MenuBlock_47814740_IDI_6 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '6'); } } } else { _MenuBlock_47814740_IDI_6 = 0; } if (_gtv14) { if ( ! _MenuBlock_47814740_IDI_7) { _MenuBlock_47814740_IDI_7 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '7'); } } } else { _MenuBlock_47814740_IDI_7 = 0; } if (_gtv15) { if ( ! _MenuBlock_47814740_IDI_8) { _MenuBlock_47814740_IDI_8 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '8'); } } } else { _MenuBlock_47814740_IDI_8 = 0; } if (_gtv16) { if ( ! _MenuBlock_47814740_IDI_9) { _MenuBlock_47814740_IDI_9 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '9'); } } } else { _MenuBlock_47814740_IDI_9 = 0; } if (_gtv22) { if ( ! _MenuBlock_47814740MinusIOS) { _MenuBlock_47814740MinusIOS = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '-' ); } } } else { _MenuBlock_47814740MinusIOS = 0; } if (_gtv8) { _dispTempLength2 = ((_MenuBlock_47814740_MNO)).length(); if (_disp2oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp2oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0); _lcd2.print((_MenuBlock_47814740_MNO)); } else { if (_disp2oldLength > 0) { _isNeedClearDisp2 = 1; _disp2oldLength = 0; } } if (_gtv8) { _dispTempLength2 = ((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))).length(); if (_disp1oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp1oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1); _lcd2.print((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))); } else { if (_disp1oldLength > 0) { _isNeedClearDisp2 = 1; _disp1oldLength = 0; } } if ((_gtv11) > (Menu_Value_2_TVD)) _trgr3 = 0; if ((_gtv11) < (Menu_Value_1_TVD)) _trgr3 = 1; digitalWrite(16, !(_trgr3)); if (!(_gtv6)) { Menu_Value_1_TVD = _menuValueArray_int[1]; } _gtv10 = _trgr3; if (!(_gtv6)) { Menu_Value_2_TVD = _menuValueArray_int[3]; } if ((_gtv11) < (Menu_Value_4_TVD)) _trgr4 = 0; if ((_gtv11) > (Menu_Value_3_TVD)) _trgr4 = 1; if (!(_gtv6)) { Menu_Value_3_TVD = _menuValueArray_int[2]; } digitalWrite(15, !(_trgr4)); _gtv12 = _trgr4; if (!(_gtv6)) { Menu_Value_4_TVD = _menuValueArray_int[0]; } digitalWrite(17, ( (( (_gtv12) || (_gtv10) )) && ((_menuValueArray_bool[0])) )); if (_gtv10) { _swi1 = String("Heater - ON"); } else { _swi1 = String("Heater - OFF"); } if (_gtv12) { _swi2 = String("Ventilation - ON"); } else { _swi2 = String("Ventilation - OFF"); } if (!(_gtv6)) { _dispTempLength2 = ((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))).length(); if (_disp3oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp3oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0); _lcd2.print((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))); } else { if (_disp3oldLength > 0) { _isNeedClearDisp2 = 1; _disp3oldLength = 0; } } if (!(_gtv6)) { _dispTempLength2 = ((_swi1)).length(); if (_disp4oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp4oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1); _lcd2.print((_swi1)); } else { if (_disp4oldLength > 0) { _isNeedClearDisp2 = 1; _disp4oldLength = 0; } } if (!(_gtv6)) { _dispTempLength2 = ((_swi2)).length(); if (_disp5oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp5oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 2); _lcd2.print((_swi2)); } else { if (_disp5oldLength > 0) { _isNeedClearDisp2 = 1; _disp5oldLength = 0; } } } String _floatToStringWitRaz(float value, int raz) { return String(value, raz); } void _menuUpEvents (byte menuIndex) { (_MainMenus[menuIndex]).tempString = ""; byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte parIndex = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); byte parentStartIndex; byte parentStopIndex; if (parIndex == 0) { parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex; } else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]); parentStopIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 4]); } if (tempIndex == parentStartIndex) { if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) { (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStopIndex - 1]; return; } else { return; } } (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex - 2]; return; } void _menuDownEvents (byte menuIndex) { (_MainMenus[menuIndex]).tempString = ""; byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); byte parentStartIndex; byte parentStopIndex; if (parIndex == 0) { parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex; } else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]); parentStopIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[parIndex - 1]).startInArrayIndex) + 4]); } if (tempIndex == parentStopIndex) { if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) { (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStartIndex - 1]; return; } else { return; } } (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex]; return; } void _menuEnterTheMenuEvents (byte menuIndex) { byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); if (!(itemType == 0)) { return; } byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte newIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[tempIndex - 1]).startInArrayIndex) + 3]); if (newIndex == 0) { return; } (_MainMenus[menuIndex]).tempString = ""; (_MainMenus[menuIndex]).currentItem = _MenuItems[newIndex - 1]; return; } void _menuExitFromMenuEvents (byte menuIndex) { byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); if (parIndex == 0) { return; } (_MainMenus[menuIndex]).tempString = ""; (_MainMenus[menuIndex]).currentItem = _MenuItems[parIndex - 1]; return; } String _menuOutputValueString (byte menuIndex) { byte itemType = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte valueStrIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 11]); if (itemType == 0) { if ( valueStrIndex == 0) { return ""; } else { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[valueStrIndex - 1]))); } } byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]); byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]); if ( valIndex == 0) { return ""; } byte convFormat = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 9]); if (itemType == 3) { return _convertBoolean(itemType, convFormat, valIndex, indexMax, indexMin); } if (itemType == 4) { return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin); } if (itemType == 5) { return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin); } return ""; } void _menuDirectInputKeyPressEvents(byte menuIndex, char inputSymbol) { byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte temp; if (valIndex == 0) { return; } byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); if (itemType == 7) { return; } if (itemType == 3) { (_MainMenus[menuIndex]).tempString = ""; } if (inputSymbol == '-') { temp = ((_MainMenus[menuIndex]).tempString).length() ; if (temp == 0) { (_MainMenus[menuIndex]).tempString = "-"; } else { if (((_MainMenus[menuIndex]).tempString).charAt(0) == '-') { (_MainMenus[menuIndex]).tempString = ((_MainMenus[menuIndex]).tempString).substring(1); } else { (_MainMenus[menuIndex]).tempString = "-" + (_MainMenus[menuIndex]).tempString; } } } else { (_MainMenus[menuIndex]).tempString = (_MainMenus[menuIndex]).tempString + inputSymbol; } if (itemType == 3) { _menuValueArray_bool[valIndex - 1] = ((((_MainMenus[menuIndex]).tempString )).toInt()); } if (itemType == 4) { _menuValueArray_int[valIndex - 1] = (((_MainMenus[menuIndex]).tempString )).toInt(); } if (itemType == 5) { _menuValueArray_long[valIndex - 1] = (((_MainMenus[menuIndex]).tempString ).toInt()); } } void _menuUpdateToEEpromItems() { EEPROM.updateLong(2, (_menuValueArray_long[1])); EEPROM.updateBit(1, 0, (_menuValueArray_bool[0])); EEPROM.updateInt(6, (_menuValueArray_int[0])); EEPROM.updateInt(8, (_menuValueArray_int[1])); EEPROM.updateInt(10, (_menuValueArray_int[2])); EEPROM.updateInt(12, (_menuValueArray_int[3])); } String _readStringFromProgmem (char *string) { String result = String(""); while (pgm_read_byte(string) != '\0') { result = result + char(pgm_read_byte(string)); string++; } return result; } String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin) { if (itemType == 4) { if (convFormat == 4) { return String((_menuValueArray_int[valIndex - 1 ]), DEC); } if (convFormat == 5) { return String((_menuValueArray_int[valIndex - 1]), HEX); } if (convFormat == 6) { return String((_menuValueArray_int[valIndex - 1]), BIN); } } if (itemType == 5) { if (convFormat == 4) { return String((_menuValueArray_long[valIndex - 1 ]), DEC); } if (convFormat == 5) { return String((_menuValueArray_long[valIndex - 1]), HEX); } if (convFormat == 6) { return String((_menuValueArray_long[valIndex - 1]), BIN); } } } String _convertBoolean(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin) { if (convFormat == 1) { if (_menuValueArray_bool[valIndex - 1]) { return "1"; } else { return "0"; } } if (convFormat == 2) { if (_menuValueArray_bool[valIndex - 1]) { return "True"; } else { return "False"; } } if (convFormat == 3) { if (_menuValueArray_bool[valIndex - 1 ]) { return ""; } else { return ""; } } if (_menuValueArray_bool[valIndex - 1]) { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMax - 1]))); } else { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMin - 1]))); } } 

Using a resistor as a temperature reference is convenient for debugging, but in real use, a temperature sensor is still needed. Use the temperature sensor DS18B20. To do this, you must change the first board in both projects.



The “ScanOneWare” block is used to automatically determine the sensor address. This allows you to replace, if necessary, the temperature sensor without flashing the controller.

Changed circuit diagrams
Scheme with LCD Keypad Shield.



Matrix keyboard layout



Result code for the scheme with LCD Keypad Shield.
 #include <EEPROMex.h> #include <LiquidCrystal.h> #include <OneWire.h> LiquidCrystal _lcd1(8, 9, 4, 5, 6, 7); int _dispTempLength1 = 0; boolean _isNeedClearDisp1; struct UB_142171746 { bool ubo_101667604 = 0; bool ubo_51674151 = 0; bool ubo_137412502 = 0; bool ubo_174461762 = 0; bool ubo_157422683 = 0; int _gtv1 = 0; int _gtv2 = 0; int _gtv3 = 0; int _gtv4 = 0; int _gtv5 = 0; bool _bounse1S = 0; bool _bounse1O = 0; unsigned long _bounse1P = 0UL; bool _bounse2S = 0; bool _bounse2O = 0; unsigned long _bounse2P = 0UL; bool _bounse3S = 0; bool _bounse3O = 0; unsigned long _bounse3P = 0UL; bool _bounse4S = 0; bool _bounse4O = 0; unsigned long _bounse4P = 0UL; bool _bounse5S = 0; bool _bounse5O = 0; unsigned long _bounse5P = 0UL; }; UB_142171746 UB_142171746_Instance1; int UB_142171746_ubi_125089190 = 0; OneWire _ow12(12); byte _FLPArray27618413[9]; const byte _menuParametrsArray[] PROGMEM = {1, 0, 0, 4, 5, 0, 0, 0, 0, 0, 1, 9, 0, 2, 0, 0, 6, 7, 0, 0, 0, 0, 0, 6, 9, 0, 3, 3, 1, 0, 0, 0, 10, 11, 1, 8, 3, 0, 0, 4, 4, 2, 0, 0, 1, 0, 0, 1, 4, 4, 0, 8, 5, 4, 4, 0, 0, 1, 0, 0, 1, 4, 7, 0, 8, 6, 4, 1, 0, 0, 2, 0, 0, 1, 4, 2, 0, 8, 7, 4, 3, 0, 0, 2, 0, 0, 1, 4, 5, 0, 8}; bool _menuValueArray_bool[1]; const bool _menuConstantValuesArray_bool[] PROGMEM = {1}; int _menuValueArray_int[4]; const int _menuConstantValuesArray_int[] PROGMEM = {1}; const char _flprogMenuNameString1[] PROGMEM = "HeaterSetting"; const char _flprogMenuNameString2[] PROGMEM = "Vent-On"; const char _flprogMenuNameString3[] PROGMEM = "Sound"; const char _flprogMenuNameString4[] PROGMEM = "Heater-On"; const char _flprogMenuNameString5[] PROGMEM = "Vent-Off"; const char _flprogMenuNameString6[] PROGMEM = "Vent Setting"; const char _flprogMenuNameString7[] PROGMEM = "Heater-Off"; const char _flprogMenuNameString8[] PROGMEM = "C"; const char _flprogMenuNameString9[] PROGMEM = "Enter to submenu"; const char _flprogMenuNameString10[] PROGMEM = "On"; const char _flprogMenuNameString11[] PROGMEM = "Off"; const char* const _flprogMenuStringsArray[] PROGMEM = { _flprogMenuNameString1, _flprogMenuNameString2, _flprogMenuNameString3, _flprogMenuNameString4, _flprogMenuNameString5, _flprogMenuNameString6, _flprogMenuNameString7, _flprogMenuNameString8, _flprogMenuNameString9, _flprogMenuNameString10, _flprogMenuNameString11}; struct _menuItemStricture { int startInArrayIndex; }; struct _menuMainStricture { byte startIndex; byte stopIndex; bool isSwitchMenuAroundRing; _menuItemStricture currentItem; }; _menuItemStricture _MenuItems[7]; _menuMainStricture _MainMenus[1]; bool _gtv1; bool _gtv2; bool _gtv3; bool _gtv4; bool _gtv5; bool _gtv6; bool _gtv7; bool _gtv8; bool _gtv9; bool _gtv10 = 0; float _gtv11; bool _gtv12 = 0; int Menu_Value_3_TVD = 0; int Menu_Value_1_TVD = 0; String _swi2; bool _trgrt4 = 0; bool _trgrt4I = 0; String _swi1; bool _trgrt1 = 0; bool _trgrt1I = 0; int _disp1oldLength = 0; bool _trgrt2 = 0; bool _trgrt2I = 0; int _disp3oldLength = 0; bool _sowb1_needScan = 0; bool _sowb1_ost = 0; bool _sowb1_FLPArray27618413 = 0; int Menu_Value_4_TVD = 0; bool _trgrt3 = 0; bool _trgrt3I = 0; int Menu_Value_2_TVD = 0; int _disp4oldLength = 0; bool _trgr4 = 0; bool _trgr2 = 0; bool _trgr1 = 0; bool _trgr3 = 0; String _MenuBlock_47814740_ASO_1; String _MenuBlock_47814740_MNO; String _MenuBlock_47814740_VNO; bool _MenuBlock_47814740_OEIS = 0; bool _MenuBlock_47814740_OMUIS = 0; bool _MenuBlock_47814740_OMDIS = 0; bool _MenuBlock_47814740_OEMIS = 0; bool _MenuBlock_47814740_OExFMIS = 0; bool _MenuBlock_47814740_OVUIS = 0; bool _MenuBlock_47814740_OVDIS = 0; unsigned long _MenuBlock_47814740_VUDST = 0UL; unsigned long _MenuBlock_47814740_VUDSPT = 0UL; byte _MenuBlock_47814740_VUDSM = 0; int _MenuBlock_47814740_VUDPT = 0; bool _MenuBlock_47814740_AMMO = 0; bool _tim2I = 0; bool _tim2O = 0; unsigned long _tim2P = 0UL; bool _tim3I = 0; bool _tim3O = 0; unsigned long _tim3P = 0UL; bool _tim1I = 0; bool _tim1O = 0; unsigned long _tim1P = 0UL; unsigned long _d18x2x1Tti = 0UL; float _d18x2x1O = 0.00; int _disp2oldLength = 0; void setup() { if ((EEPROM.read(0)) != 97) { EEPROM.write(0, 97) ; EEPROM.updateInt(8, 25); EEPROM.updateBit(1, 0, 0); EEPROM.updateInt(4, 10); EEPROM.updateInt(6, 30); EEPROM.updateInt(2, 40); } pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(11, OUTPUT); _lcd1.begin(16, 2); _MenuItems[0].startInArrayIndex = 0; _MenuItems[1].startInArrayIndex = 13; _MenuItems[2].startInArrayIndex = 26; _MenuItems[3].startInArrayIndex = 39; _MenuItems[4].startInArrayIndex = 52; _MenuItems[5].startInArrayIndex = 65; _MenuItems[6].startInArrayIndex = 78; _MainMenus[0].startIndex = 1; _MainMenus[0].isSwitchMenuAroundRing = 1; _MainMenus[0].stopIndex = 3; _MainMenus[0].currentItem = _MenuItems[0]; _menuValueArray_int[0] = (EEPROM.readInt(2)); _menuValueArray_bool[0] = (EEPROM.readBit(1, 0)); _menuValueArray_int[1] = (EEPROM.readInt(4)); _menuValueArray_int[2] = (EEPROM.readInt(6)); _menuValueArray_int[3] = (EEPROM.readInt(8)); } void loop() { bool _tempVariable_bool; byte _tempVariable_byte; if (_isNeedClearDisp1) { _lcd1.clear(); _isNeedClearDisp1 = 0; } if (1) { if (_trgrt4I) { _trgrt4 = 0; } else { _trgrt4 = 1; _trgrt4I = 1; } } else { _trgrt4 = 0; _trgrt4I = 0; }; if (_isTimer(_d18x2x1Tti, 1000)) { _d18x2x1Tti = millis(); _d18x2x1O = _readDS18_ow12(_FLPArray27618413, _FLPArray27618413[8]); } if (_sowb1_needScan) { if ( _oneWireSeach (_FLPArray27618413, _ow12)) { _sowb1_FLPArray27618413 = 1; } _ow12.reset_search(); _sowb1_needScan = 0; } if (_trgrt4) { if (! _sowb1_ost) { _sowb1_ost = 1; _sowb1_needScan = 1; _sowb1_FLPArray27618413 = 0; } } else { _sowb1_ost = 0; } _gtv11 = (_d18x2x1O); UB_142171746_ubi_125089190 = (analogRead (0)); UB_142171746_Instance1 = _func_UB_142171746(UB_142171746_Instance1, UB_142171746_ubi_125089190, 96, 250, 402, 635); _gtv3 = UB_142171746_Instance1.ubo_101667604; _gtv4 = UB_142171746_Instance1.ubo_51674151; _gtv5 = UB_142171746_Instance1.ubo_137412502; _gtv2 = UB_142171746_Instance1.ubo_174461762; _gtv1 = UB_142171746_Instance1.ubo_157422683; if (_gtv1) { if (_tim1I) { if (_isTimer(_tim1P, 2000)) { _tim1O = 1; } } else { _tim1I = 1; _tim1P = millis(); } } else { _tim1O = 0; _tim1I = 0; } if (_tim2O) _trgr2 = 0; if (_tim1O) _trgr2 = 1; if (_trgr2) { if (_trgrt3I) { _trgrt3 = 0; } else { _trgrt3 = 1; _trgrt3I = 1; } } else { _trgrt3 = 0; _trgrt3I = 0; }; if (_trgrt1) { _tim2O = 1; _tim2I = 1; } else { if (_tim2I) { _tim2I = 0; _tim2P = millis(); } else { if (_tim2O) { if ( _isTimer(_tim2P, 200)) _tim2O = 0; } } } if (!(_gtv1)) { if (_trgrt1I) { _trgrt1 = 0; } else { _trgrt1 = 1; _trgrt1I = 1; } } else { _trgrt1 = 0; _trgrt1I = 0; }; _gtv8 = _trgrt3; _gtv7 = ( (!(_trgr2)) && (_trgrt1) ); if (1) { if (_tim3I) { if (_isTimer(_tim3P, 200)) { _tim3O = 1; } } else { _tim3I = 1; _tim3P = millis(); } } else { _tim3O = 0; _tim3I = 0; } if (!(_gtv7)) { if (_trgrt2I) { _trgrt2 = 0; } else { _trgrt2 = 1; _trgrt2I = 1; } } else { _trgrt2 = 0; _trgrt2I = 0; }; if (( (_gtv9) && (_gtv8) )) _trgr1 = 0; if (( (_tim3O) && (_trgrt2) )) _trgr1 = 1; _gtv6 = _trgr1; if (_gtv6) { _tempVariable_bool = 1; if ( ! _MenuBlock_47814740_OEIS ) { _MenuBlock_47814740_OEIS = 1; _MainMenus[0].currentItem = _MenuItems[0]; } _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 10]); _MenuBlock_47814740_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); _MenuBlock_47814740_VNO = _menuOutputValueString (0); _MenuBlock_47814740_AMMO = (pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 5]) ) == 0; _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[0]).currentItem).startInArrayIndex) + 12]); if (_tempVariable_byte == 0 ) { _MenuBlock_47814740_ASO_1 = ""; } else { _MenuBlock_47814740_ASO_1 = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); } } else { _tempVariable_bool = 0; if (_MenuBlock_47814740_OEIS) { _MenuBlock_47814740_OEIS = 0; _menuUpdateToEEpromItems(); } _MenuBlock_47814740_AMMO = 0; _MenuBlock_47814740_ASO_1 = ""; _MenuBlock_47814740_MNO = ""; _MenuBlock_47814740_VNO = ""; } if (_gtv4) { if ( ! _MenuBlock_47814740_OMUIS) { _MenuBlock_47814740_OMUIS = 1; if (_tempVariable_bool) { _menuUpEvents(0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OMUIS = 0; } if (_gtv5) { if ( ! _MenuBlock_47814740_OMDIS) { _MenuBlock_47814740_OMDIS = 1; if (_tempVariable_bool) { _menuDownEvents(0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OMDIS = 0; } if (( (_gtv7) && (_gtv6) )) { if ( ! _MenuBlock_47814740_OEMIS) { _MenuBlock_47814740_OEMIS = 1; if (_tempVariable_bool) { _menuEnterTheMenuEvents (0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OEMIS = 0; } if (_gtv8) { if ( ! _MenuBlock_47814740_OExFMIS) { _MenuBlock_47814740_OExFMIS = 1; if (_tempVariable_bool) { _menuExitFromMenuEvents (0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OExFMIS = 0; } if (_gtv3) { if ( ! _MenuBlock_47814740_OVUIS) { _MenuBlock_47814740_OVUIS = 1; if (_tempVariable_bool) { _valueUpEvents(0); _MenuBlock_47814740_VUDST = millis(); } } if (_tempVariable_bool) { if (_MenuBlock_47814740_VUDSM == 0) { if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) { _MenuBlock_47814740_VUDSM = 1; _MenuBlock_47814740_VUDSPT = millis(); _MenuBlock_47814740_VUDPT = 500; } } else { if (_MenuBlock_47814740_VUDSM == 1) { if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) { _MenuBlock_47814740_VUDSM = 2; _MenuBlock_47814740_VUDPT = 200; } } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) { _valueUpEvents(0); _MenuBlock_47814740_VUDSPT = millis(); } } } } else { _MenuBlock_47814740_OVUIS = 0; if ( ! ( _gtv2)) { _MenuBlock_47814740_VUDSM = 0; } } if (_gtv2) { if ( ! _MenuBlock_47814740_OVDIS) { _MenuBlock_47814740_OVDIS = 1; if (_tempVariable_bool) { _valueDownEvents(0); _MenuBlock_47814740_VUDST = millis(); } } if (_tempVariable_bool) { if (_MenuBlock_47814740_VUDSM == 0) { if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) { _MenuBlock_47814740_VUDSM = 1; _MenuBlock_47814740_VUDSPT = millis(); _MenuBlock_47814740_VUDPT = 500; } } else { if (_MenuBlock_47814740_VUDSM == 1) { if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) { _MenuBlock_47814740_VUDSM = 2; _MenuBlock_47814740_VUDPT = 200; } } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) { _valueDownEvents(0); _MenuBlock_47814740_VUDSPT = millis(); } } } } else { _MenuBlock_47814740_OVDIS = 0; if ( ! ( _gtv3)) { _MenuBlock_47814740_VUDSM = 0; } } if (_gtv6) { _dispTempLength1 = ((_MenuBlock_47814740_MNO)).length(); if (_disp2oldLength > _dispTempLength1) { _isNeedClearDisp1 = 1; } _disp2oldLength = _dispTempLength1; _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 0); _lcd1.print((_MenuBlock_47814740_MNO)); } else { if (_disp2oldLength > 0) { _isNeedClearDisp1 = 1; _disp2oldLength = 0; } } if (_gtv6) { _dispTempLength1 = ((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))).length(); if (_disp1oldLength > _dispTempLength1) { _isNeedClearDisp1 = 1; } _disp1oldLength = _dispTempLength1; _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 1); _lcd1.print((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))); } else { if (_disp1oldLength > 0) { _isNeedClearDisp1 = 1; _disp1oldLength = 0; } } _gtv9 = _MenuBlock_47814740_AMMO; if ((_gtv11) > (Menu_Value_2_TVD)) _trgr3 = 0; if ((_gtv11) < (Menu_Value_1_TVD)) _trgr3 = 1; digitalWrite(2, !(_trgr3)); if (!(_gtv6)) { Menu_Value_1_TVD = _menuValueArray_int[1]; } _gtv10 = _trgr3; if (!(_gtv6)) { Menu_Value_2_TVD = _menuValueArray_int[3]; } if ((_gtv11) < (Menu_Value_4_TVD)) _trgr4 = 0; if ((_gtv11) > (Menu_Value_3_TVD)) _trgr4 = 1; if (!(_gtv6)) { Menu_Value_3_TVD = _menuValueArray_int[0]; } digitalWrite(3, !(_trgr4)); _gtv12 = _trgr4; if (!(_gtv6)) { Menu_Value_4_TVD = _menuValueArray_int[2]; } digitalWrite(11, ( (( (_gtv12) || (_gtv10) )) && ((_menuValueArray_bool[0])) )); if (_gtv10) { _swi1 = String("H - ON"); } else { _swi1 = String("H - OFF"); } if (_gtv12) { _swi2 = String("V - ON"); } else { _swi2 = String("V - OFF"); } if (!(_gtv6)) { _dispTempLength1 = ((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))).length(); if (_disp3oldLength > _dispTempLength1) { _isNeedClearDisp1 = 1; } _disp3oldLength = _dispTempLength1; _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 0); _lcd1.print((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))); } else { if (_disp3oldLength > 0) { _isNeedClearDisp1 = 1; _disp3oldLength = 0; } } if (!(_gtv6)) { _dispTempLength1 = ((((_swi1) + (String(" ")) + (_swi2)))).length(); if (_disp4oldLength > _dispTempLength1) { _isNeedClearDisp1 = 1; } _disp4oldLength = _dispTempLength1; _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 1); _lcd1.print((((_swi1) + (String(" ")) + (_swi2)))); } else { if (_disp4oldLength > 0) { _isNeedClearDisp1 = 1; _disp4oldLength = 0; } } } String _floatToStringWitRaz(float value, int raz) { return String(value, raz); } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime >= startTime) { return (currentTime >= (startTime + period)); } else { return (currentTime >= (4294967295 - startTime + period)); } } void _menuUpEvents (byte menuIndex) { byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte parIndex = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); byte parentStartIndex; byte parentStopIndex; if (parIndex == 0) { parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex; } else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]); parentStopIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 4]); } if (tempIndex == parentStartIndex) { if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) { (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStopIndex - 1]; return; } else { return; } } (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex - 2]; return; } void _menuDownEvents (byte menuIndex) { byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); byte parentStartIndex; byte parentStopIndex; if (parIndex == 0) { parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex; } else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]); parentStopIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[parIndex - 1]).startInArrayIndex) + 4]); } if (tempIndex == parentStopIndex) { if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) { (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStartIndex - 1]; return; } else { return; } } (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex]; return; } void _valueUpEvents (byte menuIndex) { byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]); byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]); if (itemType == 3) { _menuValueArray_bool[valIndex - 1 ] = 1; return; } if (itemType == 4) { _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] + (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1])); } } void _valueDownEvents (byte menuIndex) { byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]); byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]); if (itemType == 3) { _menuValueArray_bool[valIndex - 1] = 0; return; } if (itemType == 4) { _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] - (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1])); } } void _menuEnterTheMenuEvents (byte menuIndex) { byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); if (!(itemType == 0)) { return; } byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte newIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[tempIndex - 1]).startInArrayIndex) + 3]); if (newIndex == 0) { return; } (_MainMenus[menuIndex]).currentItem = _MenuItems[newIndex - 1]; return; } void _menuExitFromMenuEvents (byte menuIndex) { byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); if (parIndex == 0) { return; } (_MainMenus[menuIndex]).currentItem = _MenuItems[parIndex - 1]; return; } String _menuOutputValueString (byte menuIndex) { byte itemType = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte valueStrIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 11]); if (itemType == 0) { if ( valueStrIndex == 0) { return ""; } else { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[valueStrIndex - 1]))); } } byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]); byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]); if ( valIndex == 0) { return ""; } byte convFormat = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 9]); if (itemType == 3) { return _convertBoolean(itemType, convFormat, valIndex, indexMax, indexMin); } if (itemType == 4) { return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin); } return ""; } void _menuUpdateToEEpromItems() { EEPROM.updateInt(2, (_menuValueArray_int[0])); EEPROM.updateBit(1, 0, (_menuValueArray_bool[0])); EEPROM.updateInt(4, (_menuValueArray_int[1])); EEPROM.updateInt(6, (_menuValueArray_int[2])); EEPROM.updateInt(8, (_menuValueArray_int[3])); } String _readStringFromProgmem (char *string) { String result = String(""); while (pgm_read_byte(string) != '\0') { result = result + char(pgm_read_byte(string)); string++; } return result; } String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin) { if (itemType == 4) { if (convFormat == 4) { return String((_menuValueArray_int[valIndex - 1 ]), DEC); } if (convFormat == 5) { return String((_menuValueArray_int[valIndex - 1]), HEX); } if (convFormat == 6) { return String((_menuValueArray_int[valIndex - 1]), BIN); } } } String _convertBoolean(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin) { if (convFormat == 1) { if (_menuValueArray_bool[valIndex - 1]) { return "1"; } else { return "0"; } } if (convFormat == 2) { if (_menuValueArray_bool[valIndex - 1]) { return "True"; } else { return "False"; } } if (convFormat == 3) { if (_menuValueArray_bool[valIndex - 1 ]) { return ""; } else { return ""; } } if (_menuValueArray_bool[valIndex - 1]) { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMax - 1]))); } else { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMin - 1]))); } } float _convertDS18x2xData(byte type_s, byte data[12]) { int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } return (float)raw / 16.0; } float _readDS18_ow12(byte addr[8], byte type_s) { byte data[12]; byte i; _ow12.reset(); _ow12.select(addr); _ow12.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = _ow12.read(); } _ow12.reset(); _ow12.select(addr); _ow12.write(0x44, 1); return _convertDS18x2xData(type_s, data); } bool _oneWireSeach (byte array[], OneWire ow ) { byte temp[8]; byte i; if ( !ow.search(temp)) { return false; } if (OneWire::crc8(temp, 7) != temp[7]) { return false; } switch (temp[0]) { case 0x10: array[8] = 1; break; case 0x28: array[8] = 0; break; case 0x22: array[8] = 0; break; default: return false; } for ( i = 0; i < 8; i++) { array[i] = temp[i]; } return true; } struct UB_142171746 _func_UB_142171746(struct UB_142171746 _ubInstans, int ubi_125089190, int ubpar_125440348, int ubpar_79146376, int ubpar_175158211, int ubpar_40719224) { bool ubo_101667604 = _ubInstans.ubo_101667604; bool ubo_51674151 = _ubInstans.ubo_51674151; bool ubo_137412502 = _ubInstans.ubo_137412502; bool ubo_174461762 = _ubInstans.ubo_174461762; bool ubo_157422683 = _ubInstans.ubo_157422683; int _gtv1 = _ubInstans._gtv1; int _gtv2 = _ubInstans._gtv2; int _gtv3 = _ubInstans._gtv3; int _gtv4 = _ubInstans._gtv4; int _gtv5 = _ubInstans._gtv5; bool _bounse1S = _ubInstans._bounse1S; bool _bounse1O = _ubInstans._bounse1O; unsigned long _bounse1P = _ubInstans._bounse1P; bool _bounse2S = _ubInstans._bounse2S; bool _bounse2O = _ubInstans._bounse2O; unsigned long _bounse2P = _ubInstans._bounse2P; bool _bounse3S = _ubInstans._bounse3S; bool _bounse3O = _ubInstans._bounse3O; unsigned long _bounse3P = _ubInstans._bounse3P; bool _bounse4S = _ubInstans._bounse4S; bool _bounse4O = _ubInstans._bounse4O; unsigned long _bounse4P = _ubInstans._bounse4P; bool _bounse5S = _ubInstans._bounse5S; bool _bounse5O = _ubInstans._bounse5O; unsigned long _bounse5P = _ubInstans._bounse5P; bool _bounceTmpD1 = (ubi_125089190) < (_gtv1); if (_bounse1S) { if (millis() >= (_bounse1P + 40)) { _bounse1O = _bounceTmpD1; _bounse1S = 0; } } else { if ( _bounceTmpD1 != _bounse1O ) { _bounse1S = 1; _bounse1P = millis(); } } bool _bounceTmpD2 = ( ((ubi_125089190) > (_gtv1)) && ((ubi_125089190) < (_gtv2)) ); if (_bounse2S) { if (millis() >= (_bounse2P + 40)) { _bounse2O = _bounceTmpD2; _bounse2S = 0; } } else { if ( _bounceTmpD2 != _bounse2O ) { _bounse2S = 1; _bounse2P = millis(); } } bool _bounceTmpD3 = ( ((ubi_125089190) > (_gtv2)) && ((ubi_125089190) < (_gtv3)) ); if (_bounse3S) { if (millis() >= (_bounse3P + 40)) { _bounse3O = _bounceTmpD3; _bounse3S = 0; } } else { if ( _bounceTmpD3 != _bounse3O ) { _bounse3S = 1; _bounse3P = millis(); } } bool _bounceTmpD4 = ( ((ubi_125089190) > (_gtv3)) && ((ubi_125089190) < (_gtv4)) ); if (_bounse4S) { if (millis() >= (_bounse4P + 40)) { _bounse4O = _bounceTmpD4; _bounse4S = 0; } } else { if ( _bounceTmpD4 != _bounse4O ) { _bounse4S = 1; _bounse4P = millis(); } } bool _bounceTmpD5 = ( ((ubi_125089190) > (_gtv4)) && ((ubi_125089190) < (_gtv5)) ); if (_bounse5S) { if (millis() >= (_bounse5P + 40)) { _bounse5O = _bounceTmpD5; _bounse5S = 0; } } else { if ( _bounceTmpD5 != _bounse5O ) { _bounse5S = 1; _bounse5P = millis(); } } _gtv1 = (ubpar_125440348) / (2); _gtv2 = (((ubpar_79146376) - (ubpar_125440348)) / (2)) + (ubpar_125440348); _gtv3 = (((ubpar_175158211) - (ubpar_79146376)) / (2)) + (ubpar_79146376); _gtv4 = (((ubpar_40719224) - (ubpar_175158211)) / (2)) + (ubpar_175158211); _gtv5 = (((1023) - (ubpar_40719224)) / (2)) + (ubpar_40719224); ubo_101667604 = _bounse1O; ubo_51674151 = _bounse2O; ubo_137412502 = _bounse3O; ubo_174461762 = _bounse4O; ubo_157422683 = _bounse5O; _ubInstans.ubo_101667604 = ubo_101667604; _ubInstans.ubo_51674151 = ubo_51674151; _ubInstans.ubo_137412502 = ubo_137412502; _ubInstans.ubo_174461762 = ubo_174461762; _ubInstans.ubo_157422683 = ubo_157422683; _ubInstans._gtv1 = _gtv1; _ubInstans._gtv2 = _gtv2; _ubInstans._gtv3 = _gtv3; _ubInstans._gtv4 = _gtv4; _ubInstans._gtv5 = _gtv5; _ubInstans._bounse1S = _bounse1S; _ubInstans._bounse1O = _bounse1O; _ubInstans._bounse1P = _bounse1P; _ubInstans._bounse2S = _bounse2S; _ubInstans._bounse2O = _bounse2O; _ubInstans._bounse2P = _bounse2P; _ubInstans._bounse3S = _bounse3S; _ubInstans._bounse3O = _bounse3O; _ubInstans._bounse3P = _bounse3P; _ubInstans._bounse4S = _bounse4S; _ubInstans._bounse4O = _bounse4O; _ubInstans._bounse4P = _bounse4P; _ubInstans._bounse5S = _bounse5S; _ubInstans._bounse5O = _bounse5O; _ubInstans._bounse5P = _bounse5P; return _ubInstans; } = {_flprogMenuNameString1, _flprogMenuNameString2, _flprogMenuNameString3, _flprogMenuNameString4, _flprogMenuNameString5, _flprogMenuNameString6, _flprogMenuNameString7, _flprogMenuNameString8, _flprogMenuNameString9, _flprogMenuNameString10, _flprogMenuNameString11}; #include <EEPROMex.h> #include <LiquidCrystal.h> #include <OneWire.h> LiquidCrystal _lcd1(8, 9, 4, 5, 6, 7); int _dispTempLength1 = 0; boolean _isNeedClearDisp1; struct UB_142171746 { bool ubo_101667604 = 0; bool ubo_51674151 = 0; bool ubo_137412502 = 0; bool ubo_174461762 = 0; bool ubo_157422683 = 0; int _gtv1 = 0; int _gtv2 = 0; int _gtv3 = 0; int _gtv4 = 0; int _gtv5 = 0; bool _bounse1S = 0; bool _bounse1O = 0; unsigned long _bounse1P = 0UL; bool _bounse2S = 0; bool _bounse2O = 0; unsigned long _bounse2P = 0UL; bool _bounse3S = 0; bool _bounse3O = 0; unsigned long _bounse3P = 0UL; bool _bounse4S = 0; bool _bounse4O = 0; unsigned long _bounse4P = 0UL; bool _bounse5S = 0; bool _bounse5O = 0; unsigned long _bounse5P = 0UL; }; UB_142171746 UB_142171746_Instance1; int UB_142171746_ubi_125089190 = 0; OneWire _ow12(12); byte _FLPArray27618413[9]; const byte _menuParametrsArray[] PROGMEM = {1, 0, 0, 4, 5, 0, 0, 0, 0, 0, 1, 9, 0, 2, 0, 0, 6, 7, 0, 0, 0, 0, 0, 6, 9, 0, 3, 3, 1, 0, 0, 0, 10, 11, 1, 8, 3, 0, 0, 4, 4, 2, 0, 0, 1, 0, 0, 1, 4, 4, 0, 8, 5, 4, 4, 0, 0, 1, 0, 0, 1, 4, 7, 0, 8, 6, 4, 1, 0, 0, 2, 0, 0, 1, 4, 2, 0, 8, 7, 4, 3, 0, 0, 2, 0, 0, 1, 4, 5, 0, 8}; bool _menuValueArray_bool[1]; const bool _menuConstantValuesArray_bool[] PROGMEM = {1}; int _menuValueArray_int[4]; const int _menuConstantValuesArray_int[] PROGMEM = {1}; const char _flprogMenuNameString1[] PROGMEM = "HeaterSetting"; const char _flprogMenuNameString2[] PROGMEM = "Vent-On"; const char _flprogMenuNameString3[] PROGMEM = "Sound"; const char _flprogMenuNameString4[] PROGMEM = "Heater-On"; const char _flprogMenuNameString5[] PROGMEM = "Vent-Off"; const char _flprogMenuNameString6[] PROGMEM = "Vent Setting"; const char _flprogMenuNameString7[] PROGMEM = "Heater-Off"; const char _flprogMenuNameString8[] PROGMEM = "C"; const char _flprogMenuNameString9[] PROGMEM = "Enter to submenu"; const char _flprogMenuNameString10[] PROGMEM = "On"; const char _flprogMenuNameString11[] PROGMEM = "Off"; const char* const _flprogMenuStringsArray[] PROGMEM = { _flprogMenuNameString1, _flprogMenuNameString2, _flprogMenuNameString3, _flprogMenuNameString4, _flprogMenuNameString5, _flprogMenuNameString6, _flprogMenuNameString7, _flprogMenuNameString8, _flprogMenuNameString9, _flprogMenuNameString10, _flprogMenuNameString11}; struct _menuItemStricture { int startInArrayIndex; }; struct _menuMainStricture { byte startIndex; byte stopIndex; bool isSwitchMenuAroundRing; _menuItemStricture currentItem; }; _menuItemStricture _MenuItems[7]; _menuMainStricture _MainMenus[1]; bool _gtv1; bool _gtv2; bool _gtv3; bool _gtv4; bool _gtv5; bool _gtv6; bool _gtv7; bool _gtv8; bool _gtv9; bool _gtv10 = 0; float _gtv11; bool _gtv12 = 0; int Menu_Value_3_TVD = 0; int Menu_Value_1_TVD = 0; String _swi2; bool _trgrt4 = 0; bool _trgrt4I = 0; String _swi1; bool _trgrt1 = 0; bool _trgrt1I = 0; int _disp1oldLength = 0; bool _trgrt2 = 0; bool _trgrt2I = 0; int _disp3oldLength = 0; bool _sowb1_needScan = 0; bool _sowb1_ost = 0; bool _sowb1_FLPArray27618413 = 0; int Menu_Value_4_TVD = 0; bool _trgrt3 = 0; bool _trgrt3I = 0; int Menu_Value_2_TVD = 0; int _disp4oldLength = 0; bool _trgr4 = 0; bool _trgr2 = 0; bool _trgr1 = 0; bool _trgr3 = 0; String _MenuBlock_47814740_ASO_1; String _MenuBlock_47814740_MNO; String _MenuBlock_47814740_VNO; bool _MenuBlock_47814740_OEIS = 0; bool _MenuBlock_47814740_OMUIS = 0; bool _MenuBlock_47814740_OMDIS = 0; bool _MenuBlock_47814740_OEMIS = 0; bool _MenuBlock_47814740_OExFMIS = 0; bool _MenuBlock_47814740_OVUIS = 0; bool _MenuBlock_47814740_OVDIS = 0; unsigned long _MenuBlock_47814740_VUDST = 0UL; unsigned long _MenuBlock_47814740_VUDSPT = 0UL; byte _MenuBlock_47814740_VUDSM = 0; int _MenuBlock_47814740_VUDPT = 0; bool _MenuBlock_47814740_AMMO = 0; bool _tim2I = 0; bool _tim2O = 0; unsigned long _tim2P = 0UL; bool _tim3I = 0; bool _tim3O = 0; unsigned long _tim3P = 0UL; bool _tim1I = 0; bool _tim1O = 0; unsigned long _tim1P = 0UL; unsigned long _d18x2x1Tti = 0UL; float _d18x2x1O = 0.00; int _disp2oldLength = 0; void setup() { if ((EEPROM.read(0)) != 97) { EEPROM.write(0, 97) ; EEPROM.updateInt(8, 25); EEPROM.updateBit(1, 0, 0); EEPROM.updateInt(4, 10); EEPROM.updateInt(6, 30); EEPROM.updateInt(2, 40); } pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(11, OUTPUT); _lcd1.begin(16, 2); _MenuItems[0].startInArrayIndex = 0; _MenuItems[1].startInArrayIndex = 13; _MenuItems[2].startInArrayIndex = 26; _MenuItems[3].startInArrayIndex = 39; _MenuItems[4].startInArrayIndex = 52; _MenuItems[5].startInArrayIndex = 65; _MenuItems[6].startInArrayIndex = 78; _MainMenus[0].startIndex = 1; _MainMenus[0].isSwitchMenuAroundRing = 1; _MainMenus[0].stopIndex = 3; _MainMenus[0].currentItem = _MenuItems[0]; _menuValueArray_int[0] = (EEPROM.readInt(2)); _menuValueArray_bool[0] = (EEPROM.readBit(1, 0)); _menuValueArray_int[1] = (EEPROM.readInt(4)); _menuValueArray_int[2] = (EEPROM.readInt(6)); _menuValueArray_int[3] = (EEPROM.readInt(8)); } void loop() { bool _tempVariable_bool; byte _tempVariable_byte; if (_isNeedClearDisp1) { _lcd1.clear(); _isNeedClearDisp1 = 0; } if (1) { if (_trgrt4I) { _trgrt4 = 0; } else { _trgrt4 = 1; _trgrt4I = 1; } } else { _trgrt4 = 0; _trgrt4I = 0; }; if (_isTimer(_d18x2x1Tti, 1000)) { _d18x2x1Tti = millis(); _d18x2x1O = _readDS18_ow12(_FLPArray27618413, _FLPArray27618413[8]); } if (_sowb1_needScan) { if ( _oneWireSeach (_FLPArray27618413, _ow12)) { _sowb1_FLPArray27618413 = 1; } _ow12.reset_search(); _sowb1_needScan = 0; } if (_trgrt4) { if (! _sowb1_ost) { _sowb1_ost = 1; _sowb1_needScan = 1; _sowb1_FLPArray27618413 = 0; } } else { _sowb1_ost = 0; } _gtv11 = (_d18x2x1O); UB_142171746_ubi_125089190 = (analogRead (0)); UB_142171746_Instance1 = _func_UB_142171746(UB_142171746_Instance1, UB_142171746_ubi_125089190, 96, 250, 402, 635); _gtv3 = UB_142171746_Instance1.ubo_101667604; _gtv4 = UB_142171746_Instance1.ubo_51674151; _gtv5 = UB_142171746_Instance1.ubo_137412502; _gtv2 = UB_142171746_Instance1.ubo_174461762; _gtv1 = UB_142171746_Instance1.ubo_157422683; if (_gtv1) { if (_tim1I) { if (_isTimer(_tim1P, 2000)) { _tim1O = 1; } } else { _tim1I = 1; _tim1P = millis(); } } else { _tim1O = 0; _tim1I = 0; } if (_tim2O) _trgr2 = 0; if (_tim1O) _trgr2 = 1; if (_trgr2) { if (_trgrt3I) { _trgrt3 = 0; } else { _trgrt3 = 1; _trgrt3I = 1; } } else { _trgrt3 = 0; _trgrt3I = 0; }; if (_trgrt1) { _tim2O = 1; _tim2I = 1; } else { if (_tim2I) { _tim2I = 0; _tim2P = millis(); } else { if (_tim2O) { if ( _isTimer(_tim2P, 200)) _tim2O = 0; } } } if (!(_gtv1)) { if (_trgrt1I) { _trgrt1 = 0; } else { _trgrt1 = 1; _trgrt1I = 1; } } else { _trgrt1 = 0; _trgrt1I = 0; }; _gtv8 = _trgrt3; _gtv7 = ( (!(_trgr2)) && (_trgrt1) ); if (1) { if (_tim3I) { if (_isTimer(_tim3P, 200)) { _tim3O = 1; } } else { _tim3I = 1; _tim3P = millis(); } } else { _tim3O = 0; _tim3I = 0; } if (!(_gtv7)) { if (_trgrt2I) { _trgrt2 = 0; } else { _trgrt2 = 1; _trgrt2I = 1; } } else { _trgrt2 = 0; _trgrt2I = 0; }; if (( (_gtv9) && (_gtv8) )) _trgr1 = 0; if (( (_tim3O) && (_trgrt2) )) _trgr1 = 1; _gtv6 = _trgr1; if (_gtv6) { _tempVariable_bool = 1; if ( ! _MenuBlock_47814740_OEIS ) { _MenuBlock_47814740_OEIS = 1; _MainMenus[0].currentItem = _MenuItems[0]; } _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 10]); _MenuBlock_47814740_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); _MenuBlock_47814740_VNO = _menuOutputValueString (0); _MenuBlock_47814740_AMMO = (pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 5]) ) == 0; _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[0]).currentItem).startInArrayIndex) + 12]); if (_tempVariable_byte == 0 ) { _MenuBlock_47814740_ASO_1 = ""; } else { _MenuBlock_47814740_ASO_1 = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); } } else { _tempVariable_bool = 0; if (_MenuBlock_47814740_OEIS) { _MenuBlock_47814740_OEIS = 0; _menuUpdateToEEpromItems(); } _MenuBlock_47814740_AMMO = 0; _MenuBlock_47814740_ASO_1 = ""; _MenuBlock_47814740_MNO = ""; _MenuBlock_47814740_VNO = ""; } if (_gtv4) { if ( ! _MenuBlock_47814740_OMUIS) { _MenuBlock_47814740_OMUIS = 1; if (_tempVariable_bool) { _menuUpEvents(0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OMUIS = 0; } if (_gtv5) { if ( ! _MenuBlock_47814740_OMDIS) { _MenuBlock_47814740_OMDIS = 1; if (_tempVariable_bool) { _menuDownEvents(0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OMDIS = 0; } if (( (_gtv7) && (_gtv6) )) { if ( ! _MenuBlock_47814740_OEMIS) { _MenuBlock_47814740_OEMIS = 1; if (_tempVariable_bool) { _menuEnterTheMenuEvents (0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OEMIS = 0; } if (_gtv8) { if ( ! _MenuBlock_47814740_OExFMIS) { _MenuBlock_47814740_OExFMIS = 1; if (_tempVariable_bool) { _menuExitFromMenuEvents (0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OExFMIS = 0; } if (_gtv3) { if ( ! _MenuBlock_47814740_OVUIS) { _MenuBlock_47814740_OVUIS = 1; if (_tempVariable_bool) { _valueUpEvents(0); _MenuBlock_47814740_VUDST = millis(); } } if (_tempVariable_bool) { if (_MenuBlock_47814740_VUDSM == 0) { if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) { _MenuBlock_47814740_VUDSM = 1; _MenuBlock_47814740_VUDSPT = millis(); _MenuBlock_47814740_VUDPT = 500; } } else { if (_MenuBlock_47814740_VUDSM == 1) { if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) { _MenuBlock_47814740_VUDSM = 2; _MenuBlock_47814740_VUDPT = 200; } } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) { _valueUpEvents(0); _MenuBlock_47814740_VUDSPT = millis(); } } } } else { _MenuBlock_47814740_OVUIS = 0; if ( ! ( _gtv2)) { _MenuBlock_47814740_VUDSM = 0; } } if (_gtv2) { if ( ! _MenuBlock_47814740_OVDIS) { _MenuBlock_47814740_OVDIS = 1; if (_tempVariable_bool) { _valueDownEvents(0); _MenuBlock_47814740_VUDST = millis(); } } if (_tempVariable_bool) { if (_MenuBlock_47814740_VUDSM == 0) { if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) { _MenuBlock_47814740_VUDSM = 1; _MenuBlock_47814740_VUDSPT = millis(); _MenuBlock_47814740_VUDPT = 500; } } else { if (_MenuBlock_47814740_VUDSM == 1) { if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) { _MenuBlock_47814740_VUDSM = 2; _MenuBlock_47814740_VUDPT = 200; } } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) { _valueDownEvents(0); _MenuBlock_47814740_VUDSPT = millis(); } } } } else { _MenuBlock_47814740_OVDIS = 0; if ( ! ( _gtv3)) { _MenuBlock_47814740_VUDSM = 0; } } if (_gtv6) { _dispTempLength1 = ((_MenuBlock_47814740_MNO)).length(); if (_disp2oldLength > _dispTempLength1) { _isNeedClearDisp1 = 1; } _disp2oldLength = _dispTempLength1; _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 0); _lcd1.print((_MenuBlock_47814740_MNO)); } else { if (_disp2oldLength > 0) { _isNeedClearDisp1 = 1; _disp2oldLength = 0; } } if (_gtv6) { _dispTempLength1 = ((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))).length(); if (_disp1oldLength > _dispTempLength1) { _isNeedClearDisp1 = 1; } _disp1oldLength = _dispTempLength1; _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 1); _lcd1.print((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))); } else { if (_disp1oldLength > 0) { _isNeedClearDisp1 = 1; _disp1oldLength = 0; } } _gtv9 = _MenuBlock_47814740_AMMO; if ((_gtv11) > (Menu_Value_2_TVD)) _trgr3 = 0; if ((_gtv11) < (Menu_Value_1_TVD)) _trgr3 = 1; digitalWrite(2, !(_trgr3)); if (!(_gtv6)) { Menu_Value_1_TVD = _menuValueArray_int[1]; } _gtv10 = _trgr3; if (!(_gtv6)) { Menu_Value_2_TVD = _menuValueArray_int[3]; } if ((_gtv11) < (Menu_Value_4_TVD)) _trgr4 = 0; if ((_gtv11) > (Menu_Value_3_TVD)) _trgr4 = 1; if (!(_gtv6)) { Menu_Value_3_TVD = _menuValueArray_int[0]; } digitalWrite(3, !(_trgr4)); _gtv12 = _trgr4; if (!(_gtv6)) { Menu_Value_4_TVD = _menuValueArray_int[2]; } digitalWrite(11, ( (( (_gtv12) || (_gtv10) )) && ((_menuValueArray_bool[0])) )); if (_gtv10) { _swi1 = String("H - ON"); } else { _swi1 = String("H - OFF"); } if (_gtv12) { _swi2 = String("V - ON"); } else { _swi2 = String("V - OFF"); } if (!(_gtv6)) { _dispTempLength1 = ((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))).length(); if (_disp3oldLength > _dispTempLength1) { _isNeedClearDisp1 = 1; } _disp3oldLength = _dispTempLength1; _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 0); _lcd1.print((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))); } else { if (_disp3oldLength > 0) { _isNeedClearDisp1 = 1; _disp3oldLength = 0; } } if (!(_gtv6)) { _dispTempLength1 = ((((_swi1) + (String(" ")) + (_swi2)))).length(); if (_disp4oldLength > _dispTempLength1) { _isNeedClearDisp1 = 1; } _disp4oldLength = _dispTempLength1; _lcd1.setCursor(int((16 - _dispTempLength1) / 2), 1); _lcd1.print((((_swi1) + (String(" ")) + (_swi2)))); } else { if (_disp4oldLength > 0) { _isNeedClearDisp1 = 1; _disp4oldLength = 0; } } } String _floatToStringWitRaz(float value, int raz) { return String(value, raz); } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime >= startTime) { return (currentTime >= (startTime + period)); } else { return (currentTime >= (4294967295 - startTime + period)); } } void _menuUpEvents (byte menuIndex) { byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte parIndex = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); byte parentStartIndex; byte parentStopIndex; if (parIndex == 0) { parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex; } else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]); parentStopIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 4]); } if (tempIndex == parentStartIndex) { if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) { (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStopIndex - 1]; return; } else { return; } } (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex - 2]; return; } void _menuDownEvents (byte menuIndex) { byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); byte parentStartIndex; byte parentStopIndex; if (parIndex == 0) { parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex; } else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]); parentStopIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[parIndex - 1]).startInArrayIndex) + 4]); } if (tempIndex == parentStopIndex) { if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) { (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStartIndex - 1]; return; } else { return; } } (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex]; return; } void _valueUpEvents (byte menuIndex) { byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]); byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]); if (itemType == 3) { _menuValueArray_bool[valIndex - 1 ] = 1; return; } if (itemType == 4) { _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] + (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1])); } } void _valueDownEvents (byte menuIndex) { byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]); byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]); if (itemType == 3) { _menuValueArray_bool[valIndex - 1] = 0; return; } if (itemType == 4) { _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] - (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1])); } } void _menuEnterTheMenuEvents (byte menuIndex) { byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); if (!(itemType == 0)) { return; } byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte newIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[tempIndex - 1]).startInArrayIndex) + 3]); if (newIndex == 0) { return; } (_MainMenus[menuIndex]).currentItem = _MenuItems[newIndex - 1]; return; } void _menuExitFromMenuEvents (byte menuIndex) { byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); if (parIndex == 0) { return; } (_MainMenus[menuIndex]).currentItem = _MenuItems[parIndex - 1]; return; } String _menuOutputValueString (byte menuIndex) { byte itemType = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte valueStrIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 11]); if (itemType == 0) { if ( valueStrIndex == 0) { return ""; } else { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[valueStrIndex - 1]))); } } byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]); byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]); if ( valIndex == 0) { return ""; } byte convFormat = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 9]); if (itemType == 3) { return _convertBoolean(itemType, convFormat, valIndex, indexMax, indexMin); } if (itemType == 4) { return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin); } return ""; } void _menuUpdateToEEpromItems() { EEPROM.updateInt(2, (_menuValueArray_int[0])); EEPROM.updateBit(1, 0, (_menuValueArray_bool[0])); EEPROM.updateInt(4, (_menuValueArray_int[1])); EEPROM.updateInt(6, (_menuValueArray_int[2])); EEPROM.updateInt(8, (_menuValueArray_int[3])); } String _readStringFromProgmem (char *string) { String result = String(""); while (pgm_read_byte(string) != '\0') { result = result + char(pgm_read_byte(string)); string++; } return result; } String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin) { if (itemType == 4) { if (convFormat == 4) { return String((_menuValueArray_int[valIndex - 1 ]), DEC); } if (convFormat == 5) { return String((_menuValueArray_int[valIndex - 1]), HEX); } if (convFormat == 6) { return String((_menuValueArray_int[valIndex - 1]), BIN); } } } String _convertBoolean(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin) { if (convFormat == 1) { if (_menuValueArray_bool[valIndex - 1]) { return "1"; } else { return "0"; } } if (convFormat == 2) { if (_menuValueArray_bool[valIndex - 1]) { return "True"; } else { return "False"; } } if (convFormat == 3) { if (_menuValueArray_bool[valIndex - 1 ]) { return ""; } else { return ""; } } if (_menuValueArray_bool[valIndex - 1]) { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMax - 1]))); } else { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMin - 1]))); } } float _convertDS18x2xData(byte type_s, byte data[12]) { int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } return (float)raw / 16.0; } float _readDS18_ow12(byte addr[8], byte type_s) { byte data[12]; byte i; _ow12.reset(); _ow12.select(addr); _ow12.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = _ow12.read(); } _ow12.reset(); _ow12.select(addr); _ow12.write(0x44, 1); return _convertDS18x2xData(type_s, data); } bool _oneWireSeach (byte array[], OneWire ow ) { byte temp[8]; byte i; if ( !ow.search(temp)) { return false; } if (OneWire::crc8(temp, 7) != temp[7]) { return false; } switch (temp[0]) { case 0x10: array[8] = 1; break; case 0x28: array[8] = 0; break; case 0x22: array[8] = 0; break; default: return false; } for ( i = 0; i < 8; i++) { array[i] = temp[i]; } return true; } struct UB_142171746 _func_UB_142171746(struct UB_142171746 _ubInstans, int ubi_125089190, int ubpar_125440348, int ubpar_79146376, int ubpar_175158211, int ubpar_40719224) { bool ubo_101667604 = _ubInstans.ubo_101667604; bool ubo_51674151 = _ubInstans.ubo_51674151; bool ubo_137412502 = _ubInstans.ubo_137412502; bool ubo_174461762 = _ubInstans.ubo_174461762; bool ubo_157422683 = _ubInstans.ubo_157422683; int _gtv1 = _ubInstans._gtv1; int _gtv2 = _ubInstans._gtv2; int _gtv3 = _ubInstans._gtv3; int _gtv4 = _ubInstans._gtv4; int _gtv5 = _ubInstans._gtv5; bool _bounse1S = _ubInstans._bounse1S; bool _bounse1O = _ubInstans._bounse1O; unsigned long _bounse1P = _ubInstans._bounse1P; bool _bounse2S = _ubInstans._bounse2S; bool _bounse2O = _ubInstans._bounse2O; unsigned long _bounse2P = _ubInstans._bounse2P; bool _bounse3S = _ubInstans._bounse3S; bool _bounse3O = _ubInstans._bounse3O; unsigned long _bounse3P = _ubInstans._bounse3P; bool _bounse4S = _ubInstans._bounse4S; bool _bounse4O = _ubInstans._bounse4O; unsigned long _bounse4P = _ubInstans._bounse4P; bool _bounse5S = _ubInstans._bounse5S; bool _bounse5O = _ubInstans._bounse5O; unsigned long _bounse5P = _ubInstans._bounse5P; bool _bounceTmpD1 = (ubi_125089190) < (_gtv1); if (_bounse1S) { if (millis() >= (_bounse1P + 40)) { _bounse1O = _bounceTmpD1; _bounse1S = 0; } } else { if ( _bounceTmpD1 != _bounse1O ) { _bounse1S = 1; _bounse1P = millis(); } } bool _bounceTmpD2 = ( ((ubi_125089190) > (_gtv1)) && ((ubi_125089190) < (_gtv2)) ); if (_bounse2S) { if (millis() >= (_bounse2P + 40)) { _bounse2O = _bounceTmpD2; _bounse2S = 0; } } else { if ( _bounceTmpD2 != _bounse2O ) { _bounse2S = 1; _bounse2P = millis(); } } bool _bounceTmpD3 = ( ((ubi_125089190) > (_gtv2)) && ((ubi_125089190) < (_gtv3)) ); if (_bounse3S) { if (millis() >= (_bounse3P + 40)) { _bounse3O = _bounceTmpD3; _bounse3S = 0; } } else { if ( _bounceTmpD3 != _bounse3O ) { _bounse3S = 1; _bounse3P = millis(); } } bool _bounceTmpD4 = ( ((ubi_125089190) > (_gtv3)) && ((ubi_125089190) < (_gtv4)) ); if (_bounse4S) { if (millis() >= (_bounse4P + 40)) { _bounse4O = _bounceTmpD4; _bounse4S = 0; } } else { if ( _bounceTmpD4 != _bounse4O ) { _bounse4S = 1; _bounse4P = millis(); } } bool _bounceTmpD5 = ( ((ubi_125089190) > (_gtv4)) && ((ubi_125089190) < (_gtv5)) ); if (_bounse5S) { if (millis() >= (_bounse5P + 40)) { _bounse5O = _bounceTmpD5; _bounse5S = 0; } } else { if ( _bounceTmpD5 != _bounse5O ) { _bounse5S = 1; _bounse5P = millis(); } } _gtv1 = (ubpar_125440348) / (2); _gtv2 = (((ubpar_79146376) - (ubpar_125440348)) / (2)) + (ubpar_125440348); _gtv3 = (((ubpar_175158211) - (ubpar_79146376)) / (2)) + (ubpar_79146376); _gtv4 = (((ubpar_40719224) - (ubpar_175158211)) / (2)) + (ubpar_175158211); _gtv5 = (((1023) - (ubpar_40719224)) / (2)) + (ubpar_40719224); ubo_101667604 = _bounse1O; ubo_51674151 = _bounse2O; ubo_137412502 = _bounse3O; ubo_174461762 = _bounse4O; ubo_157422683 = _bounse5O; _ubInstans.ubo_101667604 = ubo_101667604; _ubInstans.ubo_51674151 = ubo_51674151; _ubInstans.ubo_137412502 = ubo_137412502; _ubInstans.ubo_174461762 = ubo_174461762; _ubInstans.ubo_157422683 = ubo_157422683; _ubInstans._gtv1 = _gtv1; _ubInstans._gtv2 = _gtv2; _ubInstans._gtv3 = _gtv3; _ubInstans._gtv4 = _gtv4; _ubInstans._gtv5 = _gtv5; _ubInstans._bounse1S = _bounse1S; _ubInstans._bounse1O = _bounse1O; _ubInstans._bounse1P = _bounse1P; _ubInstans._bounse2S = _bounse2S; _ubInstans._bounse2O = _bounse2O; _ubInstans._bounse2P = _bounse2P; _ubInstans._bounse3S = _bounse3S; _ubInstans._bounse3O = _bounse3O; _ubInstans._bounse3P = _bounse3P; _ubInstans._bounse4S = _bounse4S; _ubInstans._bounse4O = _bounse4O; _ubInstans._bounse4P = _bounse4P; _ubInstans._bounse5S = _bounse5S; _ubInstans._bounse5O = _bounse5O; _ubInstans._bounse5P = _bounse5P; return _ubInstans; } 

 #include <Wire.h> #include <EEPROMex.h> #include <OneWire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C _lcd2(0x27, 20, 4); int _dispTempLength2 = 0; boolean _isNeedClearDisp2; OneWire _ow12(12); byte _FLPArray27618413[9]; const byte _menuParametrsArray[] PROGMEM = {1, 5, 1, 0, 0, 0, 0, 0, 1, 4, 1, 0, 0, 2, 0, 0, 6, 7, 0, 0, 0, 0, 0, 9, 11, 0, 3, 0, 0, 8, 9, 0, 0, 0, 0, 0, 7, 11, 0, 4, 3, 1, 0, 0, 0, 12, 13, 1, 8, 4, 0, 0, 5, 5, 2, 0, 0, 0, 0, 0, 1, 4, 2, 0, 0, 6, 4, 4, 0, 0, 2, 0, 0, 1, 4, 8, 0, 10, 7, 4, 2, 0, 0, 2, 0, 0, 1, 4, 5, 0, 10, 8, 4, 3, 0, 0, 3, 0, 0, 1, 4, 6, 0, 10, 9, 4, 1, 0, 0, 3, 0, 0, 1, 4, 3, 0, 10}; bool _menuValueArray_bool[1]; const bool _menuConstantValuesArray_bool[] PROGMEM = {1}; int _menuValueArray_int[4]; const int _menuConstantValuesArray_int[] PROGMEM = {1}; long _menuValueArray_long[2]; const long _menuConstantValuesArray_long[] PROGMEM = {1}; const char _flprogMenuNameString1[] PROGMEM = "Enter Password"; const char _flprogMenuNameString2[] PROGMEM = "ChangePassword"; const char _flprogMenuNameString3[] PROGMEM = "Vent-Off"; const char _flprogMenuNameString4[] PROGMEM = "Sound"; const char _flprogMenuNameString5[] PROGMEM = "Heater-Off"; const char _flprogMenuNameString6[] PROGMEM = "Vent-On"; const char _flprogMenuNameString7[] PROGMEM = "Vent Setting"; const char _flprogMenuNameString8[] PROGMEM = "Heater-On"; const char _flprogMenuNameString9[] PROGMEM = "HeaterSetting"; const char _flprogMenuNameString10[] PROGMEM = "C"; const char _flprogMenuNameString11[] PROGMEM = "Enter to submenu"; const char _flprogMenuNameString12[] PROGMEM = "On"; const char _flprogMenuNameString13[] PROGMEM = "Off"; const char* const _flprogMenuStringsArray[] PROGMEM = { _flprogMenuNameString1, _flprogMenuNameString2, _flprogMenuNameString3, _flprogMenuNameString4, _flprogMenuNameString5, _flprogMenuNameString6, _flprogMenuNameString7, _flprogMenuNameString8, _flprogMenuNameString9, _flprogMenuNameString10, _flprogMenuNameString11, _flprogMenuNameString12, _flprogMenuNameString13}; struct _menuItemStricture { int startInArrayIndex; }; struct _menuMainStricture { String tempString; byte startIndex; byte stopIndex; bool isSwitchMenuAroundRing; _menuItemStricture currentItem; }; _menuItemStricture _MenuItems[9]; _menuMainStricture _MainMenus[2]; bool _gtv6; bool _gtv10 = 0; float _gtv11; bool _gtv12 = 0; bool _gtv1; bool _gtv2; bool _gtv3; bool _gtv4; bool _gtv5; bool _gtv13; bool _gtv14; bool _gtv15; bool _gtv16; bool _gtv17; bool _gtv18; bool _gtv19; bool _gtv20; bool _gtv21; bool _gtv22; bool _gtv23; bool _gtv7; bool _gtv8; bool _trgr4 = 0; int Menu_Value_1_TVD = 0; bool _trgrt2 = 0; bool _trgrt2I = 0; bool _trgt1 = 0; bool _trgt1I = 0; int _disp4oldLength = 0; String _MenuBlock_47814740_ASO_1; String _MenuBlock_47814740_MNO; String _MenuBlock_47814740_VNO; bool _MenuBlock_47814740_OEIS = 0; bool _MenuBlock_47814740_OMUIS = 0; bool _MenuBlock_47814740_OMDIS = 0; bool _MenuBlock_47814740_OEMIS = 0; bool _MenuBlock_47814740_OExFMIS = 0; bool _MenuBlock_47814740_OVUIS = 0; bool _MenuBlock_47814740_OVDIS = 0; unsigned long _MenuBlock_47814740_VUDST = 0UL; unsigned long _MenuBlock_47814740_VUDSPT = 0UL; byte _MenuBlock_47814740_VUDSM = 0; int _MenuBlock_47814740_VUDPT = 0; bool _MenuBlock_47814740_IDI_0 = 0; bool _MenuBlock_47814740_IDI_1 = 0; bool _MenuBlock_47814740_IDI_2 = 0; bool _MenuBlock_47814740_IDI_3 = 0; bool _MenuBlock_47814740_IDI_4 = 0; bool _MenuBlock_47814740_IDI_5 = 0; bool _MenuBlock_47814740_IDI_6 = 0; bool _MenuBlock_47814740_IDI_7 = 0; bool _MenuBlock_47814740_IDI_8 = 0; bool _MenuBlock_47814740_IDI_9 = 0; bool _MenuBlock_47814740MinusIOS = 0; bool _trgr1 = 0; bool _trgr3 = 0; bool _mkb1C1xP1 = 0; bool _mkb1C1xP2 = 0; bool _mkb1C1xP3 = 0; bool _mkb1C1xP4 = 0; bool _mkb1C2xP1 = 0; bool _mkb1C2xP2 = 0; bool _mkb1C2xP3 = 0; bool _mkb1C2xP4 = 0; bool _mkb1C3xP1 = 0; bool _mkb1C3xP2 = 0; bool _mkb1C3xP3 = 0; bool _mkb1C3xP4 = 0; bool _mkb1C4xP1 = 0; bool _mkb1C4xP2 = 0; bool _mkb1C4xP3 = 0; bool _mkb1C4xP4 = 0; bool _trgrt1 = 0; bool _trgrt1I = 0; int Menu_Value_4_TVD = 0; int _disp7oldLength = 0; String _swi2; int _disp2oldLength = 0; String _MenuBlock_360159546_MNO; String _MenuBlock_360159546_VNO; bool _MenuBlock_360159546_OEIS = 0; bool _MenuBlock_360159546_OMUIS = 0; bool _MenuBlock_360159546_OMDIS = 0; bool _MenuBlock_360159546_OVUIS = 0; bool _MenuBlock_360159546_OVDIS = 0; bool _MenuBlock_360159546_IDI_0 = 0; bool _MenuBlock_360159546_IDI_1 = 0; bool _MenuBlock_360159546_IDI_2 = 0; bool _MenuBlock_360159546_IDI_3 = 0; bool _MenuBlock_360159546_IDI_4 = 0; bool _MenuBlock_360159546_IDI_5 = 0; bool _MenuBlock_360159546_IDI_6 = 0; bool _MenuBlock_360159546_IDI_7 = 0; bool _MenuBlock_360159546_IDI_8 = 0; bool _MenuBlock_360159546_IDI_9 = 0; int Menu_Value_3_TVD = 0; int Menu_Value_2_TVD = 0; String _swi1; int _disp1oldLength = 0; int _disp3oldLength = 0; int _disp6oldLength = 0; unsigned long _d18x2x1Tti = 0UL; float _d18x2x1O = 0.00; int _disp5oldLength = 0; bool _sowb1_needScan = 0; bool _sowb1_ost = 0; bool _sowb1_FLPArray27618413 = 0; void setup() { if ((EEPROM.read(0)) != 99) { EEPROM.write(0, 99) ; EEPROM.updateInt(10, 40); EEPROM.updateBit(1, 0, 0); EEPROM.updateInt(6, 30); EEPROM.updateInt(12, 10); EEPROM.updateLong(2, 123456); EEPROM.updateInt(8, 25); } Wire.begin(); pinMode(16, OUTPUT); pinMode(15, OUTPUT); pinMode(17, OUTPUT); _lcd2.init(); _lcd2.backlight(); pinMode(6, INPUT); digitalWrite(6, HIGH); pinMode(7, INPUT); digitalWrite(7, HIGH); pinMode(8, INPUT); digitalWrite(8, HIGH); pinMode(9, INPUT); digitalWrite(9, HIGH); pinMode(2, OUTPUT); digitalWrite(2, HIGH); pinMode(3, OUTPUT); digitalWrite(3, HIGH); pinMode(4, OUTPUT); digitalWrite(4, HIGH); pinMode(5, OUTPUT); digitalWrite(5, HIGH); _MenuItems[0].startInArrayIndex = 0; _MenuItems[1].startInArrayIndex = 13; _MenuItems[2].startInArrayIndex = 26; _MenuItems[3].startInArrayIndex = 39; _MenuItems[4].startInArrayIndex = 52; _MenuItems[5].startInArrayIndex = 65; _MenuItems[6].startInArrayIndex = 78; _MenuItems[7].startInArrayIndex = 91; _MenuItems[8].startInArrayIndex = 104; _MainMenus[0].tempString = ""; _MainMenus[0].startIndex = 1; _MainMenus[0].isSwitchMenuAroundRing = 0; _MainMenus[0].stopIndex = 1; _MainMenus[0].currentItem = _MenuItems[0]; _MainMenus[1].tempString = ""; _MainMenus[1].startIndex = 2; _MainMenus[1].isSwitchMenuAroundRing = 1; _MainMenus[1].stopIndex = 5; _MainMenus[1].currentItem = _MenuItems[1]; _menuValueArray_long[1] = (EEPROM.readLong(2)); _menuValueArray_int[0] = (EEPROM.readInt(6)); _menuValueArray_bool[0] = (EEPROM.readBit(1, 0)); _menuValueArray_int[1] = (EEPROM.readInt(8)); _menuValueArray_int[2] = (EEPROM.readInt(10)); _menuValueArray_int[3] = (EEPROM.readInt(12)); } void loop() { bool _tempVariable_bool; byte _tempVariable_byte; if (_isNeedClearDisp2) { _lcd2.clear(); _isNeedClearDisp2 = 0; } if (1) { if (_trgrt2I) { _trgrt2 = 0; } else { _trgrt2 = 1; _trgrt2I = 1; } } else { _trgrt2 = 0; _trgrt2I = 0; }; if (_isTimer(_d18x2x1Tti, 1000)) { _d18x2x1Tti = millis(); _d18x2x1O = _readDS18_ow12(_FLPArray27618413, _FLPArray27618413[8]); } if (_sowb1_needScan) { if ( _oneWireSeach (_FLPArray27618413, _ow12)) { _sowb1_FLPArray27618413 = 1; } _ow12.reset_search(); _sowb1_needScan = 0; } if (_trgrt2) { if (! _sowb1_ost) { _sowb1_ost = 1; _sowb1_needScan = 1; _sowb1_FLPArray27618413 = 0; } } else { _sowb1_ost = 0; } _gtv11 = (_d18x2x1O); digitalWrite(2, 0); _mkb1C1xP1 = ! (digitalRead(6)); _mkb1C1xP2 = ! (digitalRead(7)); _mkb1C1xP3 = ! (digitalRead(8)); _mkb1C1xP4 = ! (digitalRead(9)); digitalWrite(2, 1); digitalWrite(3, 0); _mkb1C2xP1 = ! (digitalRead(6)); _mkb1C2xP2 = ! (digitalRead(7)); _mkb1C2xP3 = ! (digitalRead(8)); _mkb1C2xP4 = ! (digitalRead(9)); digitalWrite(3, 1); digitalWrite(4, 0); _mkb1C3xP1 = ! (digitalRead(6)); _mkb1C3xP2 = ! (digitalRead(7)); _mkb1C3xP3 = ! (digitalRead(8)); _mkb1C3xP4 = ! (digitalRead(9)); digitalWrite(4, 1); digitalWrite(5, 0); _mkb1C4xP1 = ! (digitalRead(6)); _mkb1C4xP2 = ! (digitalRead(7)); _mkb1C4xP3 = ! (digitalRead(8)); _mkb1C4xP4 = ! (digitalRead(9)); digitalWrite(5, 1); _gtv1 = _mkb1C1xP1; _gtv2 = _mkb1C1xP2; _gtv3 = _mkb1C1xP3; _gtv18 = _mkb1C1xP4; _gtv4 = _mkb1C2xP1; _gtv5 = _mkb1C2xP2; _gtv13 = _mkb1C2xP3; _gtv19 = _mkb1C2xP4; _gtv14 = _mkb1C3xP1; _gtv15 = _mkb1C3xP2; _gtv16 = _mkb1C3xP3; _gtv20 = _mkb1C3xP4; _gtv23 = _mkb1C4xP1; _gtv17 = _mkb1C4xP2; _gtv22 = _mkb1C4xP3; _gtv21 = _mkb1C4xP4; bool _tmp1 = _gtv23; if (_tmp1) { if (! _trgt1I) _trgt1 = ! _trgt1; } _trgt1I = _tmp1; _gtv6 = _trgt1; if (_gtv7) { _tempVariable_bool = 1; if ( ! _MenuBlock_360159546_OEIS ) { _MenuBlock_360159546_OEIS = 1; (_MainMenus[0]).tempString = ""; } _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex) + 10]); _MenuBlock_360159546_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); _MenuBlock_360159546_VNO = _menuOutputValueString (0); } else { _tempVariable_bool = 0; if (_MenuBlock_360159546_OEIS) { _MenuBlock_360159546_OEIS = 0; _menuUpdateToEEpromItems(); } _MenuBlock_360159546_MNO = ""; _MenuBlock_360159546_VNO = ""; } if (0) { if ( ! _MenuBlock_360159546_OMUIS) { _MenuBlock_360159546_OMUIS = 1; if (_tempVariable_bool) { _menuUpEvents(0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_360159546_OMUIS = 0; } if (0) { if ( ! _MenuBlock_360159546_OMDIS) { _MenuBlock_360159546_OMDIS = 1; if (_tempVariable_bool) { _menuDownEvents(0); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_360159546_OMDIS = 0; } if (0) { if ( ! _MenuBlock_360159546_OVUIS) { _MenuBlock_360159546_OVUIS = 1; if (_tempVariable_bool) { _valueUpEvents(0); } } } else { _MenuBlock_360159546_OVUIS = 0; } if (0) { if ( ! _MenuBlock_360159546_OVDIS) { _MenuBlock_360159546_OVDIS = 1; if (_tempVariable_bool) { _valueDownEvents(0); } } } else { _MenuBlock_360159546_OVDIS = 0; } if (_gtv17) { if ( ! _MenuBlock_360159546_IDI_0) { _MenuBlock_360159546_IDI_0 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '0'); } } } else { _MenuBlock_360159546_IDI_0 = 0; } if (_gtv1) { if ( ! _MenuBlock_360159546_IDI_1) { _MenuBlock_360159546_IDI_1 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '1'); } } } else { _MenuBlock_360159546_IDI_1 = 0; } if (_gtv2) { if ( ! _MenuBlock_360159546_IDI_2) { _MenuBlock_360159546_IDI_2 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '2'); } } } else { _MenuBlock_360159546_IDI_2 = 0; } if (_gtv3) { if ( ! _MenuBlock_360159546_IDI_3) { _MenuBlock_360159546_IDI_3 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '3'); } } } else { _MenuBlock_360159546_IDI_3 = 0; } if (_gtv4) { if ( ! _MenuBlock_360159546_IDI_4) { _MenuBlock_360159546_IDI_4 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '4'); } } } else { _MenuBlock_360159546_IDI_4 = 0; } if (_gtv5) { if ( ! _MenuBlock_360159546_IDI_5) { _MenuBlock_360159546_IDI_5 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '5'); } } } else { _MenuBlock_360159546_IDI_5 = 0; } if (_gtv13) { if ( ! _MenuBlock_360159546_IDI_6) { _MenuBlock_360159546_IDI_6 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '6'); } } } else { _MenuBlock_360159546_IDI_6 = 0; } if (_gtv14) { if ( ! _MenuBlock_360159546_IDI_7) { _MenuBlock_360159546_IDI_7 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '7'); } } } else { _MenuBlock_360159546_IDI_7 = 0; } if (_gtv15) { if ( ! _MenuBlock_360159546_IDI_8) { _MenuBlock_360159546_IDI_8 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '8'); } } } else { _MenuBlock_360159546_IDI_8 = 0; } if (_gtv16) { if ( ! _MenuBlock_360159546_IDI_9) { _MenuBlock_360159546_IDI_9 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(0, '9'); } } } else { _MenuBlock_360159546_IDI_9 = 0; } if (_gtv7) { _dispTempLength2 = ((_MenuBlock_360159546_MNO)).length(); if (_disp6oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp6oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0); _lcd2.print((_MenuBlock_360159546_MNO)); } else { if (_disp6oldLength > 0) { _isNeedClearDisp2 = 1; _disp6oldLength = 0; } } if (_gtv7) { _dispTempLength2 = ((_MenuBlock_360159546_VNO)).length(); if (_disp7oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp7oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1); _lcd2.print((_MenuBlock_360159546_VNO)); } else { if (_disp7oldLength > 0) { _isNeedClearDisp2 = 1; _disp7oldLength = 0; } } if (_trgrt1) _trgr1 = 0; if (((_menuValueArray_long[0])) == ((_menuValueArray_long[1]))) _trgr1 = 1; if (!(_gtv6)) { if (_trgrt1I) { _trgrt1 = 0; } else { _trgrt1 = 1; _trgrt1I = 1; } } else { _trgrt1 = 0; _trgrt1I = 0; }; _gtv7 = ( (_gtv6) && (!(_trgr1)) ); _gtv8 = ( (_trgr1) && (_gtv6) ); if (_trgrt1) { _menuValueArray_long[0] = 0L; } if (_gtv8) { _tempVariable_bool = 1; if ( ! _MenuBlock_47814740_OEIS ) { _MenuBlock_47814740_OEIS = 1; _MainMenus[1].currentItem = _MenuItems[1]; (_MainMenus[1]).tempString = ""; } _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[1].currentItem ).startInArrayIndex) + 10]); _MenuBlock_47814740_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); _MenuBlock_47814740_VNO = _menuOutputValueString (1); _tempVariable_byte = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[1]).currentItem).startInArrayIndex) + 12]); if (_tempVariable_byte == 0 ) { _MenuBlock_47814740_ASO_1 = ""; } else { _MenuBlock_47814740_ASO_1 = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1]))); } } else { _tempVariable_bool = 0; if (_MenuBlock_47814740_OEIS) { _MenuBlock_47814740_OEIS = 0; _menuUpdateToEEpromItems(); } _MenuBlock_47814740_ASO_1 = ""; _MenuBlock_47814740_MNO = ""; _MenuBlock_47814740_VNO = ""; } if (_gtv20) { if ( ! _MenuBlock_47814740_OMUIS) { _MenuBlock_47814740_OMUIS = 1; if (_tempVariable_bool) { _menuUpEvents(1); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OMUIS = 0; } if (_gtv21) { if ( ! _MenuBlock_47814740_OMDIS) { _MenuBlock_47814740_OMDIS = 1; if (_tempVariable_bool) { _menuDownEvents(1); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OMDIS = 0; } if (_gtv18) { if ( ! _MenuBlock_47814740_OEMIS) { _MenuBlock_47814740_OEMIS = 1; if (_tempVariable_bool) { _menuEnterTheMenuEvents (1); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OEMIS = 0; } if (_gtv19) { if ( ! _MenuBlock_47814740_OExFMIS) { _MenuBlock_47814740_OExFMIS = 1; if (_tempVariable_bool) { _menuExitFromMenuEvents (1); _menuUpdateToEEpromItems(); } } } else { _MenuBlock_47814740_OExFMIS = 0; } if (0) { if ( ! _MenuBlock_47814740_OVUIS) { _MenuBlock_47814740_OVUIS = 1; if (_tempVariable_bool) { _valueUpEvents(1); _MenuBlock_47814740_VUDST = millis(); } } if (_tempVariable_bool) { if (_MenuBlock_47814740_VUDSM == 0) { if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) { _MenuBlock_47814740_VUDSM = 1; _MenuBlock_47814740_VUDSPT = millis(); _MenuBlock_47814740_VUDPT = 500; } } else { if (_MenuBlock_47814740_VUDSM == 1) { if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) { _MenuBlock_47814740_VUDSM = 2; _MenuBlock_47814740_VUDPT = 200; } } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) { _valueUpEvents(1); _MenuBlock_47814740_VUDSPT = millis(); } } } } else { _MenuBlock_47814740_OVUIS = 0; if ( ! ( 0)) { _MenuBlock_47814740_VUDSM = 0; } } if (0) { if ( ! _MenuBlock_47814740_OVDIS) { _MenuBlock_47814740_OVDIS = 1; if (_tempVariable_bool) { _valueDownEvents(1); _MenuBlock_47814740_VUDST = millis(); } } if (_tempVariable_bool) { if (_MenuBlock_47814740_VUDSM == 0) { if (_isTimer(_MenuBlock_47814740_VUDST , 2000 )) { _MenuBlock_47814740_VUDSM = 1; _MenuBlock_47814740_VUDSPT = millis(); _MenuBlock_47814740_VUDPT = 500; } } else { if (_MenuBlock_47814740_VUDSM == 1) { if (_isTimer(_MenuBlock_47814740_VUDST , 4000 )) { _MenuBlock_47814740_VUDSM = 2; _MenuBlock_47814740_VUDPT = 200; } } if (_isTimer(_MenuBlock_47814740_VUDSPT , _MenuBlock_47814740_VUDPT )) { _valueDownEvents(1); _MenuBlock_47814740_VUDSPT = millis(); } } } } else { _MenuBlock_47814740_OVDIS = 0; if ( ! ( 0)) { _MenuBlock_47814740_VUDSM = 0; } } if (_gtv17) { if ( ! _MenuBlock_47814740_IDI_0) { _MenuBlock_47814740_IDI_0 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '0'); } } } else { _MenuBlock_47814740_IDI_0 = 0; } if (_gtv1) { if ( ! _MenuBlock_47814740_IDI_1) { _MenuBlock_47814740_IDI_1 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '1'); } } } else { _MenuBlock_47814740_IDI_1 = 0; } if (_gtv2) { if ( ! _MenuBlock_47814740_IDI_2) { _MenuBlock_47814740_IDI_2 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '2'); } } } else { _MenuBlock_47814740_IDI_2 = 0; } if (_gtv3) { if ( ! _MenuBlock_47814740_IDI_3) { _MenuBlock_47814740_IDI_3 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '3'); } } } else { _MenuBlock_47814740_IDI_3 = 0; } if (_gtv4) { if ( ! _MenuBlock_47814740_IDI_4) { _MenuBlock_47814740_IDI_4 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '4'); } } } else { _MenuBlock_47814740_IDI_4 = 0; } if (_gtv5) { if ( ! _MenuBlock_47814740_IDI_5) { _MenuBlock_47814740_IDI_5 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '5'); } } } else { _MenuBlock_47814740_IDI_5 = 0; } if (_gtv13) { if ( ! _MenuBlock_47814740_IDI_6) { _MenuBlock_47814740_IDI_6 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '6'); } } } else { _MenuBlock_47814740_IDI_6 = 0; } if (_gtv14) { if ( ! _MenuBlock_47814740_IDI_7) { _MenuBlock_47814740_IDI_7 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '7'); } } } else { _MenuBlock_47814740_IDI_7 = 0; } if (_gtv15) { if ( ! _MenuBlock_47814740_IDI_8) { _MenuBlock_47814740_IDI_8 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '8'); } } } else { _MenuBlock_47814740_IDI_8 = 0; } if (_gtv16) { if ( ! _MenuBlock_47814740_IDI_9) { _MenuBlock_47814740_IDI_9 = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '9'); } } } else { _MenuBlock_47814740_IDI_9 = 0; } if (_gtv22) { if ( ! _MenuBlock_47814740MinusIOS) { _MenuBlock_47814740MinusIOS = 1; if (_tempVariable_bool) { _menuDirectInputKeyPressEvents(1, '-' ); } } } else { _MenuBlock_47814740MinusIOS = 0; } if (_gtv8) { _dispTempLength2 = ((_MenuBlock_47814740_MNO)).length(); if (_disp2oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp2oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0); _lcd2.print((_MenuBlock_47814740_MNO)); } else { if (_disp2oldLength > 0) { _isNeedClearDisp2 = 1; _disp2oldLength = 0; } } if (_gtv8) { _dispTempLength2 = ((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))).length(); if (_disp1oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp1oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1); _lcd2.print((((_MenuBlock_47814740_VNO) + (String(" ")) + (_MenuBlock_47814740_ASO_1)))); } else { if (_disp1oldLength > 0) { _isNeedClearDisp2 = 1; _disp1oldLength = 0; } } if ((_gtv11) > (Menu_Value_2_TVD)) _trgr3 = 0; if ((_gtv11) < (Menu_Value_1_TVD)) _trgr3 = 1; digitalWrite(16, !(_trgr3)); if (!(_gtv6)) { Menu_Value_1_TVD = _menuValueArray_int[3]; } _gtv10 = _trgr3; if (!(_gtv6)) { Menu_Value_2_TVD = _menuValueArray_int[1]; } if ((_gtv11) < (Menu_Value_4_TVD)) _trgr4 = 0; if ((_gtv11) > (Menu_Value_3_TVD)) _trgr4 = 1; if (!(_gtv6)) { Menu_Value_3_TVD = _menuValueArray_int[2]; } digitalWrite(15, !(_trgr4)); _gtv12 = _trgr4; if (!(_gtv6)) { Menu_Value_4_TVD = _menuValueArray_int[0]; } digitalWrite(17, ( (( (_gtv12) || (_gtv10) )) && ((_menuValueArray_bool[0])) )); if (_gtv10) { _swi1 = String("Heater - ON"); } else { _swi1 = String("Heater - OFF"); } if (_gtv12) { _swi2 = String("Ventilation - ON"); } else { _swi2 = String("Ventilation - OFF"); } if (!(_gtv6)) { _dispTempLength2 = ((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))).length(); if (_disp3oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp3oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 0); _lcd2.print((((String("Temp - ")) + (( _floatToStringWitRaz(_gtv11, 2))) + (String(" C"))))); } else { if (_disp3oldLength > 0) { _isNeedClearDisp2 = 1; _disp3oldLength = 0; } } if (!(_gtv6)) { _dispTempLength2 = ((_swi1)).length(); if (_disp4oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp4oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 1); _lcd2.print((_swi1)); } else { if (_disp4oldLength > 0) { _isNeedClearDisp2 = 1; _disp4oldLength = 0; } } if (!(_gtv6)) { _dispTempLength2 = ((_swi2)).length(); if (_disp5oldLength > _dispTempLength2) { _isNeedClearDisp2 = 1; } _disp5oldLength = _dispTempLength2; _lcd2.setCursor(int((20 - _dispTempLength2) / 2), 2); _lcd2.print((_swi2)); } else { if (_disp5oldLength > 0) { _isNeedClearDisp2 = 1; _disp5oldLength = 0; } } } String _floatToStringWitRaz(float value, int raz) { return String(value, raz); } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime >= startTime) { return (currentTime >= (startTime + period)); } else { return (currentTime >= (4294967295 - startTime + period)); } } void _menuUpEvents (byte menuIndex) { (_MainMenus[menuIndex]).tempString = ""; byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte parIndex = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); byte parentStartIndex; byte parentStopIndex; if (parIndex == 0) { parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex; } else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]); parentStopIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 4]); } if (tempIndex == parentStartIndex) { if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) { (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStopIndex - 1]; return; } else { return; } } (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex - 2]; return; } void _menuDownEvents (byte menuIndex) { (_MainMenus[menuIndex]).tempString = ""; byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); byte parentStartIndex; byte parentStopIndex; if (parIndex == 0) { parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex; } else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex) + 3]); parentStopIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[parIndex - 1]).startInArrayIndex) + 4]); } if (tempIndex == parentStopIndex) { if ((_MainMenus[menuIndex]).isSwitchMenuAroundRing) { (_MainMenus[menuIndex]).currentItem = _MenuItems[parentStartIndex - 1]; return; } else { return; } } (_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex]; return; } void _valueUpEvents (byte menuIndex) { byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]); byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]); if (itemType == 3) { _menuValueArray_bool[valIndex - 1 ] = 1; return; } if (itemType == 4) { _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] + (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1])); } if (itemType == 5) { _menuValueArray_long[valIndex - 1] = _menuValueArray_long[valIndex - 1] + (pgm_read_dword(&_menuConstantValuesArray_long[indexStep - 1])); } } void _valueDownEvents (byte menuIndex) { byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]); byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 8]); if (itemType == 3) { _menuValueArray_bool[valIndex - 1] = 0; return; } if (itemType == 4) { _menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] - (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1])); } if (itemType == 5) { _menuValueArray_long[valIndex - 1] = _menuValueArray_long[valIndex - 1] - (pgm_read_dword(&_menuConstantValuesArray_long[indexStep - 1])); } } void _menuEnterTheMenuEvents (byte menuIndex) { byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); if (!(itemType == 0)) { return; } byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]); byte newIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[tempIndex - 1]).startInArrayIndex) + 3]); if (newIndex == 0) { return; } (_MainMenus[menuIndex]).tempString = ""; (_MainMenus[menuIndex]).currentItem = _MenuItems[newIndex - 1]; return; } void _menuExitFromMenuEvents (byte menuIndex) { byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 5]); if (parIndex == 0) { return; } (_MainMenus[menuIndex]).tempString = ""; (_MainMenus[menuIndex]).currentItem = _MenuItems[parIndex - 1]; return; } String _menuOutputValueString (byte menuIndex) { byte itemType = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); byte valueStrIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 11]); if (itemType == 0) { if ( valueStrIndex == 0) { return ""; } else { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[valueStrIndex - 1]))); } } byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 7]); byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 6]); if ( valIndex == 0) { return ""; } byte convFormat = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 9]); if (itemType == 3) { return _convertBoolean(itemType, convFormat, valIndex, indexMax, indexMin); } if (itemType == 4) { return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin); } if (itemType == 5) { return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin); } return ""; } void _menuDirectInputKeyPressEvents(byte menuIndex, char inputSymbol) { byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 2]); byte temp; if (valIndex == 0) { return; } byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex) + 1]); if (itemType == 7) { return; } if (itemType == 3) { (_MainMenus[menuIndex]).tempString = ""; } if (inputSymbol == '-') { temp = ((_MainMenus[menuIndex]).tempString).length() ; if (temp == 0) { (_MainMenus[menuIndex]).tempString = "-"; } else { if (((_MainMenus[menuIndex]).tempString).charAt(0) == '-') { (_MainMenus[menuIndex]).tempString = ((_MainMenus[menuIndex]).tempString).substring(1); } else { (_MainMenus[menuIndex]).tempString = "-" + (_MainMenus[menuIndex]).tempString; } } } else { (_MainMenus[menuIndex]).tempString = (_MainMenus[menuIndex]).tempString + inputSymbol; } if (itemType == 3) { _menuValueArray_bool[valIndex - 1] = ((((_MainMenus[menuIndex]).tempString )).toInt()); } if (itemType == 4) { _menuValueArray_int[valIndex - 1] = (((_MainMenus[menuIndex]).tempString )).toInt(); } if (itemType == 5) { _menuValueArray_long[valIndex - 1] = (((_MainMenus[menuIndex]).tempString ).toInt()); } } void _menuUpdateToEEpromItems() { EEPROM.updateLong(2, (_menuValueArray_long[1])); EEPROM.updateInt(6, (_menuValueArray_int[0])); EEPROM.updateBit(1, 0, (_menuValueArray_bool[0])); EEPROM.updateInt(8, (_menuValueArray_int[1])); EEPROM.updateInt(10, (_menuValueArray_int[2])); EEPROM.updateInt(12, (_menuValueArray_int[3])); } String _readStringFromProgmem (char *string) { String result = String(""); while (pgm_read_byte(string) != '\0') { result = result + char(pgm_read_byte(string)); string++; } return result; } String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin) { if (itemType == 4) { if (convFormat == 4) { return String((_menuValueArray_int[valIndex - 1 ]), DEC); } if (convFormat == 5) { return String((_menuValueArray_int[valIndex - 1]), HEX); } if (convFormat == 6) { return String((_menuValueArray_int[valIndex - 1]), BIN); } } if (itemType == 5) { if (convFormat == 4) { return String((_menuValueArray_long[valIndex - 1 ]), DEC); } if (convFormat == 5) { return String((_menuValueArray_long[valIndex - 1]), HEX); } if (convFormat == 6) { return String((_menuValueArray_long[valIndex - 1]), BIN); } } } String _convertBoolean(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin) { if (convFormat == 1) { if (_menuValueArray_bool[valIndex - 1]) { return "1"; } else { return "0"; } } if (convFormat == 2) { if (_menuValueArray_bool[valIndex - 1]) { return "True"; } else { return "False"; } } if (convFormat == 3) { if (_menuValueArray_bool[valIndex - 1 ]) { return ""; } else { return ""; } } if (_menuValueArray_bool[valIndex - 1]) { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMax - 1]))); } else { return _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[indexMin - 1]))); } } float _convertDS18x2xData(byte type_s, byte data[12]) { int16_t raw = (data[1] << 8) | data[0]; if (type_s) { raw = raw << 3; if (data[7] == 0x10) { raw = (raw & 0xFFF0) + 12 - data[6]; } } else { byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw & ~7; else if (cfg == 0x20) raw = raw & ~3; else if (cfg == 0x40) raw = raw & ~1; } return (float)raw / 16.0; } float _readDS18_ow12(byte addr[8], byte type_s) { byte data[12]; byte i; _ow12.reset(); _ow12.select(addr); _ow12.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = _ow12.read(); } _ow12.reset(); _ow12.select(addr); _ow12.write(0x44, 1); return _convertDS18x2xData(type_s, data); } bool _oneWireSeach (byte array[], OneWire ow ) { byte temp[8]; byte i; if ( !ow.search(temp)) { return false; } if (OneWire::crc8(temp, 7) != temp[7]) { return false; } switch (temp[0]) { case 0x10: array[8] = 1; break; case 0x28: array[8] = 0; break; case 0x22: array[8] = 0; break; default: return false; } for ( i = 0; i < 8; i++) { array[i] = temp[i]; } return true; } 




» LCD Keypad Shield
» LCD Keypad Shield
»
»

, , , — .

Source: https://habr.com/ru/post/399097/


All Articles