Алгоритм терморегулятора

Так это один в один как у автора вопроса в первом его варианте) …В плане “алгоритма”

Достаточно в setup() добавить код

if (Water_T < id05){TEN_Temp_FLAG = 1;};

и ваша единственная проблема будет решена )

Как говорится: “Кто последний тот и папа” :slight_smile:

Условие (Water_T < id05) в принципе не обязательно проверять в setup’e. Просто true или 1 в TEN_Temp_FLAG

Очень примитивная схема управления. Не учитывает расход (использование) горячей воды и тариф энергопотребления.

В случае, если температура уже выше или равна пороговой, получим ненужный кратковременный щелчок реле

Первое учитывается автоматом - при расходе воды ее температура начинает падать, а второе требует уже часового модуля ))

Ну на самом деле нет, если внимательно посмотреть мой код из 10 то нет, там все нормально в этом плане, в отличии от варианта из 17 моего сообщения. Вот там да, будет лишний “щелчок”

сначала вычисляется флаг, а потом принимается решение… никаких лишних “щелчков”
В прочем щелчок может и быть лишний при включении, но это уже будет зависеть от другого кода или аппаратной реализации устройства, но не от “правильного алгоритма” рассмотренного в этой теме.

Вот у меня он вычисляется, а у тебя просто выставляется в true :wink:

да, в сетапе…
но в основной логике первой строкой идет вычисление этого флага… с учетом предыдущего(выставленного в сетап или при объявлении переменной) его состояния, и между этими моментами реле не щелкает… ну если специально это не сделать)))

мой код из 10 можно на вовку закинуть и пробовать разные начальные значения Water_T (это конечно же для тех кто сомневается или кому просто интересно :slight_smile: )

И зачем такие сложности? )

это был код автора вопроса. А ниже моя “доработка”:

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) условие заменено на присвоение…

В прочем Евгений как обычно, и не специально, даже не нарочно)) “обидел” тс… и как он теперь сделает… переживаю прямо)))

Программисту не пристало выражаться неопределенно. Где здесь

?
Вот эта фраза и родила вопрос про сложности :wink:

Хватит уже придираться :wink: Но я отвечу, вдруг автор темы все же вернется))

Абсолютно без разницы! В данном конкретном случае
что так:
bool TEN_Temp_FLAG = true;

что так:

bool TEN_Temp_FLAG;

void setup() {
  .....
  TEN_Temp_FLAG = true;
}

Нет. Естественное остывание имеет иную интенсивность, нежели разбор нагретой воды и ее замена на холодную. В случае разбора - гистерезис побоку. Врубаем нагрев при первых признаках разбора. Часовой модуль нужен. Иначе покупаем готовый обычный накопительный нагреватель и не имеем моск общественности

Уверен, что вариантов решения намного более одного… Я никогда этим не занимался и не задумывался) Но по этой ветке появились конечно же мысли и на мой взгляд более верным решением оставить контроль по температуре но использовать несколько тэнов и гистерезисы с порогами у каждого свои. Например для поддержания достаточно одного тэна и 5 градусов разбег, но если сильно снизилась, включить еще один тэн, а если совсем сильно снизилась, то еще один… Но это не точно))))

Нагреватель все равно один и тот же, что так, что эдак мощность одна. При разборе воды нижний предел просто достигается быстрее))

Про часы согласен

Да без разницы, конечно. Но выражаться нужно определенно :wink:

1 лайк

одно мнение в пользу этого варианта защитано!

вариант в целом разумный, но возможен вариант, что Вы включили свое устройство и оно не знает что делать 5 или 10 минут…

в целом конечно вода будет греться. просто хотел посоветоваться с вами - как лучше. задача в целом типовая. наверняка есть общепринятые решения.

Интересное решение! Основано на свойствах датчика! +5 за смекалку! Но необходима возможность устанавливать гистерезис отдельно ив более широких рамках.

Я думал об этом.
У меня бойлер на 200 литров для нагрева горячей воды для дома. он имеет ТЭН и косвенный нагрев + рециркуляцию. те источников нагрева два и в программе будет возможность переключения между ними. + естественно я закладываю включение по таймеру и много других функций. Я бы конечно не имел себе так мозг, а купил бы девайс за 500 руб… но дело в том, что такие бойлеры идут пустыми в плане системы управления. Вот решил сделать самодельный. Но если делать, то решил сделать со всеми переделками. в тч и управлением через интернет.
те если использовать первый, предложенный мною вариант, то в блоке setup над осделать TEN_Temp_FLAG = 1;
при нажатии кнопки работы от электронагрева , так же TEN_Temp_FLAG = 1;
при нажатии кнопки другого режима работы - наоборот TEN_Temp_FLAG = 0;

дребезга реле не будет. Я намеренно использую переменную TEN_Temp_FLAG, а не сразу устанавливаю выход мк. после обработки всей программы в конце получаем текущее значение TEN_Temp_FLAG, а уже от его состояния устанавливаем состояние текущего выхода.

Не стал сразу писать про все нюансы, чтобы не забивать никому голову.

Я с ДВ, у нас ночь была :slight_smile:

Для бытовых целей точность регулирования не особо важна (всякие варианты с ПИД регулированием - в топку), но гистерезис нужен обязательно, тк без него можно как раз попасть на дребезг контактов при любом режиме работы (разбора воды).

Я так понял, что всем больше понравился первый вариант (без контроля перехода через нагрев) и от него пошли все варианты…

Что то я не догнал. А можно на пальцах, для особо одарённых?)

Как таковых тут и вариантов-то не было. Ты сам все написал в первом еще сообщении (т.е. в вопросе).

Просто ты “забыл” выставить флаг в начале программы…

Ну как бы не совсем понятно. Флаг все равно от значения температуры рассчитывается. И если его по нажатию кнопки переключить, то он все равно пере считается в коде… Ну это уже тонкости, думаю сам разберешься…
как вариант:

bool Ten_Mode = false;
......
TEN_Temp_FLAG = Ten_Mode && (Water_T < id05 && TEN_Temp_FLAG || Water_T <= (id05-5));