Включение вытяжки по времени и влажности

Cagie
Offline
Зарегистрирован: 21.09.2020

Всем привет.

Уже несколько часов пытаюсь решить проблемы и не могу понять, в чем ее причина.

Смысл в следующем.

Необходимо включать вытяжку по двум временным периодам (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.

В чем может быть проблема.

Подскажи, пожалуйста :)

b707
Offline
Зарегистрирован: 26.05.2017

ну так вы правильноt решение нашли - выкиньте все условия из else, не нужны они там. У вас логика простая - в части if перечислены все условия, при которых вытяжка включена. иначе - выключена.

и строчка 3 не на месте, в условии ей делать нечего. вынесите ее в setup()

Cagie
Offline
Зарегистрирован: 21.09.2020

b707 пишет:

ну так вы правильноt решение нашли - выкиньте все условия из else, не нужны они там. У вас логика простая - в части if перечислены все условия, при которых вытяжка включена. иначе - выключена.

и строчка 3 не на месте, в условии ей делать нечего. вынесите ее в setup()

Спасибо за помощь.
Но будет ли корректно работать условие по достижению определенного уровня влажности.
Т.е. в if указано включение по Hum > HumVentOn.

А в else if указано выключение при понижении уровня влажности до значения HumVentOff.

Или подразумевалось в else if оставить только условие Hum < HumVentOff?

b707
Offline
Зарегистрирован: 26.05.2017

Cagie пишет:

Но будет ли корректно работать условие по достижению определенного уровня влажности.
Т.е. в if указано включение по Hum > HumVentOn.

А в else if указано выключение при понижении уровня влажности до значения HumVentOff.

Или подразумевалось в else if оставить только условие Hum < HumVentOff?

для такого я вам советую написать несколько условий if. а не пытаться все вставить в одно. Сделайте первый IF - включение по времени для того периода дня, когда у вас вытяжка просто включена. Второе условие - для того времени, когда у вас вытяжка включается и выключается по влажности, а уже внутри этого условия - вложенный if с контролем уровня влажности. Зато Вы так не запутаетесь, к чему относится else

v258
Онлайн
Зарегистрирован: 25.05.2020

Cagie пишет:

Но будет ли корректно работать условие по достижению определенного уровня влажности.

Т.е. в if указано включение по Hum > HumVentOn.

А в else if указано выключение при понижении уровня влажности до значения HumVentOff.

Или подразумевалось в else if оставить только условие Hum < HumVentOff?

  if ((daystamp > vent1on && daystamp < vent2off) || (daystamp > vent2on && daystamp < vent2off) || (Hum > humVentOn && Hum < humVentOff))
  {
    digitalWrite(Relay1, HIGH);
  }

  else {
    digitalWrite(Relay1, LOW);
  }

Как-то так. 

Cagie
Offline
Зарегистрирован: 21.09.2020

Всем спасибо, но проблема так и не решилась.

Вне зависимости от используемого подхода.

Как я понимаю, данная проблема заключается в конфликте условий выключения вытяжки. Но как его решить, я так и не понял.

Т.е. у меня указано в одном из условий, что вытяжка выключается при (daystamp > vent1off). Текущее время больше первого времени выключения.

В тоже время есть условие по выключению вентилятора при достижении заданной влажности ((Hum < humVentOff)) и почему-то он не работает при наличии условия (daystamp > vent1off).

Т.е. вытяжка почему-то выключается при достижении значения hunVentOn. Грубо говоря включилась на 70% влажности, на 70% и выключилась, хотя должна выключиться при влажности 50.

Если в это условие добавить через оператор И значение заданной влажности, то все нормально, т.е. вот так: (daystamp > vent1off && Hum < humVentOff).

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

Либо же если удалить условие (daystamp > vent1off), то тоже все нормально. Но в данном случае вытяжка не выключается по первому времени выключения.

Cagie
Offline
Зарегистрирован: 21.09.2020

v258 пишет:

Cagie пишет:

Но будет ли корректно работать условие по достижению определенного уровня влажности.

Т.е. в if указано включение по Hum > HumVentOn.

А в else if указано выключение при понижении уровня влажности до значения HumVentOff.

Или подразумевалось в else if оставить только условие Hum < HumVentOff?

  if ((daystamp > vent1on && daystamp < vent2off) || (daystamp > vent2on && daystamp < vent2off) || (Hum > humVentOn && Hum < humVentOff))
  {
    digitalWrite(Relay1, HIGH);
  }

  else {
    digitalWrite(Relay1, LOW);
  }

Как-то так. 

Данный вариант вообще отказывается работать.

Я так понимаю из-за того, что в условии включения указано (Hum > humVentOn && Hum < humVentOff).

Т.е. вытяжка должна включаться, когда влажность Больше влажности и включения И когда влажность Меньше влажности выключения. Противоречение.

v258
Онлайн
Зарегистрирован: 25.05.2020

Cagie пишет:

Данный вариант вообще отказывается работать.

Я так понимаю из-за того, что в условии включения указано (Hum > humVentOn && Hum < humVentOff).

Т.е. вытяжка должна включаться, когда влажность Больше влажности и включения И когда влажность Меньше влажности выключения. Противоречение.

Какое же это противоречие? Если влажность находится в диапазоне от humVentOn до humVentOff, то вытяжка должна включиться, в противном случае выключиться. Что не так в этой логике?

Вы уж тогда приведите конкретные цифры, которые у вас переменным присвоены

b707
Offline
Зарегистрирован: 26.05.2017

Cagie, если вы пытаеетесь реализовать гистерезис, то одними только значениями влажности включения и выключения это реализовать невозможно, необходим флаг включения вытяжки.

v258
Онлайн
Зарегистрирован: 25.05.2020

Гистерезис реализуется и без флагов, но точка выключения должна быть меньше точки включения. А что у него там задано - только ему и ведомо ))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Так ничего и не понял из того, что автору надо.
Видимо поэтому он и не может алгоритм составить, потому, что сам не понимает, что ему надо.
Мои варианты:
1. Вытяжка ВСЕГДА включается и ВЫКЛЮЧАЕТСЯ, в нужный временной период и КРОМЕ ЭТОГО ВСЕГДА включается если влажность выше нормыи выключается , когда приходит в норму.
2. Вытяжка имеет право работать только два часа в сутки , и то только если влажность высокая.

Опиши словами, что тебе надо без всяких условий, там разберемся.

Cagie
Offline
Зарегистрирован: 21.09.2020

Kakmyc пишет:
Так ничего и не понял из того, что автору надо. Видимо поэтому он и не может алгоритм составить, потому, что сам не понимает, что ему надо. Мои варианты: 1. Вытяжка ВСЕГДА включается и ВЫКЛЮЧАЕТСЯ, в нужный временной период и КРОМЕ ЭТОГО ВСЕГДА включается если влажность выше нормыи выключается , когда приходит в норму. 2. Вытяжка имеет право работать только два часа в сутки , и то только если влажность высокая. Опиши словами, что тебе надо без всяких условий, там разберемся.

Именно по первому варианту хочу чтобы работало.

Вытажка ВСЕГДА должна включаться в первый и второй заданные интервалы времени независимо от влажности.

+ вытяжка должна включаться при достижении определенной влажности и выключаться при понижении до заданного значения, НО только в интервал времени daystamp > vent1on (время включение 1) и daystamp < vent2off (время выключения 2). 

В любое другое время вытяжка не должна работать (по влажности в том числе). Т.е. с 20:01 текущего до 5:59 следующего дня вытяжка не должна работать. 
Значение переменных:

int hourvent1on = 6; int minutevent1on = 0; 
int hourvent1off = 9; int minutevent1off = 0;  //Вентиляция интервал 1
int hourvent2on = 17; int minutevent2on = 0;
int hourvent2off = 20; int minutevent2off = 0;  //Вентиляция интервал 2
int humVentOn=75;
int humVentOff=60;

Далее переменные vent1on, vent1off, vent2on и vent2off рассчитываются следующим образом:

vent1on = hourvent1on*60;
vent1on = vent1on*60;
minutevent1on = minutevent1on*60;
vent1on = vent1on + minutevent1on;

vent1off = hourvent1off*60;
vent1off = vent1off*60;
minutevent1off = minutevent1off*60;
vent1off = vent1off + minutevent1off;

vent2on = hourvent2on*60;
vent2on = vent2on*60;
minutevent2on = minutevent2on*60;
vent2on = vent2on + minutevent2on;

vent2off = hourvent2off*60;
vent2off = vent2off*60;
minutevent2off = minutevent2off*60;
vent2off = vent2off + minutevent2off;

Но с этим проблем нет. По времени все корректно работает.

Так понятно объяснил? Или только запутал?)

v258
Онлайн
Зарегистрирован: 25.05.2020

Cagie пишет:

Вытажка ВСЕГДА должна включаться в первый и второй заданные интервалы времени независимо от влажности.

+ вытяжка должна включаться при достижении определенной влажности и выключаться при понижении до заданного значения, НО только в интервал времени daystamp > vent1on (время включение 1) и daystamp < vent2off (время выключения 2). 

В любое другое время вытяжка не должна работать (по влажности в том числе). Т.е. с 20:01 текущего до 5:59 следующего дня вытяжка не должна работать.

if ((daystamp > vent1on && daystamp < vent2off) || (daystamp > vent2on && daystamp < vent2off) || ((Hum < humVentOn && Hum > humVentOff) && (daystamp > vent1on && daystamp < vent2off)))
{
  digitalWrite(Relay1, HIGH);
}

else {
  digitalWrite(Relay1, LOW);
}

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Cagie пишет:

Но с этим проблем нет. По времени все корректно работает.

Так понятно объяснил? Или только запутал?)

Вы знаете - Ваша проблема в отсутствии логики :) Почитайте учебник по логике и представьте Вашу задачу стандартными логическими выражениями, а потом переведите на си++. И, уверяю Вас, все получится в лучшем виде.