Устройство качания, прошу помочь с кодом

Ответить
Newplayer
Рядовой
Сообщения: 4
Зарегистрирован: 02.06.2023{, 22:11}
Репутация: 0
Имя: Николай

Устройство качания, прошу помочь с кодом

#1

Сообщение Newplayer » 02.06.2023{, 22:37}

Здравствуйте!
Не так давно познакомился с 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);
}
}
Вложения
Генератор сигналов (упрощенный)v2.flp
(587.85 КБ) 18 скачиваний

WildCat
Лейтенант
Сообщения: 425
Зарегистрирован: 04.06.2022{, 04:14}
Репутация: 48
Имя: Михаил

Устройство качания, прошу помочь с кодом

#2

Сообщение WildCat » 03.06.2023{, 02:18}

Newplayer,
Есть электрическая и механическая схемы устройства?
Если секрет, то хотя бы часть схемы с исполнительным устройством (соленоид, трубка). По описанию не совсем понятно.

В электромагнитных реле время срабатывания порядка 0,05..0,3с. У Вас же время импульса 40 мс, что меньше времени гарантированного втягивания якоря соленоида. Опять же, многое зависит от параметров соленоида и схемы питания.
Программу не смотрел, но есть подозрения, что дело не в ней (но не исключено).

Отправлено спустя 32 минуты 3 секунды:
Это не что-то типа такого?


tema
Сержант
Сообщения: 187
Зарегистрирован: 21.09.2020{, 12:31}
Репутация: 7
Имя: tema

Устройство качания, прошу помочь с кодом

#3

Сообщение tema » 03.06.2023{, 07:31}

так и должно быть. тоормоза из за отработки действий с дисплеем.
попробуйте блоки для дисплея от ecoins.

Newplayer
Рядовой
Сообщения: 4
Зарегистрирован: 02.06.2023{, 22:11}
Репутация: 0
Имя: Николай

Устройство качания, прошу помочь с кодом

#4

Сообщение Newplayer » 03.06.2023{, 10:06}

WildCat писал(а):
03.06.2023{, 02:50}
Есть электрическая и механическая схемы устройства?
Если секрет, то хотя бы часть схемы с исполнительным устройством (соленоид, трубка). По описанию не совсем понятно.

В электромагнитных реле время срабатывания порядка 0,05..0,3с. У Вас же время импульса 40 мс, что меньше времени гарантированного втягивания якоря соленоида. Опять же, многое зависит от параметров соленоида и схемы питания.
Программу не смотрел, но есть подозрения, что дело не в ней (но не исключено).
Прикладываю примерную схему и тип реле. Трубка резонирует от работы электромагнитного соленоида, работает в раскачку по этому нет необходимости полного втягивания якоря.

Отправлено спустя 4 минуты 4 секунды:
tema писал(а):
03.06.2023{, 07:31}
так и должно быть. тоормоза из за отработки действий с дисплеем.
попробуйте блоки для дисплея от ecoins.
Благодарю, попробую другие блоки дисплея.
Вложения
Реле.jpeg
Примерная схема.jpg

Aleks21
Рядовой
Сообщения: 7
Зарегистрирован: 05.05.2021{, 07:26}
Репутация: 1
Откуда: Армавир
Имя: Алексей

Устройство качания, прошу помочь с кодом

#5

Сообщение Aleks21 » 03.06.2023{, 12:45}

tema писал(а):
03.06.2023{, 07:31}
тоормоза из за действий с дисплеем (в каждом цикле)
Отправка данных при их изменении
Вложения
Безымянный.jpg
Безымянный.jpg (9.3 КБ) 920 просмотров

Аватара пользователя
Phazz
Полковник
Сообщения: 2552
Зарегистрирован: 17.10.2016{, 15:38}
Репутация: 367
Откуда: Сургут
Имя: Анатолий

Устройство качания, прошу помочь с кодом

#6

Сообщение Phazz » 03.06.2023{, 13:51}

Aleks21, не поможет. Нужно отключать плату с дисплеем целиком

Аватара пользователя
Brama
Рядовой
Сообщения: 64
Зарегистрирован: 02.07.2020{, 14:27}
Репутация: 5
Откуда: Уфа
Имя: Сергей

Устройство качания, прошу помочь с кодом

#7

Сообщение Brama » 03.06.2023{, 14:14}

Электромагнит питается переменным током 50 Гц?

WildCat
Лейтенант
Сообщения: 425
Зарегистрирован: 04.06.2022{, 04:14}
Репутация: 48
Имя: Михаил

Устройство качания, прошу помочь с кодом

#8

Сообщение WildCat » 03.06.2023{, 16:32}

Посмотрел программу.
В такой реализации работать корректно не будет.

1. Используется штатный блок датчика Ds18b20 и дисплея. Они заметно вносят погрешности в тайминги программы. Нужно переходить на альтернативные. И желательно разносить функционально по платам: отдельно плата датчика, отдельно меню с дисплеем, отдельно логика. И использовать либо диспетчер задач, либо иное тактирование включения плат.

2. На переменном токе в данной схеме никак не получится выдержать точные моменты включения соленоида. Время паузы не кратно периоду сетевого напряжения, да и необходим контроль перехода через ноль. Иначе моменты включения, и соответственно параметры импульса и паузы на соленоиде будут гулять.
Либо применить питание соленоида постоянным током и коммутация транзистором. Тогда на контроллер не нужно заводить обратную связь. При питании постоянным током обязательно шунтирование диодом.

Newplayer
Рядовой
Сообщения: 4
Зарегистрирован: 02.06.2023{, 22:11}
Репутация: 0
Имя: Николай

Устройство качания, прошу помочь с кодом

#9

Сообщение Newplayer » 03.06.2023{, 21:32}

WildCat писал(а):
03.06.2023{, 16:32}
Посмотрел программу.
В такой реализации работать корректно не будет.

1. Используется штатный блок датчика Ds18b20 и дисплея. Они заметно вносят погрешности в тайминги программы. Нужно переходить на альтернативные. И желательно разносить функционально по платам: отдельно плата датчика, отдельно меню с дисплеем, отдельно логика. И использовать либо диспетчер задач, либо иное тактирование включения плат.

2. На переменном токе в данной схеме никак не получится выдержать точные моменты включения соленоида. Время паузы не кратно периоду сетевого напряжения, да и необходим контроль перехода через ноль. Иначе моменты включения, и соответственно параметры импульса и паузы на соленоиде будут гулять.
Либо применить питание соленоида постоянным током и коммутация транзистором. Тогда на контроллер не нужно заводить обратную связь. При питании постоянным током обязательно шунтирование диодом.
Благодарю за разбор! Буду переделывать, ушел искать альтернативы.
Brama писал(а):
03.06.2023{, 14:14}
Электромагнит питается переменным током 50 Гц?
Ток постоянный 220В 50гц

WildCat
Лейтенант
Сообщения: 425
Зарегистрирован: 04.06.2022{, 04:14}
Репутация: 48
Имя: Михаил

Устройство качания, прошу помочь с кодом

#10

Сообщение WildCat » 03.06.2023{, 21:49}

Newplayer писал(а):
03.06.2023{, 21:32}
постоянный 220В 50гц
Постоянный и 50 Гц противоречат друг другу ;)

Аватара пользователя
AlexCrane
Капитан
Сообщения: 895
Зарегистрирован: 20.10.2017{, 13:22}
Репутация: 294
Откуда: Ульяновск
Имя: Александр

Устройство качания, прошу помочь с кодом

#11

Сообщение AlexCrane » 04.06.2023{, 10:15}

WildCat писал(а):
03.06.2023{, 21:49}
Постоянный и 50 Гц противоречат друг другу ;)
Ну он же постоянно есть )))
Если не знаю, то не скажу. Если скажу, то сначала проверю...
Если нет возможности отблагодарить материально, хотя бы оцени пост....

Аватара пользователя
Brama
Рядовой
Сообщения: 64
Зарегистрирован: 02.07.2020{, 14:27}
Репутация: 5
Откуда: Уфа
Имя: Сергей

Устройство качания, прошу помочь с кодом

#12

Сообщение Brama » 05.06.2023{, 05:45}

WildCat писал(а):
03.06.2023{, 02:50}
Ну он же постоянно есть )))
Это если в числе первой категории электроснабжении и устройство оборудовано бесперебойником.

tema
Сержант
Сообщения: 187
Зарегистрирован: 21.09.2020{, 12:31}
Репутация: 7
Имя: tema

Устройство качания, прошу помочь с кодом

#13

Сообщение tema » 05.06.2023{, 07:16}

AlexCrane писал(а):
04.06.2023{, 10:15}
WildCat писал(а): ↑
03.06.2023{, 21:49}
Постоянный и 50 Гц противоречат друг другу ;)

Ну он же постоянно есть )))
хороший юмор

Newplayer
Рядовой
Сообщения: 4
Зарегистрирован: 02.06.2023{, 22:11}
Репутация: 0
Имя: Николай

Устройство качания, прошу помочь с кодом

#14

Сообщение Newplayer » 06.06.2023{, 10:46}

Поменял блоки дисплея на блоки, разнёс по платам.
viewtopic.php?f=72&t=6899&start=100
Процесс уже идет ровнее! Попробовал выключать меню через тт тригер, ситуацию это сильно не меняет.
Результаты колдовства во вложении.
WildCat писал(а):
03.06.2023{, 21:49}
Постоянный и 50 Гц противоречат друг другу ;)
Постоянный 220В
WildCat писал(а):
03.06.2023{, 16:32}
1. Используется штатный блок датчика Ds18b20 и дисплея. Они заметно вносят погрешности в тайминги программы. Нужно переходить на альтернативные. И желательно разносить функционально по платам: отдельно плата датчика, отдельно меню с дисплеем, отдельно логика. И использовать либо диспетчер задач, либо иное тактирование включения плат.
Не нашел альтернативу блоку датчика Ds18b20. Не могли бы Вы прислать ссылку на альтернативу блока датчика Ds18b20?
Вложения
Генератор сигналов (3 платы)v3.zip
(357.83 КБ) 12 скачиваний

WildCat
Лейтенант
Сообщения: 425
Зарегистрирован: 04.06.2022{, 04:14}
Репутация: 48
Имя: Михаил

Устройство качания, прошу помочь с кодом

#15

Сообщение WildCat » 06.06.2023{, 13:27}

Newplayer,
viewtopic.php?f=74&t=4442&hilit=Ds18b20

Есть блок датчика в пакете ecoins, там же есть и диспетчер задач, и блоки для дисплея hd44780.
Нужно добавить библиотеки ecoins и их блоки.
Эти блоки я пробовал, работают хорошо.

Ответить

Вернуться в «Помогите, а то я "нимагу"»