хочу чтобы это всё было единым целым в одном корпусе и управлялось одним контроллеромShurik2975, 10 Дек. 18, 07:46Здесь именно то, что ты хочешь.
Регулятор напряжения и тока на Arduino Pro Mini
Tomat7
Магистр
Черноморская губинния
236 138
Отв.860 10 Дек. 18, 12:02
saniaxxx
Кандидат наук
Кострома
421 63
![](https://cdn.homedistil.ru/th/1911/21/49809.314174.png)
Отв.861 10 Дек. 18, 12:21, через 19 мин
реализовать этот стабилизатор, регулятор в программе FLprog.Shurik2975, 10 Дек. 18, 07:46Ну тут код не совсем простой, я бы даже сказал что процессоро-зависимый, с FLprog не знаком, но думаю что не заработает. Если у меня будет время - попробую переписать под есп32
Shurik2975
Студент
Артёмовск
16 2
Отв.862 10 Дек. 18, 16:21
Здесь именно то, что ты хочешь.Tomat7, 10 Дек. 18, 12:02Спасибо конечно за ссылку но автоматика как я написал уже есть. И хотел бы по возможности допилить там стабилизатор но САМ с чьей нибудь помощью. А за тупо скопировать я уже писал.
Ну тут код не совсем простой, я бы даже сказал что процессоро-зависимыйsaniaxxx, 10 Дек. 18, 12:21А могли бы вы подробно описать сам процесс который происходит в контроллере (просто описание из первого поста я не понял, нет то что идут замеры и вычисляется среднеквадратичное понял а вот дальше отправил Serial порт принял из Serial порта.) Или может выделите кусочек скетча начиная от пина А0 или А1 на который приходит значение с ТР тока и до пина D2,D3 куда выходит на оптопару управления симистором и детектор нуля (с описанием). А я уже этот кусочек попробую как то может с помощью форума FLprog пристроить.
Если у меня будет время - попробую переписать под есп32saniaxxx, 10 Дек. 18, 12:21У меня Ардуино про мини. Или это вы не мне?
sebra
Куратор
Республика Коми
147 85
![](https://cdn.homedistil.ru/th/1601/01/28767.163889.jpg)
![](https://forum.homedistiller.ru/Themes/default/images/post/wireless.gif)
Shurik2975, вот здесь этот регулятор работает с автоматикой [Автоматика АВВИ]
Чтобы управлять регулятором достаточно послать в serial порт регулятора команду. На уровне стыковки двух arduino это делается довольно просто.
Чтобы управлять регулятором достаточно послать в serial порт регулятора команду. На уровне стыковки двух arduino это делается довольно просто.
saniaxxx
Кандидат наук
Кострома
421 63
![](https://cdn.homedistil.ru/th/1911/21/49809.314174.png)
Отв.864 10 Дек. 18, 16:46, через 7 мин
А могли бы вы подробно описать сам процесс который происходит в контроллереShurik2975, 10 Дек. 18, 16:21Я честно говоря еще сам не разбрался
У меня Ардуино про мини. Или это вы не мне?Shurik2975, 10 Дек. 18, 16:21Хочу переписать себе для esp32 чтоб управлять через wifi с моей автоматики, если 1-wire вариант не заработает
Добавлено через 18мин.:
хочу чтобы это всё было единым целым в одном корпусе и управлялось одним контроллером.Shurik2975, 10 Дек. 18, 07:46ИМХО, никогда не знаешь что потребуется в будущем, я наоборот преследую другие принципы:
1) The Single Responsibility Principle - каждое устройство отвечает за свои задачи.
2) The Dependency Inversion Principle - управляется все автоматикой через определенный абстрактный интерфейс, регуляторы насосы и тд его просто реализуют. Но сама автоматика не знает как там все работает внутри этих устройств
Tomat7
Магистр
Черноморская губинния
236 138
Отв.865 10 Дек. 18, 17:36, через 51 мин
А могли бы вы подробно описать сам процессShurik2975, 10 Дек. 18, 16:21https://habr.com/post/166427/ - здесь хоть в начале говорится про другой контроллер и детектор нуля не такой, но теория разжёвана хорошо.
http://cyber-place.ru/showthread.php?t=191 - а здесь хоть и в двух словах, но сказано всё что надо.
https://habr.com/post/147570/ - "научно", но может быть не понятно.
http://easyelectronics.ru/...nnogo-toka.html - как работает симистор. понятнее не бывает.
http://cxem.net/arduino/arduino71.php - конкретный прибор на том же принципе.
Про измерения тока/напряжения всё-таки порекомендую поискать здесь - наверняка есть много информации.
Shurik2975
Студент
Артёмовск
16 2
Отв.866 10 Дек. 18, 19:46
Shurik2975, вот здесь этот регулятор работает с автоматикой [Автоматика АВВИ]sebra, 10 Дек. 18, 16:40Не совсем ответ на мой вопрос но спасибо.
Про измерения тока/напряжения всё-таки порекомендую поискать сдесь - наверняка есть много информации.Tomat7, 10 Дек. 18, 17:36
Спасибо буду читать.
Добавлено через 38мин.:
- здесь хоть в начале говорится про другой контроллер и детектор нуля не такой, но теория разжёвана хорошо.Это просто фазорезка диммер который продают в любом магазине электроники только тот с переменным резистором а этот что вы дали ссылки умный на микроконтроллере.
- а здесь хоть и в двух словах, но сказано всё что надо.
- "научно", но может быть не понятно.
...nnogo-toka.html - как работает симистор. понятнее не бывает.
- конкретный прибор на том же принципе.
Про измерения тока/напряжения всё-таки порекомендую поискать сдесь - наверняка есть много информации.Tomat7, 10 Дек. 18, 17:36
с димером (фазорезка) с функцией разгона и затем с переходом на рабочую мощностьShurik2975, 10 Дек. 18, 07:46Я в своём первом посте написал что это у меня реализовано и регулируется от 0 до 100% ну или 220в и переходит после разгона колонны на рабочий режим (заданный из меню) но это не стабилизатор. Если в сети упало напряжение на 2в то и на димере упадёт, если поднялось то и на димере поднялось. А вот как объяснить ардуине что если на пин А0 пришло 4.7в (после маштабирования и вывода на дисплей 210в вместо выставленных 215в или 4.8в на пине А0 кпримеру) и нужно добавить импульсов на симистор чтобы поднять напряжение я не знаю (точнее пока не могу понять).
Добавлено через 2ч. 56мин.:
Кто понимает в коде скажите поправка которая выдаётся в вашем регуляторе для достижения заданного значения при колебании напряжения в сети вычисляется математически?
saniaxxx
Кандидат наук
Кострома
421 63
![](https://cdn.homedistil.ru/th/1911/21/49809.314174.png)
![](https://forum.homedistiller.ru/Themes/default/images/post/wireless.gif)
Там вычисляется момент открытия симистора. Я правильно понял что в вашей автоматике диммер работает по принципу ШИМ?
Shurik2975
Студент
Артёмовск
16 2
Отв.868 11 Дек. 18, 00:25, через 8 мин
Да
Добавлено через 49мин.:
Вот прилагаю то что у меня вышло в FLprog
![2018-12-10_233033.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308273.jpg)
2018-12-10_233033. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
Вот код что генерирует эта программа:
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
LiquidCrystal_I2C _lcd1(0x3F, 16, 2);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
//Плата:2
//Наименование:Диммер
_gtv10 = !((_gtv4) <= ((_menuValueArray_float[0])));
if(((byte(!((_gtv4) <= ((_menuValueArray_float[0])))))) == 0) {_mux1 = 255;}
if(((byte(!((_gtv4) <= ((_menuValueArray_float[0])))))) == 1) {_mux1 = (map(((_menuValueArray_int[0])), (0), (100), (0), (255)));}
if(((byte(_gtv18))) == 0) {_mux3 = 0;}
if(((byte(_gtv18))) == 1) {_mux3 = _mux1;}
analogWrite(3, _mux3);
if (_gtv16) {
_dispTempLength1 = ((((String("Dim vihod:")) + ((String((map((_mux1), (255), (0), (100), (0))), DEC))) + (String("%"))))).length();
if (_disp12oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;}
_disp12oldLength = _dispTempLength1;
_lcd1.setCursor(0, 0);
_lcd1.print((((String("Dim vihod:")) + ((String((map((_mux1), (255), (0), (100), (0))), DEC))) + (String("%")))));
} else {
if (_disp12oldLength > 0) {_isNeedClearDisp1 = 1; _disp12oldLength = 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 (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 ==6) {_menuValueArray_bool[valIndex - 1 ] = 1; return;}
if (itemType == 1) {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])); }
if (itemType == 7) {if (! indexMax == 0) { if ( ! (float(pgm_read_float(&_menuConstantValuesArray_float[indexMax -1])) > float(_menuValueArray_float[valIndex -1]))) {return;} }
_menuValueArray_float[valIndex -1] = _menuValueArray_float[valIndex -1] + (pgm_read_float(&_menuConstantValuesArray_float[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 ==6) {_menuValueArray_bool[valIndex -1] = 0; return;}
if (itemType == 1) { 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])); }
if (itemType == 7) { if (! indexMin == 0) { if ( ! ((float(pgm_read_float(&_menuConstantValuesArray_float[indexMin - 1]))) < float(_menuValueArray_float[valIndex - 1]))) {return;}}
_menuValueArray_float[valIndex - 1] = _menuValueArray_float[valIndex - 1] - (pgm_read_float(&_menuConstantValuesArray_float[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 "";}}
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 == 1) { return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin);}
if(itemType == 6) { return _convertBoolean(itemType, convFormat, valIndex, indexMax, indexMin);}
if(itemType == 7) { return _convertFloat(itemType, convFormat, valIndex, indexMax, indexMin);}
return "";
}
void _menuUpdateToEEpromItems()
{
(updateFloatToEEPROM(2, 0, 0x0, ((_menuValueArray_float[0]))));
(updateIntegerToEEPROM(6, 0, 0x0, ((_menuValueArray_int[0]))));
(updateFloatToEEPROM(8, 0, 0x0, ((_menuValueArray_float[1]))));
(updateFloatToEEPROM(12, 0, 0x0, ((_menuValueArray_float[2]))));
(updateFloatToEEPROM(16, 0, 0x0, ((_menuValueArray_float[3]))));
(updateBooleanToEEPROM(1, 0, 0x0, ((_menuValueArray_bool[1]))));
(updateFloatToEEPROM(20, 0, 0x0, ((_menuValueArray_float[4]))));
(updateFloatToEEPROM(24, 0, 0x0, ((_menuValueArray_float[5]))));
(updateIntegerToEEPROM(28, 0, 0x0, ((_menuValueArray_int[1]))));
}
String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
if (itemType== 1) {
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== 7) {
if (convFormat == 4) { return String((_menuValueArray_float[valIndex - 1 ]),DEC);}
if (convFormat == 5) { return String((_menuValueArray_float[valIndex - 1]),HEX);}
if (convFormat == 6) { return String((_menuValueArray_float[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])));}
}
String _convertFloat(byte itemType, byte convFormat, byte valIndex , byte indexMax, byte indexMin)
{
return String((_menuValueArray_float[valIndex -1]),convFormat);
}
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));
}
float readFloatFromEEPROM(int addres, byte bitAddres, byte chipAddres)
{
byte x[4];
for(byte i = 0; i < 4; i++) { x = readByteFromEEPROM( (addres+i), bitAddres, chipAddres);}
float *y = (float *)&x;
return y[0];
}
void updateFloatToEEPROM(int addres, byte bitAddres, byte chipAddres, float value)
{
byte *x = (byte *)&value;
for(byte i = 0; i < 4; i++) {updateByteToEEPROM( (addres+i), bitAddres, chipAddres, x);}
}
void _func_UB_170627742(struct UB_170627742 *_ubInstans, bool ubi_196853566, bool ubi_42610036, bool ubi_94809482, bool ubi_59920069, bool ubi_156084282, bool ubi_209574656)
{
bool ubo_141659291 = _ubInstans->ubo_141659291;
bool ubo_175878223 = _ubInstans->ubo_175878223;
bool ubo_63643089 = _ubInstans->ubo_63643089;
bool ubo_47926493 = _ubInstans->ubo_47926493;
bool ubo_84226534 = _ubInstans->ubo_84226534;
bool ubo_110753107 = _ubInstans->ubo_110753107;
bool ubo_181692694 = _ubInstans->ubo_181692694;
bool ubo_238335636 = _ubInstans->ubo_238335636;
bool _gtv1 = _ubInstans->_gtv1;
bool _gtv2 = _ubInstans->_gtv2;
int _gtv3 = _ubInstans->_gtv3;
bool _trgt1 = _ubInstans->_trgt1;
bool _trgt1I = _ubInstans->_trgt1I;
bool _trgrt1 = _ubInstans->_trgrt1;
bool _trgrt1I = _ubInstans->_trgrt1I;
bool _trgrt2 = _ubInstans->_trgrt2;
bool _trgrt2I = _ubInstans->_trgrt2I;
bool _gen1I = _ubInstans->_gen1I;
bool _gen1O = _ubInstans->_gen1O;
unsigned long _gen1P = _ubInstans->_gen1P;
bool _trgrt3 = _ubInstans->_trgrt3;
bool _trgrt3I = _ubInstans->_trgrt3I;
bool _trgrt4 = _ubInstans->_trgrt4;
bool _trgrt4I = _ubInstans->_trgrt4I;
bool _trgrt5 = _ubInstans->_trgrt5;
bool _trgrt5I = _ubInstans->_trgrt5I;
bool _tim1I = _ubInstans->_tim1I;
bool _tim1O = _ubInstans->_tim1O;
unsigned long _tim1P = _ubInstans->_tim1P;
bool _trgr1 = _ubInstans->_trgr1;
bool _count1I = _ubInstans->_count1I;
int _count1_Value = _ubInstans->_count1_Value;
if (!(ubi_196853566)) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;};
if (( ((_gtv3) > (0)) && ((_gtv3) <= (20)) )) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (ubi_196853566) { if (! _gen1I) { _gen1I = 1; _gen1O = 1; _gen1P = millis(); } } else { _gen1I = 0 ; _gen1O= 0;}
if (_gen1I) { if ( _isTimer ( _gen1P , 4 )) { _gen1P = millis(); _gen1O = ! _gen1O;}}
if ((_count1_Value) > (20)) { if (_trgrt4I) { _trgrt4 = 0;} else {_trgrt4 = 1; _trgrt4I = 1;} } else {_trgrt4 = 0; _trgrt4I = 0;};
if (!(_trgrt3)) { if (_trgrt5I) { _trgrt5 = 0;} else {_trgrt5 = 1; _trgrt5I = 1;} } else {_trgrt5 = 0; _trgrt5I = 0;};
if (!(0))
{ if (_tim1I) { if (_isTimer(_tim1P, 1000)) {_tim1O = 1;}} else {_tim1I =1; _tim1P = millis();}} else {_tim1O = 0; _tim1I = 0;}
if(( (ubi_59920069) && (_trgrt4) )) _trgr1 = 0;
if(( (_tim1O) && (_trgrt5) )) _trgr1 = 1;
if (( (_gtv1) && (_trgrt4) )) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;};
bool _tmp1 = ( (_trgrt1) || (( (( (_trgrt3) && (_trgr1) )) && (!(ubi_209574656)) )) );
if (_tmp1) { if (! _trgt1I) _trgt1 = ! _trgt1; }
_trgt1I = _tmp1;
_gtv2 = _trgrt2;
if (_trgrt2) {
_gtv3 = _count1_Value;
}
if (_trgrt3) {
_gtv3 = 0;
}
if (_gtv2){_count1_Value = 0;} else {
if (_gen1O){
if ( ! _count1I) {
_count1I = 1;
_count1_Value = _count1_Value + 1;
}} else {
_count1I = 0;}
}
ubo_141659291 = _trgr1;
ubo_110753107 = ( (_trgrt3) && (_trgr1) );
ubo_181692694 = _trgrt4;
ubo_175878223 = ( (ubi_42610036) && (!(( (_trgt1) && (ubi_156084282) ))) );
_gtv1 = _trgt1;
ubo_63643089 = ( (ubi_94809482) && (!(( (_trgt1) && (ubi_156084282) ))) );
ubo_84226534 = ( (ubi_42610036) && (( (_trgt1) && (ubi_156084282) )) );
ubo_47926493 = ( (ubi_94809482) && (( (_trgt1) && (ubi_156084282) )) );
ubo_238335636 = ( (_trgt1) && (ubi_156084282) );
_ubInstans->ubo_141659291 = ubo_141659291;
_ubInstans->ubo_175878223 = ubo_175878223;
_ubInstans->ubo_63643089 = ubo_63643089;
_ubInstans->ubo_47926493 = ubo_47926493;
_ubInstans->ubo_84226534 = ubo_84226534;
_ubInstans->ubo_110753107 = ubo_110753107;
_ubInstans->ubo_181692694 = ubo_181692694;
_ubInstans->ubo_238335636 = ubo_238335636;
_ubInstans->_gtv1 = _gtv1;
_ubInstans->_gtv2 = _gtv2;
_ubInstans->_gtv3 = _gtv3;
_ubInstans->_trgt1 = _trgt1;
_ubInstans->_trgt1I = _trgt1I;
_ubInstans->_trgrt1 = _trgrt1;
_ubInstans->_trgrt1I = _trgrt1I;
_ubInstans->_trgrt2 = _trgrt2;
_ubInstans->_trgrt2I = _trgrt2I;
_ubInstans->_gen1I = _gen1I;
_ubInstans->_gen1O = _gen1O;
_ubInstans->_gen1P = _gen1P;
_ubInstans->_trgrt3 = _trgrt3;
_ubInstans->_trgrt3I = _trgrt3I;
_ubInstans->_trgrt4 = _trgrt4;
_ubInstans->_trgrt4I = _trgrt4I;
_ubInstans->_trgrt5 = _trgrt5;
_ubInstans->_trgrt5I = _trgrt5I;
_ubInstans->_tim1I = _tim1I;
_ubInstans->_tim1O = _tim1O;
_ubInstans->_tim1P = _tim1P;
_ubInstans->_trgr1 = _trgr1;
_ubInstans->_count1I = _count1I;
_ubInstans->_count1_Value = _count1_Value;
}Вот после первого переключателя вставить код ваш для вычисления и поправки. В идеале создать пользовательский блок как тот же переключатель 1)вход заданное значение 2) вход текущее значение 3)выход на сам тиристор.
Вот типа этого по вычислению среднеквадратичного
![2018-12-11_000359.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308266.jpg)
2018-12-11_000359. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
![2018-12-11_000418.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308267.jpg)
2018-12-11_000418. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
![2018-12-11_000433.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308268.jpg)
2018-12-11_000433. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
![2018-12-11_000458.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308269.jpg)
2018-12-11_000458. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
![2018-12-11_000510.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308270.jpg)
2018-12-11_000510. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
![2018-12-11_000533.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308271.jpg)
2018-12-11_000533. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
![2018-12-11_000558.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308272.jpg)
2018-12-11_000558. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.
Добавлено через 49мин.:
Вот прилагаю то что у меня вышло в FLprog
![2018-12-10_233033.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308273.jpg)
Вот код что генерирует эта программа:
Скрытый текст
#include <Wire.h>#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
LiquidCrystal_I2C _lcd1(0x3F, 16, 2);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
//Плата:2
//Наименование:Диммер
_gtv10 = !((_gtv4) <= ((_menuValueArray_float[0])));
if(((byte(!((_gtv4) <= ((_menuValueArray_float[0])))))) == 0) {_mux1 = 255;}
if(((byte(!((_gtv4) <= ((_menuValueArray_float[0])))))) == 1) {_mux1 = (map(((_menuValueArray_int[0])), (0), (100), (0), (255)));}
if(((byte(_gtv18))) == 0) {_mux3 = 0;}
if(((byte(_gtv18))) == 1) {_mux3 = _mux1;}
analogWrite(3, _mux3);
if (_gtv16) {
_dispTempLength1 = ((((String("Dim vihod:")) + ((String((map((_mux1), (255), (0), (100), (0))), DEC))) + (String("%"))))).length();
if (_disp12oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;}
_disp12oldLength = _dispTempLength1;
_lcd1.setCursor(0, 0);
_lcd1.print((((String("Dim vihod:")) + ((String((map((_mux1), (255), (0), (100), (0))), DEC))) + (String("%")))));
} else {
if (_disp12oldLength > 0) {_isNeedClearDisp1 = 1; _disp12oldLength = 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 (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 ==6) {_menuValueArray_bool[valIndex - 1 ] = 1; return;}
if (itemType == 1) {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])); }
if (itemType == 7) {if (! indexMax == 0) { if ( ! (float(pgm_read_float(&_menuConstantValuesArray_float[indexMax -1])) > float(_menuValueArray_float[valIndex -1]))) {return;} }
_menuValueArray_float[valIndex -1] = _menuValueArray_float[valIndex -1] + (pgm_read_float(&_menuConstantValuesArray_float[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 ==6) {_menuValueArray_bool[valIndex -1] = 0; return;}
if (itemType == 1) { 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])); }
if (itemType == 7) { if (! indexMin == 0) { if ( ! ((float(pgm_read_float(&_menuConstantValuesArray_float[indexMin - 1]))) < float(_menuValueArray_float[valIndex - 1]))) {return;}}
_menuValueArray_float[valIndex - 1] = _menuValueArray_float[valIndex - 1] - (pgm_read_float(&_menuConstantValuesArray_float[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 "";}}
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 == 1) { return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin);}
if(itemType == 6) { return _convertBoolean(itemType, convFormat, valIndex, indexMax, indexMin);}
if(itemType == 7) { return _convertFloat(itemType, convFormat, valIndex, indexMax, indexMin);}
return "";
}
void _menuUpdateToEEpromItems()
{
(updateFloatToEEPROM(2, 0, 0x0, ((_menuValueArray_float[0]))));
(updateIntegerToEEPROM(6, 0, 0x0, ((_menuValueArray_int[0]))));
(updateFloatToEEPROM(8, 0, 0x0, ((_menuValueArray_float[1]))));
(updateFloatToEEPROM(12, 0, 0x0, ((_menuValueArray_float[2]))));
(updateFloatToEEPROM(16, 0, 0x0, ((_menuValueArray_float[3]))));
(updateBooleanToEEPROM(1, 0, 0x0, ((_menuValueArray_bool[1]))));
(updateFloatToEEPROM(20, 0, 0x0, ((_menuValueArray_float[4]))));
(updateFloatToEEPROM(24, 0, 0x0, ((_menuValueArray_float[5]))));
(updateIntegerToEEPROM(28, 0, 0x0, ((_menuValueArray_int[1]))));
}
String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
if (itemType== 1) {
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== 7) {
if (convFormat == 4) { return String((_menuValueArray_float[valIndex - 1 ]),DEC);}
if (convFormat == 5) { return String((_menuValueArray_float[valIndex - 1]),HEX);}
if (convFormat == 6) { return String((_menuValueArray_float[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])));}
}
String _convertFloat(byte itemType, byte convFormat, byte valIndex , byte indexMax, byte indexMin)
{
return String((_menuValueArray_float[valIndex -1]),convFormat);
}
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));
}
float readFloatFromEEPROM(int addres, byte bitAddres, byte chipAddres)
{
byte x[4];
for(byte i = 0; i < 4; i++) { x = readByteFromEEPROM( (addres+i), bitAddres, chipAddres);}
float *y = (float *)&x;
return y[0];
}
void updateFloatToEEPROM(int addres, byte bitAddres, byte chipAddres, float value)
{
byte *x = (byte *)&value;
for(byte i = 0; i < 4; i++) {updateByteToEEPROM( (addres+i), bitAddres, chipAddres, x);}
}
void _func_UB_170627742(struct UB_170627742 *_ubInstans, bool ubi_196853566, bool ubi_42610036, bool ubi_94809482, bool ubi_59920069, bool ubi_156084282, bool ubi_209574656)
{
bool ubo_141659291 = _ubInstans->ubo_141659291;
bool ubo_175878223 = _ubInstans->ubo_175878223;
bool ubo_63643089 = _ubInstans->ubo_63643089;
bool ubo_47926493 = _ubInstans->ubo_47926493;
bool ubo_84226534 = _ubInstans->ubo_84226534;
bool ubo_110753107 = _ubInstans->ubo_110753107;
bool ubo_181692694 = _ubInstans->ubo_181692694;
bool ubo_238335636 = _ubInstans->ubo_238335636;
bool _gtv1 = _ubInstans->_gtv1;
bool _gtv2 = _ubInstans->_gtv2;
int _gtv3 = _ubInstans->_gtv3;
bool _trgt1 = _ubInstans->_trgt1;
bool _trgt1I = _ubInstans->_trgt1I;
bool _trgrt1 = _ubInstans->_trgrt1;
bool _trgrt1I = _ubInstans->_trgrt1I;
bool _trgrt2 = _ubInstans->_trgrt2;
bool _trgrt2I = _ubInstans->_trgrt2I;
bool _gen1I = _ubInstans->_gen1I;
bool _gen1O = _ubInstans->_gen1O;
unsigned long _gen1P = _ubInstans->_gen1P;
bool _trgrt3 = _ubInstans->_trgrt3;
bool _trgrt3I = _ubInstans->_trgrt3I;
bool _trgrt4 = _ubInstans->_trgrt4;
bool _trgrt4I = _ubInstans->_trgrt4I;
bool _trgrt5 = _ubInstans->_trgrt5;
bool _trgrt5I = _ubInstans->_trgrt5I;
bool _tim1I = _ubInstans->_tim1I;
bool _tim1O = _ubInstans->_tim1O;
unsigned long _tim1P = _ubInstans->_tim1P;
bool _trgr1 = _ubInstans->_trgr1;
bool _count1I = _ubInstans->_count1I;
int _count1_Value = _ubInstans->_count1_Value;
if (!(ubi_196853566)) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;};
if (( ((_gtv3) > (0)) && ((_gtv3) <= (20)) )) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;};
if (ubi_196853566) { if (! _gen1I) { _gen1I = 1; _gen1O = 1; _gen1P = millis(); } } else { _gen1I = 0 ; _gen1O= 0;}
if (_gen1I) { if ( _isTimer ( _gen1P , 4 )) { _gen1P = millis(); _gen1O = ! _gen1O;}}
if ((_count1_Value) > (20)) { if (_trgrt4I) { _trgrt4 = 0;} else {_trgrt4 = 1; _trgrt4I = 1;} } else {_trgrt4 = 0; _trgrt4I = 0;};
if (!(_trgrt3)) { if (_trgrt5I) { _trgrt5 = 0;} else {_trgrt5 = 1; _trgrt5I = 1;} } else {_trgrt5 = 0; _trgrt5I = 0;};
if (!(0))
{ if (_tim1I) { if (_isTimer(_tim1P, 1000)) {_tim1O = 1;}} else {_tim1I =1; _tim1P = millis();}} else {_tim1O = 0; _tim1I = 0;}
if(( (ubi_59920069) && (_trgrt4) )) _trgr1 = 0;
if(( (_tim1O) && (_trgrt5) )) _trgr1 = 1;
if (( (_gtv1) && (_trgrt4) )) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;};
bool _tmp1 = ( (_trgrt1) || (( (( (_trgrt3) && (_trgr1) )) && (!(ubi_209574656)) )) );
if (_tmp1) { if (! _trgt1I) _trgt1 = ! _trgt1; }
_trgt1I = _tmp1;
_gtv2 = _trgrt2;
if (_trgrt2) {
_gtv3 = _count1_Value;
}
if (_trgrt3) {
_gtv3 = 0;
}
if (_gtv2){_count1_Value = 0;} else {
if (_gen1O){
if ( ! _count1I) {
_count1I = 1;
_count1_Value = _count1_Value + 1;
}} else {
_count1I = 0;}
}
ubo_141659291 = _trgr1;
ubo_110753107 = ( (_trgrt3) && (_trgr1) );
ubo_181692694 = _trgrt4;
ubo_175878223 = ( (ubi_42610036) && (!(( (_trgt1) && (ubi_156084282) ))) );
_gtv1 = _trgt1;
ubo_63643089 = ( (ubi_94809482) && (!(( (_trgt1) && (ubi_156084282) ))) );
ubo_84226534 = ( (ubi_42610036) && (( (_trgt1) && (ubi_156084282) )) );
ubo_47926493 = ( (ubi_94809482) && (( (_trgt1) && (ubi_156084282) )) );
ubo_238335636 = ( (_trgt1) && (ubi_156084282) );
_ubInstans->ubo_141659291 = ubo_141659291;
_ubInstans->ubo_175878223 = ubo_175878223;
_ubInstans->ubo_63643089 = ubo_63643089;
_ubInstans->ubo_47926493 = ubo_47926493;
_ubInstans->ubo_84226534 = ubo_84226534;
_ubInstans->ubo_110753107 = ubo_110753107;
_ubInstans->ubo_181692694 = ubo_181692694;
_ubInstans->ubo_238335636 = ubo_238335636;
_ubInstans->_gtv1 = _gtv1;
_ubInstans->_gtv2 = _gtv2;
_ubInstans->_gtv3 = _gtv3;
_ubInstans->_trgt1 = _trgt1;
_ubInstans->_trgt1I = _trgt1I;
_ubInstans->_trgrt1 = _trgrt1;
_ubInstans->_trgrt1I = _trgrt1I;
_ubInstans->_trgrt2 = _trgrt2;
_ubInstans->_trgrt2I = _trgrt2I;
_ubInstans->_gen1I = _gen1I;
_ubInstans->_gen1O = _gen1O;
_ubInstans->_gen1P = _gen1P;
_ubInstans->_trgrt3 = _trgrt3;
_ubInstans->_trgrt3I = _trgrt3I;
_ubInstans->_trgrt4 = _trgrt4;
_ubInstans->_trgrt4I = _trgrt4I;
_ubInstans->_trgrt5 = _trgrt5;
_ubInstans->_trgrt5I = _trgrt5I;
_ubInstans->_tim1I = _tim1I;
_ubInstans->_tim1O = _tim1O;
_ubInstans->_tim1P = _tim1P;
_ubInstans->_trgr1 = _trgr1;
_ubInstans->_count1I = _count1I;
_ubInstans->_count1_Value = _count1_Value;
}
Вот типа этого по вычислению среднеквадратичного
![2018-12-11_000359.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308266.jpg)
![2018-12-11_000418.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308267.jpg)
![2018-12-11_000433.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308268.jpg)
![2018-12-11_000458.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308269.jpg)
![2018-12-11_000510.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308270.jpg)
![2018-12-11_000533.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308271.jpg)
![2018-12-11_000558.jpg](https://cdn.homedistil.ru/th/1812/11/53228.308272.jpg)
sebra
Куратор
Республика Коми
147 85
![](https://cdn.homedistil.ru/th/1601/01/28767.163889.jpg)
Отв.869 11 Дек. 18, 07:26
Кто понимает в коде скажите поправка которая выдаётся в вашем регуляторе для достижения заданного значения при колебании напряжения в сети вычисляется математически?Shurik2975, 10 Дек. 18, 19:46
В данном регуляторе поправка не вычисляется а подбирается. То есть в результате измерения среднеквадратичного на выходе подбирается такой угол открытия симистора, чтобы напряжение на выходе соответствовало (в определенных пределах) установленному.
Shurik2975
Студент
Артёмовск
16 2
Отв.870 27 Дек. 18, 00:33
Скажите пожалуйста а зачем в сериал порт значение отправлять и принимать?
sebra
Куратор
Республика Коми
147 85
![](https://cdn.homedistil.ru/th/1601/01/28767.163889.jpg)
Отв.871 27 Дек. 18, 01:03, через 31 мин
Скажите пожалуйста а зачем в сериал порт значение отправлять и принимать?Shurik2975, 27 Дек. 18, 00:33
Для базовой версии это способ установки и передачи значений с/на другую ардуину/автоматику. Для версий с индикатором и кнопками он не нужен.
Shurik2975
Студент
Артёмовск
16 2
Отв.872 27 Дек. 18, 01:06, через 4 мин
Ага понял спасибо.
saniaxxx
Кандидат наук
Кострома
421 63
![](https://cdn.homedistil.ru/th/1911/21/49809.314174.png)
Отв.873 28 Дек. 18, 12:20
Кто может пояснить эту строчку
TCNT1 = 65535 - 200; //Импульс включения симистора 65536 - 1 - 4 мкс, 2 - 8 мкс, 3 - 12 мкс и тд
Как я понял, предделитель получается 64, частота на выходе 250000 Гц, тоесть все так - 200 срабатываний счетчика это 800мкс
Но откуда взялись цифры 200 и 2250? По идее тогда должно быть 250, 250 + 2250 = 2500 - как раз время полуволны
TCNT1 = 65535 - 200; //Импульс включения симистора 65536 - 1 - 4 мкс, 2 - 8 мкс, 3 - 12 мкс и тд
Как я понял, предделитель получается 64, частота на выходе 250000 Гц, тоесть все так - 200 срабатываний счетчика это 800мкс
Но откуда взялись цифры 200 и 2250? По идее тогда должно быть 250, 250 + 2250 = 2500 - как раз время полуволны
Shurik2975
Студент
Артёмовск
16 2
Отв.874 30 Дек. 18, 09:33
Помогите прикрутить индикатор TM1637 к прошивке например к этой U_regulator_free_7display_button. Этот есть в наличии валяется.
sebra
Куратор
Республика Коми
147 85
![](https://cdn.homedistil.ru/th/1601/01/28767.163889.jpg)
Отв.875 30 Дек. 18, 17:05
Кто может пояснить эту строчкуsaniaxxx, 28 Дек. 18, 12:20Вероятно автор строчки) Это время подачи напряжения на управляющую ногу симистора.
Но откуда взялись цифры 200 и 2250?saniaxxx, 28 Дек. 18, 12:20
200 подбирал для себя, можно задать любое, правда при малых значениях симистор может просто не открыться.
2250 это число задает максимальное значение счетчика, который запускается после прохождения напряжения через ноль. Сделано для ограничения минимального задаваемого напряжения. Были случаи, симистор не успевал закрыться к времени следующего прохождения через ноль, как итог - вспышки.
Shurik2975
Студент
Артёмовск
16 2
Отв.876 31 Дек. 18, 11:11
Надоело возиться с ФЛпрог решил просто повторить один из ваших вариантов приглянулся вот этот но когда залил увидел что символы на дисплее мигают примерно раз в секунду причем и на первом варианте из шапки тоже самое. Подскажите как это побороть?
sebra
Куратор
Республика Коми
147 85
![](https://cdn.homedistil.ru/th/1601/01/28767.163889.jpg)
![](https://forum.homedistiller.ru/Themes/default/images/post/wireless.gif)
символы на дисплее мигают примерно раз в секундуShurik2975, 31 Дек. 18, 11:11
А другой скетч, например любой тестовый, нормально работает на этом экране?
Shurik2975
Студент
Артёмовск
16 2
![](https://forum.homedistiller.ru/Themes/default/images/post/wireless.gif)
Да. Вот этот например [сообщение #13377512] работает нормально и из шапки те что для лсд нормально работают. Кроме этого первой версии, я писал.
sebra
Куратор
Республика Коми
147 85
![](https://cdn.homedistil.ru/th/1601/01/28767.163889.jpg)
![](https://forum.homedistiller.ru/Themes/default/images/post/wireless.gif)
Shurik2975, напиши автору в личку