Так это один в один как у автора вопроса в первом его варианте) …В плане “алгоритма”
Достаточно в setup() добавить код
if (Water_T < id05){TEN_Temp_FLAG = 1;};
и ваша единственная проблема будет решена )
Как говорится: “Кто последний тот и папа” ![]()
Условие (Water_T < id05) в принципе не обязательно проверять в setup’e. Просто true или 1 в TEN_Temp_FLAG
Очень примитивная схема управления. Не учитывает расход (использование) горячей воды и тариф энергопотребления.
В случае, если температура уже выше или равна пороговой, получим ненужный кратковременный щелчок реле
Первое учитывается автоматом - при расходе воды ее температура начинает падать, а второе требует уже часового модуля ))
Ну на самом деле нет, если внимательно посмотреть мой код из 10 то нет, там все нормально в этом плане, в отличии от варианта из 17 моего сообщения. Вот там да, будет лишний “щелчок”
сначала вычисляется флаг, а потом принимается решение… никаких лишних “щелчков”
В прочем щелчок может и быть лишний при включении, но это уже будет зависеть от другого кода или аппаратной реализации устройства, но не от “правильного алгоритма” рассмотренного в этой теме.
Вот у меня он вычисляется, а у тебя просто выставляется в true ![]()
да, в сетапе…
но в основной логике первой строкой идет вычисление этого флага… с учетом предыдущего(выставленного в сетап или при объявлении переменной) его состояния, и между этими моментами реле не щелкает… ну если специально это не сделать)))
мой код из 10 можно на вовку закинуть и пробовать разные начальные значения Water_T (это конечно же для тех кто сомневается или кому просто интересно
)
И зачем такие сложности? )
это был код автора вопроса. А ниже моя “доработка”:
bool TEN_Temp_FLAG = true;
.....
void loop () {
if (Water_T >= id05){TEN_Temp_FLAG = 0;}else{
if (Water_T <= (id05-5)){TEN_Temp_FLAG = 1;};
};
.....
}
В чем сложность? ))) Просто в моем случае (код из 10) условие заменено на присвоение…
В прочем Евгений как обычно, и не специально, даже не нарочно)) “обидел” тс… и как он теперь сделает… переживаю прямо)))
Программисту не пристало выражаться неопределенно. Где здесь
?
Вот эта фраза и родила вопрос про сложности ![]()
Хватит уже придираться
Но я отвечу, вдруг автор темы все же вернется))
Абсолютно без разницы! В данном конкретном случае
что так:
bool TEN_Temp_FLAG = true;
что так:
bool TEN_Temp_FLAG;
void setup() {
.....
TEN_Temp_FLAG = true;
}
Нет. Естественное остывание имеет иную интенсивность, нежели разбор нагретой воды и ее замена на холодную. В случае разбора - гистерезис побоку. Врубаем нагрев при первых признаках разбора. Часовой модуль нужен. Иначе покупаем готовый обычный накопительный нагреватель и не имеем моск общественности
Уверен, что вариантов решения намного более одного… Я никогда этим не занимался и не задумывался) Но по этой ветке появились конечно же мысли и на мой взгляд более верным решением оставить контроль по температуре но использовать несколько тэнов и гистерезисы с порогами у каждого свои. Например для поддержания достаточно одного тэна и 5 градусов разбег, но если сильно снизилась, включить еще один тэн, а если совсем сильно снизилась, то еще один… Но это не точно))))
Нагреватель все равно один и тот же, что так, что эдак мощность одна. При разборе воды нижний предел просто достигается быстрее))
Про часы согласен
Да без разницы, конечно. Но выражаться нужно определенно ![]()
одно мнение в пользу этого варианта защитано!
вариант в целом разумный, но возможен вариант, что Вы включили свое устройство и оно не знает что делать 5 или 10 минут…
в целом конечно вода будет греться. просто хотел посоветоваться с вами - как лучше. задача в целом типовая. наверняка есть общепринятые решения.
Интересное решение! Основано на свойствах датчика! +5 за смекалку! Но необходима возможность устанавливать гистерезис отдельно ив более широких рамках.
Я думал об этом.
У меня бойлер на 200 литров для нагрева горячей воды для дома. он имеет ТЭН и косвенный нагрев + рециркуляцию. те источников нагрева два и в программе будет возможность переключения между ними. + естественно я закладываю включение по таймеру и много других функций. Я бы конечно не имел себе так мозг, а купил бы девайс за 500 руб… но дело в том, что такие бойлеры идут пустыми в плане системы управления. Вот решил сделать самодельный. Но если делать, то решил сделать со всеми переделками. в тч и управлением через интернет.
те если использовать первый, предложенный мною вариант, то в блоке setup над осделать TEN_Temp_FLAG = 1;
при нажатии кнопки работы от электронагрева , так же TEN_Temp_FLAG = 1;
при нажатии кнопки другого режима работы - наоборот TEN_Temp_FLAG = 0;
дребезга реле не будет. Я намеренно использую переменную TEN_Temp_FLAG, а не сразу устанавливаю выход мк. после обработки всей программы в конце получаем текущее значение TEN_Temp_FLAG, а уже от его состояния устанавливаем состояние текущего выхода.
Не стал сразу писать про все нюансы, чтобы не забивать никому голову.
Я с ДВ, у нас ночь была ![]()
Для бытовых целей точность регулирования не особо важна (всякие варианты с ПИД регулированием - в топку), но гистерезис нужен обязательно, тк без него можно как раз попасть на дребезг контактов при любом режиме работы (разбора воды).
Я так понял, что всем больше понравился первый вариант (без контроля перехода через нагрев) и от него пошли все варианты…
Что то я не догнал. А можно на пальцах, для особо одарённых?)
Как таковых тут и вариантов-то не было. Ты сам все написал в первом еще сообщении (т.е. в вопросе).
Просто ты “забыл” выставить флаг в начале программы…
Ну как бы не совсем понятно. Флаг все равно от значения температуры рассчитывается. И если его по нажатию кнопки переключить, то он все равно пере считается в коде… Ну это уже тонкости, думаю сам разберешься…
как вариант:
bool Ten_Mode = false;
......
TEN_Temp_FLAG = Ten_Mode && (Water_T < id05 && TEN_Temp_FLAG || Water_T <= (id05-5));