Включение вытяжки по времени и влажности
- Войдите на сайт для отправки комментариев
Всем привет.
Уже несколько часов пытаюсь решить проблемы и не могу понять, в чем ее причина.
Смысл в следующем.
Необходимо включать вытяжку по двум временным периодам (vent1on - включение1, vent1off - выключение1, vent2on - включение2, vent2off - выключение2) на некоторое время (2 часа). Также в период vent1on-vent2off необходимо включать вытяжку при достижении определенного значения влажности (humVentOn), и выключать ее при понижении до определенного значения (humVentOff).
Код следующий:
if ((daystamp > vent1on && daystamp < vent2off && Hum > humVentOn) || (daystamp > vent2on && daystamp < vent2off) || (daystamp > vent1on && daystamp < vent1off)) { pinMode(Relay1, OUTPUT); digitalWrite(Relay1, HIGH); } else if ((daystamp > vent2off) || (daystamp > vent1off && daystamp < vent2on) || (Hum < humVentOff)) { digitalWrite(Relay1, LOW); }
Где:
daystamp - текущее время.
Hum - влажность с датчика.
Так вот, смысл в том, что если удалить условие (daystamp > vent1off && daystamp < vent2on) из else if, то все работает корректно. Вытяжку включается и выключается по второму временному периоду, включается по первому временному периоду, а также при достижении определенного значения влажности (humVentOn) и выключается при понижении значения влажности до указанного (humVentOff).
Но если добавить (daystamp > vent1off && daystamp < vent2on), то процесс работает некорректно. При повышении влажности (humVentOn) вытяжка включается и выключается при достижении значения humVentOn, а не при значении humVentOff.
В чем может быть проблема.
Подскажи, пожалуйста :)
ну так вы правильноt решение нашли - выкиньте все условия из else, не нужны они там. У вас логика простая - в части if перечислены все условия, при которых вытяжка включена. иначе - выключена.
и строчка 3 не на месте, в условии ей делать нечего. вынесите ее в setup()
ну так вы правильноt решение нашли - выкиньте все условия из else, не нужны они там. У вас логика простая - в части if перечислены все условия, при которых вытяжка включена. иначе - выключена.
и строчка 3 не на месте, в условии ей делать нечего. вынесите ее в setup()
Спасибо за помощь.
Но будет ли корректно работать условие по достижению определенного уровня влажности.
Т.е. в if указано включение по Hum > HumVentOn.
А в else if указано выключение при понижении уровня влажности до значения HumVentOff.
Или подразумевалось в else if оставить только условие Hum < HumVentOff?
Но будет ли корректно работать условие по достижению определенного уровня влажности.
Т.е. в if указано включение по Hum > HumVentOn.
А в else if указано выключение при понижении уровня влажности до значения HumVentOff.
Или подразумевалось в else if оставить только условие Hum < HumVentOff?
для такого я вам советую написать несколько условий if. а не пытаться все вставить в одно. Сделайте первый IF - включение по времени для того периода дня, когда у вас вытяжка просто включена. Второе условие - для того времени, когда у вас вытяжка включается и выключается по влажности, а уже внутри этого условия - вложенный if с контролем уровня влажности. Зато Вы так не запутаетесь, к чему относится else
Но будет ли корректно работать условие по достижению определенного уровня влажности.
Т.е. в if указано включение по Hum > HumVentOn.
А в else if указано выключение при понижении уровня влажности до значения HumVentOff.
Или подразумевалось в else if оставить только условие Hum < HumVentOff?
Как-то так.
Всем спасибо, но проблема так и не решилась.
Вне зависимости от используемого подхода.
Как я понимаю, данная проблема заключается в конфликте условий выключения вытяжки. Но как его решить, я так и не понял.
Т.е. у меня указано в одном из условий, что вытяжка выключается при (daystamp > vent1off). Текущее время больше первого времени выключения.
В тоже время есть условие по выключению вентилятора при достижении заданной влажности ((Hum < humVentOff)) и почему-то он не работает при наличии условия (daystamp > vent1off).
Т.е. вытяжка почему-то выключается при достижении значения hunVentOn. Грубо говоря включилась на 70% влажности, на 70% и выключилась, хотя должна выключиться при влажности 50.
Если в это условие добавить через оператор И значение заданной влажности, то все нормально, т.е. вот так: (daystamp > vent1off && Hum < humVentOff).
Но мне не нужно, чтобы выключение по времени зависело от влажности.
Либо же если удалить условие (daystamp > vent1off), то тоже все нормально. Но в данном случае вытяжка не выключается по первому времени выключения.
Но будет ли корректно работать условие по достижению определенного уровня влажности.
Т.е. в if указано включение по Hum > HumVentOn.
А в else if указано выключение при понижении уровня влажности до значения HumVentOff.
Или подразумевалось в else if оставить только условие Hum < HumVentOff?
Как-то так.
Данный вариант вообще отказывается работать.
Я так понимаю из-за того, что в условии включения указано (Hum > humVentOn && Hum < humVentOff).
Т.е. вытяжка должна включаться, когда влажность Больше влажности и включения И когда влажность Меньше влажности выключения. Противоречение.
Данный вариант вообще отказывается работать.
Я так понимаю из-за того, что в условии включения указано (Hum > humVentOn && Hum < humVentOff).
Т.е. вытяжка должна включаться, когда влажность Больше влажности и включения И когда влажность Меньше влажности выключения. Противоречение.
Какое же это противоречие? Если влажность находится в диапазоне от humVentOn до humVentOff, то вытяжка должна включиться, в противном случае выключиться. Что не так в этой логике?
Вы уж тогда приведите конкретные цифры, которые у вас переменным присвоены
Cagie, если вы пытаеетесь реализовать гистерезис, то одними только значениями влажности включения и выключения это реализовать невозможно, необходим флаг включения вытяжки.
Гистерезис реализуется и без флагов, но точка выключения должна быть меньше точки включения. А что у него там задано - только ему и ведомо ))
Так ничего и не понял из того, что автору надо.
Видимо поэтому он и не может алгоритм составить, потому, что сам не понимает, что ему надо.
Мои варианты:
1. Вытяжка ВСЕГДА включается и ВЫКЛЮЧАЕТСЯ, в нужный временной период и КРОМЕ ЭТОГО ВСЕГДА включается если влажность выше нормыи выключается , когда приходит в норму.
2. Вытяжка имеет право работать только два часа в сутки , и то только если влажность высокая.
Опиши словами, что тебе надо без всяких условий, там разберемся.
Именно по первому варианту хочу чтобы работало.
Вытажка ВСЕГДА должна включаться в первый и второй заданные интервалы времени независимо от влажности.
+ вытяжка должна включаться при достижении определенной влажности и выключаться при понижении до заданного значения, НО только в интервал времени daystamp > vent1on (время включение 1) и daystamp < vent2off (время выключения 2).
В любое другое время вытяжка не должна работать (по влажности в том числе). Т.е. с 20:01 текущего до 5:59 следующего дня вытяжка не должна работать.
Значение переменных:
Далее переменные vent1on, vent1off, vent2on и vent2off рассчитываются следующим образом:
Но с этим проблем нет. По времени все корректно работает.
Так понятно объяснил? Или только запутал?)
Вытажка ВСЕГДА должна включаться в первый и второй заданные интервалы времени независимо от влажности.
+ вытяжка должна включаться при достижении определенной влажности и выключаться при понижении до заданного значения, НО только в интервал времени daystamp > vent1on (время включение 1) и daystamp < vent2off (время выключения 2).
В любое другое время вытяжка не должна работать (по влажности в том числе). Т.е. с 20:01 текущего до 5:59 следующего дня вытяжка не должна работать.
Тогда так. Третье условие выполняется только при влажности в нужном диапазоне и только днем
Но с этим проблем нет. По времени все корректно работает.
Так понятно объяснил? Или только запутал?)
Вы знаете - Ваша проблема в отсутствии логики :) Почитайте учебник по логике и представьте Вашу задачу стандартными логическими выражениями, а потом переведите на си++. И, уверяю Вас, все получится в лучшем виде.