Не так давно познакомился с flprog, шикарная программа когда кстати. Пару бытовых проектов уже осилил, благодаря гайдам и видео из интернета, но оперяться пока рановато.
Прошу помочь советом куда смотреть или может нажать что бы все работало.
Собственно сама идея, устройство создает резонанс путем натягивания и "отпускания" трубки с помощью соленоидного магнита, использую твердотельное реле но сигнал не стабильный и таже невооружённым глазом видно что подача сигнала идет не ритмично. К тому же "ритм" сигнала меняется при переключения строк меню (что намекает на на ошибку которую не могу понять как решить). 2 рабочих параметра время импульса и интервал между импульсами (среднее значение 40мс импульс, 150мс интервал) В самой системе еще есть пару параметров но они работают исправно.
#include <Wire.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
LiquidCrystal_I2C _lcd2(0x27, 8, 2);
int _dispTempLength2=0;
boolean _isNeedClearDisp2;
byte _d18x2x1Addr[8]={0x28, 0x7, 0xF, 0xAA, 0x5C, 0x21, 0x1, 0xDD};
LiquidCrystal_I2C _lcd1(0x27, 16, 2);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
OneWire _ow12(12);
bool _FreeLog2_IArr[2];
bool _FreeLog2_Q1_StArr[] = {1, 1};
const int _menuParametrsArray[] PROGMEM = {1, 4, 1, 0, 0, 0, 0, 1, 1, 4, 2, 0, 2, 4, 2, 0, 0, 0, 0, 1, 1, 4, 3, 0, 3, 1, 1, 0, 0, 0, 0, 2, 1, 4, 1, 0, 4, 4, 5, 0, 0, 0, 0, 3, 1, 4, 7, 0, 5, 4, 4, 0, 0, 0, 0, 3, 1, 4, 6, 0, 6, 4, 3, 0, 0, 0, 0, 2, 1, 4, 5, 0, 7, 3, 1, 0, 0, 0, 8, 9, 1, 8, 4, 0};
unsigned long _menuValueArray_unsignedlong[1];
const unsigned long _menuConstantValuesArray_unsignedlong[] PROGMEM = {10000, 0};
bool _menuValueArray_bool[1];
const bool _menuConstantValuesArray_bool[] PROGMEM = {1, 0};
int _menuValueArray_int[5];
const int _menuConstantValuesArray_int[] PROGMEM = {1, 50, 0};
const char _flprogMenuNameString1[] PROGMEM = "Cycles";
const char _flprogMenuNameString2[] PROGMEM = "Impulse ";
const char _flprogMenuNameString3[] PROGMEM = "Pause";
const char _flprogMenuNameString4[] PROGMEM = "START";
const char _flprogMenuNameString5[] PROGMEM = "Em stop";
const char _flprogMenuNameString6[] PROGMEM = "Fun off ";
const char _flprogMenuNameString7[] PROGMEM = "Fun on";
const char _flprogMenuNameString8[] PROGMEM = "ON";
const char _flprogMenuNameString9[] PROGMEM = "OFF";
const char* const _flprogMenuStringsArray[] PROGMEM = { _flprogMenuNameString1, _flprogMenuNameString2, _flprogMenuNameString3, _flprogMenuNameString4, _flprogMenuNameString5, _flprogMenuNameString6, _flprogMenuNameString7, _flprogMenuNameString8, _flprogMenuNameString9};
struct _menuItemStricture
{
int startInArrayIndex;
}
;
struct _menuMainStricture
{
int startIndex;
int stopIndex;
bool isSwitchMenuAroundRing;
_menuItemStricture currentItem;
}
;
_menuItemStricture _MenuItems[7];
_menuMainStricture _MainMenus[1];
bool _changeNumber1_Out = 0;
unsigned long _changeNumber1_OLV;
bool _mkb1C1xP1 = 0;
bool _mkb1C1xP2 = 0;
bool _mkb1C1xP3 = 0;
bool _mkb1C1xP4 = 0;
int _disp1oldLength = 0;
int _disp4oldLength = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
int _disp5oldLength = 0;
bool _trgr1 = 0;
bool _FreeLog2_Q1 = 0;
bool _count1I = 0;
unsigned long _count1_Value = 0UL;
bool _count1MaxLO = 0;
bool _SEEPR1OSN = 0;
int _disp3oldLength = 0;
unsigned long _d18x2x1Tti = 0UL;
float _d18x2x1O = 0.00;
bool _swi1;
bool _trgs1 = 0;
String _MenuBlock_197478283_MNO;
String _MenuBlock_197478283_VNO;
bool _MenuBlock_197478283_OEIS = 0;
bool _MenuBlock_197478283_OMUIS = 0;
bool _MenuBlock_197478283_OMDIS = 0;
bool _MenuBlock_197478283_OVUIS = 0;
bool _MenuBlock_197478283_OVDIS = 0;
unsigned long _MenuBlock_197478283_VUDST = 0UL;
unsigned long _MenuBlock_197478283_VUDSPT = 0UL;
int _MenuBlock_197478283_VUDSM = 0;
int _MenuBlock_197478283_VUDPT = 0;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
bool _tempVariable_bool;
unsigned long _tempVariable_unsignedlong;
int _tempVariable_int;
float _tempVariable_float;
void setup()
{
pinMode(4, OUTPUT);
digitalWrite(4, 0);
pinMode(6, OUTPUT);
digitalWrite(6, 0);
Wire.begin();
delay(10);
if(((readByteFromEEPROM(0, 0, 0x0))) != 123)
{
(updateByteToEEPROM(0, 0, 0x0, (123)));
(updateBooleanToEEPROM(1, 0, 0x0, (0)));
(updateUnsignedLongToEEPROM(2, 0, 0x0, (100000)));
(updateIntegerToEEPROM(6, 0, 0x0, (40)));
(updateIntegerToEEPROM(8, 0, 0x0, (250)));
(updateIntegerToEEPROM(10, 0, 0x0, (50)));
(updateIntegerToEEPROM(12, 0, 0x0, (30)));
(updateIntegerToEEPROM(14, 0, 0x0, (40)));
}
_lcd2.init();
_lcd2.backlight();
_lcd1.init();
_lcd1.backlight();
pinMode(9, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(7, OUTPUT);
digitalWrite(7, HIGH);
_MenuItems[0].startInArrayIndex = 0;
_MenuItems[1].startInArrayIndex = 12;
_MenuItems[2].startInArrayIndex = 24;
_MenuItems[3].startInArrayIndex = 36;
_MenuItems[4].startInArrayIndex = 48;
_MenuItems[5].startInArrayIndex = 60;
_MenuItems[6].startInArrayIndex = 72;
_MainMenus[0].startIndex = 1;
_MainMenus[0].isSwitchMenuAroundRing = 1;
_MainMenus[0].stopIndex = 7;
_MainMenus[0].currentItem = _MenuItems[0];
_menuValueArray_unsignedlong[0] = (readUnsignedLongFromEEPROM(2, 0, 0x0));
_menuValueArray_int[0] = (readIntegerFromEEPROM(6, 0, 0x0));
_menuValueArray_int[1] = (readIntegerFromEEPROM(8, 0, 0x0));
_menuValueArray_bool[0] = (readBooleanFromEEPROM(1, 0, 0x0));
_menuValueArray_int[2] = (readIntegerFromEEPROM(10, 0, 0x0));
_menuValueArray_int[3] = (readIntegerFromEEPROM(12, 0, 0x0));
_menuValueArray_int[4] = (readIntegerFromEEPROM(14, 0, 0x0));
}
void loop()
{
if (_isNeedClearDisp2)
{
_lcd2.clear();
_isNeedClearDisp2= 0;
}
if (_isNeedClearDisp1)
{
_lcd1.clear();
_isNeedClearDisp1= 0;
}
//Плата:1
digitalWrite(7, 0);
_mkb1C1xP1 = ! (digitalRead(9));
_mkb1C1xP2 = ! (digitalRead(8));
_mkb1C1xP3 = ! (digitalRead(11));
_mkb1C1xP4 = ! (digitalRead(10));
digitalWrite(7, 1);
if(_isTimer(_d18x2x1Tti, 1000))
{
_d18x2x1Tti = millis();
_tempVariable_float = _readDS18_ow12(_d18x2x1Addr, 0);
if (_tempVariable_float < 500)
{
_d18x2x1O = _tempVariable_float;
}
}
if (1)
{
_dispTempLength2 = (((((String((int((_d18x2x1O))), DEC))) + (String("C"))))).length();
if (_disp1oldLength > _dispTempLength2)
{
_isNeedClearDisp2 = 1;
}
_disp1oldLength = _dispTempLength2;
_lcd2.setCursor(int((8 - _dispTempLength2)/2), 0);
_lcd2.print(((((String((int((_d18x2x1O))), DEC))) + (String("C")))));
}
else
{
if (_disp1oldLength > 0)
{
_isNeedClearDisp2 = 1;
_disp1oldLength = 0;
}
}
if(((_menuValueArray_int[3])) >= ((int((_d18x2x1O))))) _trgr1 = 0;
if(((_menuValueArray_int[4])) <= ((int((_d18x2x1O))))) _trgr1 = 1;
digitalWrite(6, _trgr1);
if((35) >= ((int((_d18x2x1O))))) _trgs1 = 1;
if(((_menuValueArray_int[2])) <= ((int((_d18x2x1O))))) _trgs1 = 0;
_FreeLog2_IArr[0] = _trgs1;
_FreeLog2_IArr[1] = (_menuValueArray_bool[0]);
_FreeLog2_Q1 = _checkFreeLogicBlockOutput(_FreeLog2_IArr, 2, _FreeLog2_Q1_StArr, 2);
if (_FreeLog2_Q1)
{
if (! _gen1I)
{
_gen1I = 1;
_gen1O = 1;
_gen1P = millis();
}
}
else
{
_gen1I = 0 ;
_gen1O= 0;
}
if (_gen1I)
{
if (_gen1O)
{
if (_isTimer(_gen1P , (_menuValueArray_int[0])))
{
_gen1P = millis();
_gen1O = 0;
}
}
else
{
if (_isTimer(_gen1P , (_menuValueArray_int[1])))
{
_gen1P = millis();
_gen1O = 1;
}
}
}
digitalWrite(4, _gen1O);
if (1)
{
if (_trgrt1I)
{
_trgrt1 = 0;
}
else
{
_trgrt1 = 1;
_trgrt1I = 1;
}
}
else
{
_trgrt1 = 0;
_trgrt1I = 0;
}
;
if (_trgrt1)
{
_count1_Value = (readUnsignedLongFromEEPROM(16, 0, 0x0));
}
else
{
if (((_mkb1C1xP1) && (_mkb1C1xP2)))
{
_count1_Value = 0;
}
else
{
if (_gen1O)
{
if (! _count1I)
{
_count1I = 1;
_count1_Value = _count1_Value + 1;
}
}
else
{
_count1I = 0;
}
}
}
_count1MaxLO = _count1_Value >= ((_menuValueArray_unsignedlong[0]));
if (1)
{
_dispTempLength2 = (((String(_count1_Value, DEC)))).length();
if (_disp5oldLength > _dispTempLength2)
{
_isNeedClearDisp2 = 1;
}
_disp5oldLength = _dispTempLength2;
_lcd2.setCursor(int((8 - _dispTempLength2)/2), 1);
_lcd2.print(((String(_count1_Value, DEC))));
}
else
{
if (_disp5oldLength > 0)
{
_isNeedClearDisp2 = 1;
_disp5oldLength = 0;
}
}
if (_changeNumber1_Out)
{
_changeNumber1_Out = 0;
}
else
{
_tempVariable_unsignedlong = _count1_Value;
if (_tempVariable_unsignedlong != _changeNumber1_OLV)
{
_changeNumber1_OLV = _tempVariable_unsignedlong;
_changeNumber1_Out = 1;
}
}
if(_changeNumber1_Out)
{
if(!_SEEPR1OSN)
{
(updateUnsignedLongToEEPROM(16, 0, 0x0, (_count1_Value)));
_SEEPR1OSN=1;
}
}
else
{
if(_SEEPR1OSN)
{
_SEEPR1OSN=0;
}
}
if(_count1MaxLO)
{
_swi1=0;
}
else
{
_swi1=(_menuValueArray_bool[0]);
}
_menuValueArray_bool[0] = _swi1;
(updateBooleanToEEPROM(1, 0, 0x0, ((_menuValueArray_bool[0]))));
if (1)
{
_tempVariable_bool = 1;
if (! _MenuBlock_197478283_OEIS)
{
_MenuBlock_197478283_OEIS = 1;
}
_tempVariable_int = pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem).startInArrayIndex)+10]);
_MenuBlock_197478283_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_int - 1])));
_MenuBlock_197478283_VNO = _menuOutputValueString (0);
}
else
{
_tempVariable_bool = 0;
if (_MenuBlock_197478283_OEIS)
{
_MenuBlock_197478283_OEIS = 0;
}
_MenuBlock_197478283_MNO = "";
_MenuBlock_197478283_VNO = "";
}
if(_mkb1C1xP3)
{
if (! _MenuBlock_197478283_OMUIS)
{
_MenuBlock_197478283_OMUIS = 1;
if(_tempVariable_bool)
{
_menuUpEvents(0);
}
}
}
else
{
_MenuBlock_197478283_OMUIS = 0;
}
if(_mkb1C1xP4)
{
if (! _MenuBlock_197478283_OMDIS)
{
_MenuBlock_197478283_OMDIS = 1;
if(_tempVariable_bool)
{
_menuDownEvents(0);
}
}
}
else
{
_MenuBlock_197478283_OMDIS = 0;
}
if(_mkb1C1xP1)
{
if (! _MenuBlock_197478283_OVUIS)
{
_MenuBlock_197478283_OVUIS = 1;
if(_tempVariable_bool)
{
_valueUpEvents(0);
_menuUpdateToEEpromItems();
_MenuBlock_197478283_VUDST = millis();
}
}
if (_tempVariable_bool)
{
if (_MenuBlock_197478283_VUDSM == 0)
{
if (_isTimer(_MenuBlock_197478283_VUDST , 500))
{
_MenuBlock_197478283_VUDSM = 1;
_MenuBlock_197478283_VUDSPT = millis();
_MenuBlock_197478283_VUDPT = 100;
}
}
else
{
if (_MenuBlock_197478283_VUDSM == 1)
{
if (_isTimer(_MenuBlock_197478283_VUDST , 1000))
{
_MenuBlock_197478283_VUDSM = 2;
_MenuBlock_197478283_VUDPT = 1;
}
}
if (_isTimer(_MenuBlock_197478283_VUDSPT , _MenuBlock_197478283_VUDPT))
{
_valueUpEvents(0);
_menuUpdateToEEpromItems();
_MenuBlock_197478283_VUDSPT = millis();
}
}
}
}
else
{
_MenuBlock_197478283_OVUIS = 0;
if(! (_mkb1C1xP2))
{
_MenuBlock_197478283_VUDSM = 0;
}
}
if(_mkb1C1xP2)
{
if (! _MenuBlock_197478283_OVDIS)
{
_MenuBlock_197478283_OVDIS = 1;
if(_tempVariable_bool)
{
_valueDownEvents(0);
_menuUpdateToEEpromItems();
_MenuBlock_197478283_VUDST = millis();
}
}
if (_tempVariable_bool)
{
if (_MenuBlock_197478283_VUDSM == 0)
{
if (_isTimer(_MenuBlock_197478283_VUDST , 500))
{
_MenuBlock_197478283_VUDSM = 1;
_MenuBlock_197478283_VUDSPT = millis();
_MenuBlock_197478283_VUDPT = 100;
}
}
else
{
if (_MenuBlock_197478283_VUDSM == 1)
{
if (_isTimer(_MenuBlock_197478283_VUDST , 1000))
{
_MenuBlock_197478283_VUDSM = 2;
_MenuBlock_197478283_VUDPT = 1;
}
}
if (_isTimer(_MenuBlock_197478283_VUDSPT , _MenuBlock_197478283_VUDPT))
{
_valueDownEvents(0);
_menuUpdateToEEpromItems();
_MenuBlock_197478283_VUDSPT = millis();
}
}
}
}
else
{
_MenuBlock_197478283_OVDIS = 0;
if(! (_mkb1C1xP1))
{
_MenuBlock_197478283_VUDSM = 0;
}
}
if(0)
{
if (_tempVariable_bool)
{
(_MainMenus[0]).currentItem = _MenuItems[2];
}
}
if (1)
{
_dispTempLength1 = ((_MenuBlock_197478283_VNO)).length();
if (_disp4oldLength > _dispTempLength1)
{
_isNeedClearDisp1 = 1;
}
_disp4oldLength = _dispTempLength1;
_lcd1.setCursor(9, 1);
_lcd1.print((_MenuBlock_197478283_VNO));
}
else
{
if (_disp4oldLength > 0)
{
_isNeedClearDisp1 = 1;
_disp4oldLength = 0;
}
}
if (1)
{
_dispTempLength1 = ((_MenuBlock_197478283_MNO)).length();
if (_disp3oldLength > _dispTempLength1)
{
_isNeedClearDisp1 = 1;
}
_disp3oldLength = _dispTempLength1;
_lcd1.setCursor(9, 0);
_lcd1.print((_MenuBlock_197478283_MNO));
}
else
{
if (_disp3oldLength > 0)
{
_isNeedClearDisp1 = 1;
_disp3oldLength = 0;
}
}
}
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));
}
}
String _readStringFromProgmem (char *string)
{
String result = String("");
while (pgm_read_byte(string)!='\0')
{
result=result+ char(pgm_read_byte(string));
string++;
}
return result;
}
void _menuUpEvents (int menuIndex)
{
int tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
int parIndex = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+5]);
int parentStartIndex;
int 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 (int menuIndex)
{
int tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
int parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+5]);
int parentStartIndex;
int 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 (int menuIndex)
{
int valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+2]);
int itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+1]);
int indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+6]);
int indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+8]);
if(itemType ==3)
{
_menuValueArray_bool[valIndex - 1 ] = 1;
return;
}
if (itemType == 1)
{
if (! indexMax == 0)
{
if (! (word(pgm_read_dword(&_menuConstantValuesArray_unsignedlong[indexMax -1])) > word(_menuValueArray_unsignedlong[valIndex -1])))
{
return;
}
}
_menuValueArray_unsignedlong[valIndex -1] = _menuValueArray_unsignedlong[valIndex -1] + (pgm_read_dword(&_menuConstantValuesArray_unsignedlong[indexStep -1]));
}
if (itemType == 4)
{
if (! indexMax == 0)
{
if (! (int(pgm_read_word(&_menuConstantValuesArray_int[indexMax -1])) > int(_menuValueArray_int[valIndex -1])))
{
return;
}
}
_menuValueArray_int[valIndex -1] = _menuValueArray_int[valIndex -1] + (pgm_read_word(&_menuConstantValuesArray_int[indexStep -1]));
}
}
void _valueDownEvents (int menuIndex)
{
int valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+2]);
int itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+1]);
int indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+7]);
int indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+8]);
if(itemType ==3)
{
_menuValueArray_bool[valIndex -1] = 0;
return;
}
if (itemType == 1)
{
if (! indexMin == 0)
{
if (! ((word(pgm_read_dword(&_menuConstantValuesArray_unsignedlong[indexMin - 1]))) < word(_menuValueArray_unsignedlong[valIndex - 1])))
{
return;
}
}
_menuValueArray_unsignedlong[valIndex - 1] = _menuValueArray_unsignedlong[valIndex - 1] - (pgm_read_dword(&_menuConstantValuesArray_unsignedlong[indexStep - 1]));
}
if (itemType == 4)
{
if (! indexMin == 0)
{
if (! ((int(pgm_read_word(&_menuConstantValuesArray_int[indexMin - 1]))) < int(_menuValueArray_int[valIndex - 1])))
{
return;
}
}
_menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] - (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1]));
}
}
String _menuOutputValueString (int menuIndex)
{
int itemType = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+1]);
int valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+2]);
int indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+7]);
int indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+6]);
if(valIndex == 0)
{
return "";
}
int convFormat = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+9]);
if(itemType == 1)
{
return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin);
}
if(itemType == 3)
{
return _convertBoolean(itemType, convFormat, valIndex, indexMax, indexMin);
}
if(itemType == 4)
{
return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin);
}
return "";
}
void _menuUpdateToEEpromItems()
{
(updateUnsignedLongToEEPROM(2, 0, 0x0, ((_menuValueArray_unsignedlong[0]))));
(updateIntegerToEEPROM(6, 0, 0x0, ((_menuValueArray_int[0]))));
(updateIntegerToEEPROM(8, 0, 0x0, ((_menuValueArray_int[1]))));
(updateBooleanToEEPROM(1, 0, 0x0, ((_menuValueArray_bool[0]))));
(updateIntegerToEEPROM(10, 0, 0x0, ((_menuValueArray_int[2]))));
(updateIntegerToEEPROM(12, 0, 0x0, ((_menuValueArray_int[3]))));
(updateIntegerToEEPROM(14, 0, 0x0, ((_menuValueArray_int[4]))));
}
String _convertNamber(int itemType, int convFormat, int valIndex, int indexMax, int indexMin)
{
if (itemType== 1)
{
if (convFormat == 4)
{
return String((_menuValueArray_unsignedlong[valIndex - 1 ]),DEC);
}
if (convFormat == 5)
{
return String((_menuValueArray_unsignedlong[valIndex - 1]),HEX);
}
if (convFormat == 6)
{
return String((_menuValueArray_unsignedlong[valIndex -1]),BIN);
}
}
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(int itemType, int convFormat, int valIndex, int indexMax, int 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 = _ow12.read();
}
_ow12.reset();
_ow12.select(addr);
_ow12.write(0x44);
if (_ow12.crc8(data, 8) != data[8])
{
return 501;
}
return _convertDS18x2xData(type_s, data);
}
bool _checkFreeLogicBlockOutput(bool inArray[], int inArraySize, bool stArray[], int stArraySize)
{
int inIndex = 0;
bool result = 1;
for (int i = 0; i < stArraySize; i = i + 1)
{
if (!(inArray[inIndex] == stArray))
{
result = 0;
}
inIndex ++;
if (inIndex == inArraySize)
{
if (result)
{
return 1;
}
else
{
result = 1;
}
inIndex = 0;
}
}
return 0;
}
byte readByteFromEEPROM(int addres, byte bitAddres, byte chipAddres)
{
return EEPROM.read(addres);
}
void updateByteToEEPROM(int addres, byte bitAddres, byte chipAddres, byte value)
{
return EEPROM.update(addres, value);
}
bool readBooleanFromEEPROM(int addres, byte bitAddres, byte chipAddres)
{
byte temp = readByteFromEEPROM(addres, bitAddres, chipAddres);
return bitRead(temp, bitAddres);
}
void updateBooleanToEEPROM(int addres, byte bitAddres, byte chipAddres, bool value)
{
byte temp = readByteFromEEPROM(addres, bitAddres, chipAddres);
bitWrite(temp, bitAddres, value);
updateByteToEEPROM(addres, bitAddres, chipAddres, temp);
}
int readIntegerFromEEPROM(int addres, byte bitAddres, byte chipAddres)
{
byte hight = readByteFromEEPROM(addres, bitAddres, chipAddres);
byte low = readByteFromEEPROM((addres+1), bitAddres, chipAddres);
return word(hight, low);
}
void updateIntegerToEEPROM(int addres, byte bitAddres, byte chipAddres, int value)
{
updateByteToEEPROM(addres, bitAddres, chipAddres, highByte(value));
updateByteToEEPROM((addres+1), bitAddres, chipAddres, lowByte(value));
}
unsigned long readUnsignedLongFromEEPROM(int addres, byte bitAddres, byte chipAddres)
{
byte x[4];
for(byte i = 0; i < 4; i++)
{
x = readByteFromEEPROM((addres+i), bitAddres, chipAddres);
}
unsigned long *y = (unsigned long *)&x;
return y[0];
}
void updateUnsignedLongToEEPROM(int addres, byte bitAddres, byte chipAddres, unsigned long value)
{
byte *x = (byte *)&value;
for(byte i = 0; i < 4; i++)
{
updateByteToEEPROM((addres+i), bitAddres, chipAddres, x);
}
}