Creating a menu using FLProg
- Tutorial
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:

LCD Keypad Shield:

Two relay units:

And active buzzer:

Here is a schematic diagram of the device

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 , this block can also be downloaded there.
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.
The tab - “Value control”
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 trailing edge at this input, the value at the output “freezes” until a high level appears at 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.

#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;
constbyte _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];
constbool _menuConstantValuesArray_bool[] PROGMEM = {1};
int _menuValueArray_int[4];
constint _menuConstantValuesArray_int[] PROGMEM = {1};
constchar _flprogMenuNameString1[] PROGMEM = "Vent-Off";
constchar _flprogMenuNameString2[] PROGMEM = "Vent-On";
constchar _flprogMenuNameString3[] PROGMEM = "Sound";
constchar _flprogMenuNameString4[] PROGMEM = "Heater-Off";
constchar _flprogMenuNameString5[] PROGMEM = "Heater-On";
constchar _flprogMenuNameString6[] PROGMEM = "HeaterSetting";
constchar _flprogMenuNameString7[] PROGMEM = "Vent Setting";
constchar _flprogMenuNameString8[] PROGMEM = "C";
constchar _flprogMenuNameString9[] PROGMEM = "Enter to submenu";
constchar _flprogMenuNameString10[] PROGMEM = "On";
constchar _flprogMenuNameString11[] PROGMEM = "Off";
constchar* 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;
voidsetup()
{
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));
}
voidloop()
{ 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(floatvalue, 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 step by step, but by simply entering numbers. In addition, it will allow you to enter the menu with a password. Changed project layout.

Consider the modified boards.

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

When you press the "*" button, the menu is activated. Only this time, not the main menu, but the menu for entering a password. Password

menu settings
This menu consists of one item used 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, 0 is written in the value of the entered password (preparation for the next entry)

The 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.
#include <Wire.h>#include <EEPROMex.h>#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C _lcd2(0x27, 20, 4);
int _dispTempLength2 = 0;
boolean _isNeedClearDisp2;
constbyte _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];
constbool _menuConstantValuesArray_bool[] PROGMEM = {1};
int _menuValueArray_int[4];
constint _menuConstantValuesArray_int[] PROGMEM = {1};
long _menuValueArray_long[2];
constlong _menuConstantValuesArray_long[] PROGMEM = {1};
constchar _flprogMenuNameString1[] PROGMEM = "Enter Password";
constchar _flprogMenuNameString2[] PROGMEM = "ChangePassword";
constchar _flprogMenuNameString3[] PROGMEM = "Sound";
constchar _flprogMenuNameString4[] PROGMEM = "Vent-Off";
constchar _flprogMenuNameString5[] PROGMEM = "Heater-On";
constchar _flprogMenuNameString6[] PROGMEM = "Vent Setting";
constchar _flprogMenuNameString7[] PROGMEM = "Vent-On";
constchar _flprogMenuNameString8[] PROGMEM = "HeaterSetting";
constchar _flprogMenuNameString9[] PROGMEM = "Heater-Off";
constchar _flprogMenuNameString10[] PROGMEM = "C";
constchar _flprogMenuNameString11[] PROGMEM = "Enter to submenu";
constchar _flprogMenuNameString12[] PROGMEM = "On";
constchar _flprogMenuNameString13[] PROGMEM = "Off";
constchar* 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;
voidsetup()
{
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));
}
voidloop()
{ 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(floatvalue, 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 address of the sensor. This allows you to replace, if necessary, the temperature sensor without flashing the controller.
Matrix keyboard layout
#include<EEPROMex.h># Read Next
IPO SpaceX record placement 2026 risk analysis
SpaceX goes public on June 11, 2026 with a valuation of $1.77 trillion. We analyze the perfect storm of overvaluation, market correction, and liquidity deficit. Is it worth buying?
Phishing on developers: certificates and risks
Learn how hackers deceive developers through Slack and fake certificates. Analysis of attacks, protection and consequences for Open Source. Read security tips right now.
How to Learn Programming for Beginners with No Experience in 90 Days
Learn programming for beginners with no experience using our proven 90-day roadmap. Build real projects, master Python, and launch your coding career. Start today.
Speech Recognition: 80% Accuracy Limit
Learn why speech recognition systems haven't exceeded 80% accuracy for 25 years. Semantics, grammar, and context as barriers. For developers: analysis of problems and solutions. Read the details.
DWH Sandboxes for AI: Isolation and Security
Learn how sandboxes solve AI hallucination problems in DWH. Task isolation, integration into Dev-Test-Prod pipeline. T-Bank practice and asapBI platform for developers.
Ticket Booking System Design
Architecture of a Ticketmaster-like system: API, CQRS, OCC, Elasticsearch. Scaling to 10M users, avoiding double booking. Study the design for senior interviews.
Moment Generating Function: formulas and properties
Study the moment generating function for computing moments of distributions. Taylor series expansion, properties for sums, example with exponential distribution. For developers and data science analysts.
CPUID Hack: Trojan in CPU-Z and HWMonitor
Hackers swapped downloads of popular utilities CPU-Z and HWMonitor on the CPUID website, distributing the STX RAT trojan. Learn the details of the attack, risks, and protection measures for your PC. Check your system now.
Data Science in manufacturing: digital thread and data analytics
How the digital thread and twins are transforming industry. Six Data Science use cases for reducing defects and predictive maintenance. Detailed analysis.
UK Sovereign AI: $1.5 Billion Plan and the Chip Battle
Analysis of the UK's plan to create sovereign AI hardware worth $1.5 billion. The role of AMD, startups Fractile, and the hidden battle for ARM. Read the details.
Recently Viewed