Форум самогонщиков Сайт Барахолка Магазин Помощь солдатам

Регулятор напряжения и тока на Arduino Pro Mini

Форум самогонщиков Автоматика
1 ... 41 42 43 44 45 46 47 ... 57 44
Tomat7 Магистр Черноморская губинния 235 138
Отв.860  10 Дек. 18, 12:02
хочу чтобы это всё было единым целым в одном корпусе и управлялось одним контроллеромShurik2975, 10 Дек. 18, 07:46
Здесь именно то, что ты хочешь.
saniaxxx Кандидат наук Кострома 421 63
Отв.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 Куратор Республика Коми 146 85
Отв.863  10 Дек. 18, 16:40, через 19 мин
Shurik2975, вот здесь этот регулятор работает с автоматикой [Автоматика АВВИ]

Чтобы управлять регулятором достаточно послать в serial порт регулятора команду. На уровне стыковки двух arduino это делается довольно просто.
saniaxxx Кандидат наук Кострома 421 63
Отв.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 Магистр Черноморская губинния 235 138
Отв.865  10 Дек. 18, 17:36, через 51 мин
А могли бы вы подробно описать сам процессShurik2975, 10 Дек. 18, 16:21
https://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
Отв.867  11 Дек. 18, 00:18
Там вычисляется момент открытия симистора. Я правильно понял что в вашей автоматике диммер работает по принципу ШИМ?
Shurik2975 Студент Артёмовск 16 2
Отв.868  11 Дек. 18, 00:25, через 8 мин
Да

Добавлено через 49мин.:

Вот прилагаю то что у меня вышло в FLprog
2018-12-10_233033.jpg
2018-12-10_233033. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.

Вот код что генерирует эта программа:
Скрытый текст#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;

}
Вот после первого переключателя вставить код ваш для вычисления и поправки. В идеале создать пользовательский блок как тот же переключатель 1)вход заданное значение 2) вход текущее значение 3)выход на сам тиристор.
Вот типа этого по вычислению среднеквадратичного

2018-12-11_000359.jpg
2018-12-11_000359. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.

2018-12-11_000418.jpg
2018-12-11_000418. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.

2018-12-11_000433.jpg
2018-12-11_000433. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.

2018-12-11_000458.jpg
2018-12-11_000458. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.

2018-12-11_000510.jpg
2018-12-11_000510. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.

2018-12-11_000533.jpg
2018-12-11_000533. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.

2018-12-11_000558.jpg
2018-12-11_000558. Регулятор напряжения и тока на Arduino Pro Mini. Автоматика.

sebra Куратор Республика Коми 146 85
Отв.869  11 Дек. 18, 07:26
Кто понимает в коде скажите поправка которая выдаётся в вашем регуляторе для достижения заданного значения при колебании напряжения в сети вычисляется математически?Shurik2975, 10 Дек. 18, 19:46

В данном регуляторе поправка не вычисляется а подбирается. То есть в результате измерения среднеквадратичного на выходе подбирается такой угол открытия симистора, чтобы напряжение на выходе соответствовало (в определенных пределах) установленному.
Shurik2975 Студент Артёмовск 16 2
Отв.870  27 Дек. 18, 00:33
Скажите пожалуйста а зачем в сериал порт значение отправлять и принимать?
sebra Куратор Республика Коми 146 85
Отв.871  27 Дек. 18, 01:03, через 31 мин
Скажите пожалуйста а зачем в сериал порт значение отправлять и принимать?Shurik2975, 27 Дек. 18, 00:33

Для базовой версии это способ установки и передачи значений с/на другую ардуину/автоматику. Для версий с индикатором и кнопками он не нужен.
Shurik2975 Студент Артёмовск 16 2
Отв.872  27 Дек. 18, 01:06, через 4 мин
Ага понял спасибо.
saniaxxx Кандидат наук Кострома 421 63
Отв.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 - как раз время полуволны
Shurik2975 Студент Артёмовск 16 2
Отв.874  30 Дек. 18, 09:33
Помогите прикрутить индикатор TM1637 к прошивке например к этой U_regulator_free_7display_button. Этот есть в наличии валяется.
sebra Куратор Республика Коми 146 85
Отв.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 Куратор Республика Коми 146 85
Отв.877  31 Дек. 18, 11:25, через 14 мин
символы на дисплее мигают примерно раз в секундуShurik2975, 31 Дек. 18, 11:11

А другой скетч, например любой тестовый, нормально работает на этом экране?
Shurik2975 Студент Артёмовск 16 2
Отв.878  31 Дек. 18, 12:16, через 52 мин
Да. Вот этот например [сообщение #13377512] работает нормально и из шапки те что для лсд нормально работают. Кроме этого первой версии, я писал.
sebra Куратор Республика Коми 146 85
Отв.879  31 Дек. 18, 12:37, через 22 мин
Shurik2975, напиши автору в личку