10 — Умный дом на Ардуино. Глава III — Вентиляция. Часть 2 — Ванная. Автоматическое управление вентилятором при изменении влажности 2

В прошлой статье мы рассмотрели управление вентилятором в ванной с использованием обычного фоторезистора.
Пришла пора добавить в нашу схему умного дома новый тип датчика. Датчик влажности и температуры — DHT(пины 9,10 ).

dht11

Описание и пример работы с датчиком можно посмотреть в статье

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


Наш подопытный вентилятор. Просто ужасного исполнения — кроме катушки ничего нет!

Алгоритмы работы

Новый алгоритм работы будет таким:

  • Замеряем влажность в ванной
  • Сравниваем влажность с необходимой для включения вентилятора
  • Включаем вентилятор
  • Ждем пока влажность не упадет ниже нормы
  • Выключаем вентилятор

Алгоритм из прошлой статьи:

  • Ждем включения света
  • Ждем задержку включения
  • Включаем вентилятор
  • Ждем выключения света
  • Ждем задержку выключения
  • Выключаем вентилятор

Все просто. НО… Что делать когда влажность приточного воздуха больше чем заданные параметры?
Да, такой алгоритм работать не будет. Вентилятор будет в состоянии «включен» — постоянно.

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

Алгоритм для двух датчиков влажности и вентилятора:

  • Измеряем влажность в ванной
  • Измеряем влажность приточного воздуха
  • Ждем, когда влажность в ванной будет больше влажности приточного воздуха на величину «N»
  • Включаем вентилятор
  • Ждем, когда влажность в ванной будет меньше влажности приточного воздуха на величину «N»
  • Выключаем вентилятор

Объединим два алгоритма и внесем изменения во всю схему умного дома

Объединим датчик света и датчик влажности, поместив их в один корпус. Для этого немного переделаем конструкцию датчика DHT. Отпилим лишнюю часть платы и подпаяем датчик с обратной стороны

Разбираем датчик DHT

Разбираем датчик DHT

Бокс делаем из бокса для таблеток, купленный в аптеке

Бокс для датчика

Бокс для датчика

Собираем все компоненты воедино и монтируем в ванной

Все готово к монтажу DHT

Все готово к монтажу DHT

Монтаж датчика DHT

Монтаж датчика DHT

Скетчи

Все изменения в скетче

1
2
3
4
5
6
7
8
9
10
11
12
//датчики влажности
#include "DHT.h"
#define pin_dht_bath 9     // пин датчика влажности в ванной
#define pin_dht_ref 10     // пин датчика влажности в комнате для сравнения
#define type_dht DHT11   // DHT 11 - тип нашего датчика
DHT dht_bath(pin_dht_bath, type_dht);
DHT dht_ref(pin_dht_ref, type_dht);
uint8_t vlaga_bath;//влажность в ванной
uint8_t vlaga_ref;//опорная влажность
uint8_t temp_bath;//температура в ванной
uint8_t temp_ref;//опорная температура
/*----------------------------------------------------------------------*/
//датчики влажности
#include "DHT.h"
#define pin_dht_bath 9     // пин датчика влажности в ванной
#define pin_dht_ref 10     // пин датчика влажности в комнате для сравнения
#define type_dht DHT11   // DHT 11 - тип нашего датчика
DHT dht_bath(pin_dht_bath, type_dht);
DHT dht_ref(pin_dht_ref, type_dht);
uint8_t vlaga_bath;//влажность в ванной
uint8_t vlaga_ref;//опорная влажность
uint8_t temp_bath;//температура в ванной
uint8_t temp_ref;//опорная температура
/*----------------------------------------------------------------------*/
1
2
3
4
  
void setup() {
    dht_bath.begin();
    dht_ref.begin();}
  
void setup() {
	dht_bath.begin();
	dht_ref.begin();}
1
2
3
4
5
void loop()
{
    dht_read();//опрос датчиков dht
    set_air_bath();//управление вентиляцией в ванной
}
void loop()
{
	dht_read();//опрос датчиков dht
	set_air_bath();//управление вентиляцией в ванной
}

Управление вентилятором

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void set_air_bath()//управление вентиляцией в ванной
{
  if ((param_air_bath[0] & 1)==1)//если автоматический режим
   {
     //если влажность в ванной больше влажности в комнате на 15% включаем вентилятор и выходим из процедуры управления
     if (vlaga_bath-vlaga_ref>15)
     {
          digitalWrite(pin_air_bath, LOW);
          param_air_bath[0]=((param_air_bath[0]>>2)<<2) xor 1;//записываем состояние вентиляции "вкл"
          return; 
     }
     
     
     if (f_light_bath)//если включился свет
      {      
          my_timer(0,3,1,1);//обнуляем таймер выключения
          if (my_timer(param_air_bath[1]*1000l*60l,2,0,1)==true)//задержка включения
          { 
            digitalWrite(pin_air_bath, LOW);
            param_air_bath[0]=((param_air_bath[0]>>2)<<2) xor 1;//записываем состояние вентиляции "вкл"
          }
       } else {
          my_timer(0,2,1,1);//обнуляем таймер включения
          if (my_timer(param_air_bath[2]*1000l*60l,3,0,1)==true)//задержка выключения
          {  
             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)//если автоматический режим
   {
     //если влажность в ванной больше влажности в комнате на 15% включаем вентилятор и выходим из процедуры управления
     if (vlaga_bath-vlaga_ref>15)
     {
          digitalWrite(pin_air_bath, LOW);
          param_air_bath[0]=((param_air_bath[0]>>2)<<2) xor 1;//записываем состояние вентиляции "вкл"
          return; 
     }
     
     
     if (f_light_bath)//если включился свет
      {      
          my_timer(0,3,1,1);//обнуляем таймер выключения
          if (my_timer(param_air_bath[1]*1000l*60l,2,0,1)==true)//задержка включения
          { 
            digitalWrite(pin_air_bath, LOW);
            param_air_bath[0]=((param_air_bath[0]>>2)<<2) xor 1;//записываем состояние вентиляции "вкл"
          }
       } else {
          my_timer(0,2,1,1);//обнуляем таймер включения
          if (my_timer(param_air_bath[2]*1000l*60l,3,0,1)==true)//задержка выключения
          {  
             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);//если ручной режим, то устанавливаем выставленное вручную значение вкл/выкл  
}

Функция опроса датчиков DHT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void dht_read()//чтение темепературы и влажности с датчиков dht
{
  if (my_timer(60000,6,0,1)==true)//опрос датчиков
          {
 
             dht_read_(dht_bath, &vlaga_bath, &temp_bath); //получаем значения с датчика в ванной
             delay (300);
             dht_read_(dht_ref, &vlaga_ref, &temp_ref );//получаем значения с датчика в комнате
             delay(300);
         
          }
}
 
void dht_read_(DHT dht, uint8_t *vlaga, uint8_t *temp)
{
              uint8_t h = dht.readHumidity();//получаем влажность
              uint8_t t = dht.readTemperature();//получаем температуру
              if (isnan(h) || isnan(t)) {
            } else {
              *vlaga=h;
              *temp=t;
            }
}
void dht_read()//чтение темепературы и влажности с датчиков dht
{
  if (my_timer(60000,6,0,1)==true)//опрос датчиков
          {

             dht_read_(dht_bath, &vlaga_bath, &temp_bath); //получаем значения с датчика в ванной
             delay (300);
             dht_read_(dht_ref, &vlaga_ref, &temp_ref );//получаем значения с датчика в комнате
             delay(300);
         
          }
}

void dht_read_(DHT dht, uint8_t *vlaga, uint8_t *temp)
{
              uint8_t h = dht.readHumidity();//получаем влажность
              uint8_t t = dht.readTemperature();//получаем температуру
              if (isnan(h) || isnan(t)) {
            } else {
              *vlaga=h;
              *temp=t;
            }
}

Распиновка контроллера

Получилось очень даже хорошо. В будущем добавим настройку разницы влажности в веб интерфейс, а пока только циферки.

Ну и напоследок, подписывайтесь:

Мы в Facebook — https://www.facebook.com/bigbarrelru/
Мы в Twitter — https://twitter.com/bigbarrelru
МЫ в Instagram — http://instagram.com/bigbarrelru
Мы в youtube — http://www.youtube.com/user/bigbarrelru

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

2 комментс для “10 — Умный дом на Ардуино. Глава III — Вентиляция. Часть 2 — Ванная. Автоматическое управление вентилятором при изменении влажности

  1. Ответить Евгений Янв 23, 2017 21:45
    Скрытый текст

    в чем может быть проблема? подскажите пожалуйста

    • Ответить Slava Янв 24, 2017 18:19

      Вы скопировали примеры со статьи и забыли объявить параметры настроек.

      Скачайте весь проект и попробуйте его.

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