8 — Умный дом на Ардуино. Глава III — Вентиляция. Часть 1 — Ванная. Простая автоматизация с фоторезистором 2

Следующим этапом в проектировании нашего умного дома будет проектирование управления вентиляцией.
В наличие у нас 3 вентилятора, питающихся от сети 220 нагрузкой 180Вт

— Вентилятор в ванной, совмещенной с санузлом
— Вентилятор на кухни для потолочной вентиляции
— Вентилятор для блока управления умным домом и рабочего стола(пк, зона пайки)

Управление вентилятором осуществляется через реле, которые использовались в управлении теплым полом

По аналогии с простым управлением теплым полом сделаем простое управление всеми вентиляторами при помощи веб-интерфейса, а управление вентиляцией в ванной сделаем автоматическим.

Итак, вентиляция в ванной

Для вентиляции в ванной начнем разрабатывать систему автоматизации со следующими функциями:

  • Автоматическое включение
  • Автоматическое выключение
  • Задержка включения
  • Задержка выключения

Добавим в нашу схему простой фоторезистор и все управление будем строить вокруг него. Т.е. мы будем следить за тем включился ли свет в ванной и на какое время.

Немного поразмыслив вырисовывется простой линейный алгоритм:

  1. Ждем включения света.
  2. Ждем задержку включения.
  3. Включаем вентилятор.
  4. Ждем выключения света.
  5. Ждем задержку выключения.
  6. Выключаем вентилятор.

Для реализации данного алгоритма необходимо добавить настройки таймингов и само управление.

Добавим в нашу схему второй контроллер, подключим фоторезистор и реле управления вентиляторами
shema.png f1.png f2.png

Кусок скетча с алгоритмом автоматизации вентилятора в ванной(полный в ссылке в конце статьи)

1
2
3
4
5
6
7
8
9
void set_air_bath()//управление вентиляцией в ванной
{
if ((param_air_bath[0] & 1)==1)//если автоматический режим
{
if (//если включился свет
((analog_param[0]>>7==1) and analog_value[0]>(analog_param[0] & 127))//если фоторезистор по схеме подключен на минус
or
((analog_param[0]>>7==0) and analog_value[0]<=(analog_param[0] & 127))//если резистор 4k7 по схеме подключен на минус ) { if (my_timer(param_air_bath[1]*1000l*60l,2,0)==true)//задержка включения { my_timer(0,3,1);//обнуляем таймер выключения digitalWrite(pin_air_bath, LOW); param_air_bath[0]=((param_air_bath[0]>>2)<<2) xor 1;//записываем состояние вентиляции "вкл" } } else { //задержка выключения if (my_timer(param_air_bath[2]*1000l*60l,3,0)==true)// задержка выключения { my_timer(0,2,1);//обнуляем таймер включения digitalWrite(pin_air_bath, HIGH); param_air_bath[0]=((param_air_bath[0]>>2)<<2) xor 3;//записываем состояние вентиляции "выкл" } } } else digitalWrite(pin_air_bath, (param_air_bath[0] & 2)>0);//если ручной режим, то устанавливаем выставленное вручную значение вкл/выкл
}
void set_air_bath()//управление вентиляцией в ванной
{
if ((param_air_bath[0] & 1)==1)//если автоматический режим
{
if (//если включился свет
((analog_param[0]>>7==1) and analog_value[0]>(analog_param[0] & 127))//если фоторезистор по схеме подключен на минус
or
((analog_param[0]>>7==0) and analog_value[0]<=(analog_param[0] & 127))//если резистор 4k7 по схеме подключен на минус ) { if (my_timer(param_air_bath[1]*1000l*60l,2,0)==true)//задержка включения { my_timer(0,3,1);//обнуляем таймер выключения digitalWrite(pin_air_bath, LOW); param_air_bath[0]=((param_air_bath[0]>>2)<<2) xor 1;//записываем состояние вентиляции "вкл" } } else { //задержка выключения if (my_timer(param_air_bath[2]*1000l*60l,3,0)==true)// задержка выключения { my_timer(0,2,1);//обнуляем таймер включения digitalWrite(pin_air_bath, HIGH); param_air_bath[0]=((param_air_bath[0]>>2)<<2) xor 3;//записываем состояние вентиляции "выкл" } } } else digitalWrite(pin_air_bath, (param_air_bath[0] & 2)>0);//если ручной режим, то устанавливаем выставленное вручную значение вкл/выкл
}

Скорректированный таймер с функцией обнуления

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
unsigned long millis_old[5]={0,0,0,0,0};//массив для хранения последних данных о времени срабатывания таймера.Количество элементов соответствует количеству таймеров
boolean my_timer(unsigned long time, byte nomer, boolean clear_t)//функция таймер, time-время задержки, nomer-номер таймера, clear_t обнуление
{
if (clear_t==1) //если необходимо обнулить
millis_old[nomer]=0;//обнуляем таймер
else {
unsigned long current_millis;//текущее значение миллисекунды
current_millis=millis();
if (millis_old[nomer]==0) millis_old[nomer]=current_millis;//если таймер обнулен, то записываем текущее время
if (current_millis-millis_old[nomer]>time) //если время срабатывания таймера наступило
{
millis_old[nomer]=0;//перезаписываем время последнего срабатывания таймера
return true;//возвращаем true
} else if (current_millis<millis_old[nomer])//произошло переполнение таймера
{
for (int i=1; i <= 5; i++) millis_old[i]=0; //обнуляем массив всех таймеров
} else return false;//возвращаем false
}
}
unsigned long millis_old[5]={0,0,0,0,0};//массив для хранения последних данных о времени срабатывания таймера.Количество элементов соответствует количеству таймеров
boolean my_timer(unsigned long time, byte nomer, boolean clear_t)//функция таймер, time-время задержки, nomer-номер таймера, clear_t обнуление
{
if (clear_t==1) //если необходимо обнулить
millis_old[nomer]=0;//обнуляем таймер
else {
unsigned long current_millis;//текущее значение миллисекунды
current_millis=millis();
if (millis_old[nomer]==0) millis_old[nomer]=current_millis;//если таймер обнулен, то записываем текущее время
if (current_millis-millis_old[nomer]>time) //если время срабатывания таймера наступило
{
millis_old[nomer]=0;//перезаписываем время последнего срабатывания таймера
return true;//возвращаем true
} else if (current_millis<millis_old[nomer])//произошло переполнение таймера
{
for (int i=1; i <= 5; i++) millis_old[i]=0; //обнуляем массив всех таймеров
} else return false;//возвращаем false
}
}

Также необходимо внести изменения в скетч на местер-контроллере и WEB-интерфейсе.
Демо-веб интерфейса

Конечно это совсем не предел автоматизации вентиляции в ванной, далее в планах установить датчик влажность и датчик движения, но об этом в другой раз.

Все файлы проекта

2 комментс для “8 — Умный дом на Ардуино. Глава III — Вентиляция. Часть 1 — Ванная. Простая автоматизация с фоторезистором

  1. Ответить Василий П Мар 11, 2017 20:40

    Ребят, неплохие уроки на сайте, интересно почитать, особенно по связи между дуинами, но зачем создавать нанокостыли там, где люди просто вешают питание вентилятора параллельно лампочке в ванной?
    Я понимаю, если бы в примере был термометр\влагомер, а не фоторезистор — тогда получаем реальный контур управления климатом и профилактики сырости.

    И второе: материалы в основном для начинающих, и прискорбно видеть на страничке про оптимизацию совет не объединять условия и экономить память обращением к портам, а на соседних — нарушение половины описанных там правил (и digitalWrite, и сложнообъединённые условия в if)

Добавить комментарий