Контроллер управления вытяжным вентилятором в ванной

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Мои требования к устройству управления

  1. устройство управления должно работать в автоматическом режиме;
  2. вентилятор должен включаться от повышения влажности;
  3. включение вентилятора не должно зависеть от текущего уровня влажности в квартире;
  4. вентилятор должен работать, когда в ванной комнате никого нет;
  5. устройство управление должно быть максимально простым и дешевым;

Компоненты

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

Микроконтроллер с периодичностью раз в 10 секунд меряет влажность и температуру.
Влажность циклически накапливается в архиве из 6 значений. Если текущая влажность выше первой из архива более чем на 3% либо абсолютное значение влажности выше 85%, значит нужно включать вентилятор. 

Вентилятор включается на 20 минут при отсутствии света на фоторезисторе.

Кнопка принудительно включает вентилятор на 20 минут (если он не работает) или выключает (если работает).

Все константы в алгоритме подбирались эксперементальным путем.

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

 

Cхема

Скетч

Более подробное описание в моем блоге

 

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Главное не написали - кота как зовут?

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

JollyBiber пишет:

Главное не написали - кота как зовут?

Кота зовут Тимофей. Главный помощник

axill
Offline
Зарегистрирован: 05.09.2011

Хорошая работа! Приятно читать, все просто и по делу

art100
Offline
Зарегистрирован: 09.03.2014

Ванная: У меня все наоборот. Кот орет когда я парюсь в ванной, а его не пустил повалятся на полке в тепле и влаге. 

Туалет: А вентиляцию в туалете решил простым вырезанием прямоугольника для пролезания кота к своему туалету-ванночке. Второе решение получил приточную вытяжку всех запахов сразу.

Но руки чешутся какой-нибудь микропроцессор присобачить туда :) рядом с нотебуком.

А работа прекрасная.

 

Leha
Offline
Зарегистрирован: 09.06.2014

art100 пишет:

Но руки чешутся какой-нибудь микропроцессор присобачить туда :)

Сделать автоматическую дверь для кота и в туалет, и в ванну :)

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Плдскажите лучше, как сделать анализатор запахов, чтобы после кота (или не кота) включался вентилятор в талете 

art100
Offline
Зарегистрирован: 09.03.2014

sav13 пишет:

Плдскажите лучше, как сделать анализатор запахов, чтобы после кота (или не кота) включался вентилятор в талете 

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

закрывать эту дырку не дело

все равно с пола никто снизу за вами ничего не поглядит

я когда електролобзиком вырезал проверял

целых 10 лет тот кусок хранил думал дверь может сделать

и проследить

1 естественная вытяжная ветиляция в доме  есть

2 любую ставню на микропроветривание

3 на улице зелени много

по маршруту приточной вентиляции всегда свежий воздух 

вы никогда не знаете что кто-то где-то делает свои дела пока не услышите шкрябанье лапой

мой почемуто когда сделает свое дело выходит и делает мяв

видимо все можем бежать убирать его высочество облегчилось

прикольно так

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

куда дует

в дом или естественная вентиляция сосать начинает

все гениальное просто

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Не знаю как у вас. Мой кот когда посрет (извините за подробности) - вонь стоит такая, что, никакая вентиояция не успевает :)

И чем меньше дырок щелей, тем лучше.

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

Вот думаю, может обучить кота кнопку нажимать. ;)

axill
Offline
Зарегистрирован: 05.09.2011

на уровне кота поставить датик присутствия или движения

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

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

По запаху было бы надежнее. Есть причина - есть действие.

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

axill
Offline
Зарегистрирован: 05.09.2011

увы, датчиков запаха пока нет)) есть датчики на разные типы газов. так что сначала надо понять какие газы производит кот))

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Наполнитель на основе опилок, вне туалета никакого запаха

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

kisoft пишет:

Наполнитель на основе опилок, вне туалета никакого запаха

Это слишком просто. Не наш путь. Да и не прижился у нас наполнитель.

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Отлично. Но с анализом газов пока тяжко все.. а вот про кнопку где то я уже слышал.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Puhlyaviy пишет:
Отлично. Но с анализом газов пока тяжко все.. а вот про кнопку где то я уже слышал.

Научить кота пользоваться кнопкой - это прорыв на стыке двух наук

Еще хороший сигнал, поймать звук, когда код начинает заскребать. Главное, чтобы, как при хлопанье в ладоши, не было ложгых срабатываний

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Ложные срабатывания не критично. Это же вентилятор будет включаться, а не термоядерная реакция стартовать. На самом деле решение простое. Датчик присутствия на кошачем лотке.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

АААА! Захожу на тему, а тут коты про свои туалеты общаются!

А по теме - в принципе когда кот играет (пусть и в своем туалете :) он будет пригибаться, а при "делах и делишках" высоко и неподвижно сидеть гордо выгнув спину в течении 5-10 секунд. вот это и надо "ловить".

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Пластерем запасись и бинтами прежде чем ловить гордо выгнувшего кота.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Puhlyaviy пишет:
Пластерем запасись и бинтами прежде чем ловить гордо выгнувшего кота.

Вот что имелось ввиду под "ловить" ))))

axill пишет:

на уровне кота поставить датик присутствия или движения

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

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Это не факт.. вот тут всякие с совочками лазят по туалету а потом из лотка все пропадает.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Нарисовался такой алгоритм:

Имеется три датчика - инфракрасный, фотодатчик и микрофон.

1. Инфракрасный ловит последовательность: Движение, пауза на 10сек и более, снова движение. Взводится флаг.

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

3. Если при этом не было света - "кот детектед" - посылаем хозяину СМС: "Убери за котом"

4. Если микрофон не зафиксировал звука за 5 минут, флаг сбрасываем.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

значит сверху направить, и потом совочек же не держат по долгу на одном месте? Или кот реактивно нужду справляет?

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

JollyBiber пишет:

значит сверху направить, и потом совочек же не держат по долгу на одном месте? Или кот реактивно нужду справляет?

Ну если после совочка включиться вентилятор, то тоже хорошо.

Кот справляет нужду по разному, но не менее 10 сек, мне кажется. Да и человек тоже.
Все равно все тайминги по факту по факту корректировать.

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

А микрофон вы чем собрались обрабатывать?

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Ничем не буду. 
Снимаю показания постоянно с порта, добустим, кждые 0.1 - 0.2 сек. И суммирую 10-50 последних значений.

Обрабатывется горомкость + продолжительность.

Можно конечно еще спектроанализатор, как в эквалайзере подключить. Но это уже следующий этап.

Начну с установки всех датчиков в туалете и сбора статистики.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Лично я трачу время не на туалет, а на свое хобби.

Есть задача, пусть высосанная из пальца - мне  интересно ее решить.

p.s. А денег на это потратится не так уж и много. 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Задача в данном случае высасывается из туалета :)
Неверю что не нашлось более интересной задачи.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

А чем эта задача не интересна? Еще ни кем не решалась :)

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

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Переделал контроллер

Теперь он на ESP8266. Вроде как и не по теме сайта, но запрограммирован в Arduino IDE

В общем, кому интересно, здесь проект:

Контроллер управления вентилятором 2. Теперь с WiFi

Программирование и настройка WiFi контроллера управления вентилятором

Silver-HaOS
Offline
Зарегистрирован: 06.02.2017

Доброго времени, sav13.

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

Сам в программировании еще не силен. Небольшие переделки еще сам не осилю...

Silver-HaOS
Offline
Зарегистрирован: 06.02.2017

Доброго времени, Уважаемые.

Спасибо автору за проделанную работу.

Немного изменил скетч под свои нужды:

1) Вентилятор включается по превышению влажности сразу (не зависит от освещения).

2) Вентилятор включается по фоторезистору от освещения в туалете.

Всё работает. Но не могу сообразить, как сделать задержку срабатывания по освещению в туалете.

Хотельсь бы, чтоб вентиляция включалась так - "сработал" фоторезистор, пауза 10-15 сек, если освещение с туалете ещё включено - включается вентиляция. 

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

https://arduinomaster.ru/program/arduino-delay-millis/  -  эту статью почитал, но пока ещё не петрю так глубоко...

С delay не получилось...

P.S.  У автора в схеме ошибка: кнопка S2 должна быть включена на GND с места соединения РС4 и R20.

 

#include <DHT.h>
#include <SevenSegmentDisplay.h>



#define DEBUG        1
#define TIMER_PERIOD 2400

#define ctrPIN   13 //Дискретный вывод для вентелятора
#define dhtPIN   15 //Дискретный вход для датчика температуры
#define btnPIN   18 //Кнопка

// Указатель на функцию перезагрузки контроллера
void(* resetFunc) (void) = 0; // Reset MC function

// Инициируем светодиодную матрицу
SevenSegmentDisplay<true, BiDigit<17, 16> > ss(9, 8, 7, 6, 5, 4, 3, 2);

// Инициируем DHT11 на контроллере с частотой 16МГц
DHT dht(dhtPIN, DHT11); //16МГц

// Состояния FSM
enum TMode
  {
  tmWait,       //Режим ожидания
  tmNeedPower,  //Требуется включение вентилятора
  tmAutoPower,  //Вентилятор работает в автоматическом режиме
  tmManualPower //Вентилятор работает в ручном режиме
};
  
// Состояния отображения
enum TDisplayMode
  {
  tdmTemp       , //Отображение температуры
  tdmHum        , //Отображение влажности
  tdmTimer        //Отображение таймера  
};
  
  
//int h_prev;
int t,h,a0;

int h_arr[6];



void setup()
{
// Инициируем порт отладки
#ifdef DEBUG
    Serial.begin(9600);
    Serial.println("Humidity controller start ...");
#endif
// Инициируем выход управления 
    pinMode(ctrPIN, OUTPUT); // будем мигать лампочкой при передаче
    digitalWrite(ctrPIN, LOW); 
// Инициируем вход с кнопкой
    pinMode(btnPIN, INPUT);     
//Включаем подтягивающий резистор    
    digitalWrite(btnPIN, HIGH); 

    
// Инициируем датчик температуры DHT11    
    dht.begin();
// Считываем первоначальное значение влажности
    h = dht.readHumidity();
    for( int i=0; i<6; i++)h_arr[i] = h;

}

// Счетчик 0.5 секудных тактов
unsigned long cnt05 = 0;
unsigned long ms1   = 0;
// Флаг включения света
boolean flag_light = false;
// Флаг нажатия кнопки
boolean flag_btn   = false;
// Флаг влажерсти
boolean flag_hum   = false;
// Считчик таймера работы вентилятора
unsigned int timer = 0;
TMode mode         = tmWait;
TDisplayMode dmode = tdmTemp;
boolean blink_stat = false;   

void loop ()
{ 
   unsigned long ms = millis();
   int p = ms - ms1;

// Считываем состояние кнопки
   
   if( digitalRead(btnPIN) == LOW ){
      int n = 1;
      for( int i=0; i<9; i++ ){
         if( digitalRead(btnPIN) == LOW )n++;
         delay(10);
      }
      if( n > 9 )flag_btn = true;   
      delay(400);
#ifdef DEBUG
      Serial.println("Button is press");
#endif
   }//end if     

// Проверка, что прошло не менее 0.5 сек
   if( p < 0 || p > 500 ){
      cnt05++;
      ms1 = ms;
// Считываем состояние фоторезистора
      a0 = analogRead(A0);
      if( a0 > 400 )flag_light = true;
      else flag_light = false;
// Каждые 10 секунд опрашиваем датчик DHT11 и меняем отображение дисплея     
      if( cnt05%20 == 0 ){    
         h = dht.readHumidity();
         t = dht.readTemperature();
// Если влажность изменилась на 3% или влажность превысила 85%   
         
         if( h - h_arr[5] > 3 || h > 85 )flag_hum = true;
// Исправлена ошибка из предыдущей версии
         for( int i=5; i>0; i--)h_arr[i] = h_arr[i-1];
         h_arr[0] = h;
#ifdef DEBUG
         Serial.print("VAL: Temp=");
         Serial.print(t);
         Serial.print(" H=");
         Serial.print(h);
         Serial.print(" A0=");
         Serial.print(a0);
         Serial.print(" X=");
         Serial.print(cnt05);
         Serial.print(" TM=");
         Serial.print(timer);
         Serial.print(" MODE=");
         Serial.print(mode);
         Serial.print(" DMODE=");
         Serial.print(dmode);
         Serial.println("");
#endif
// Переключаем дисплей
         switch( dmode ){
            case tdmTemp : dmode = tdmHum; break;
            case tdmHum  : dmode = tdmTimer; break;
            default:       dmode = tdmTemp;
         }//end switch
      }//end if( cnt05%20 == 0 )   
      blink_stat = !blink_stat;
      SetStatusFSM(); 
   }//end if( p < 0 || p > 500 ){   
   DisplayStatus(); 

}//end loop()     

/**
* Функция отображение разных параметров
*/
void DisplayStatus(){
// Настройка отображения режима в    
   int point = -1;
   switch( mode ){
      case tmNeedPower:
         point = 0;
         break;
      case tmAutoPower:
      case tmManualPower:
         if( blink_stat )point = 0;
         break;   
   }  
   switch( dmode ){
      case tdmTemp :
         ss.print((unsigned)t,point,50);
         break;
      case tdmHum  :
         ss.print((unsigned)h,point,50);
         break;
      case tdmTimer:
// Показываем минуты      
         if( timer > 120 )ss.print((unsigned)(timer/120),point,50);
// Показываем секунды
         else if( timer > 0 )ss.print((unsigned)(timer/2),point,50);
// Показываем 0
         else ss.print(0,point,50);    
//         ss.print((unsigned)(a0/100),point,50);
         break;
   }//end switch
   
}


/**
* Функция перехода автомата состояний
*/
void SetStatusFSM(){
   switch(mode){
// Режим ожидания     
      case tmWait :
         digitalWrite(ctrPIN, LOW);
// Нажата кнопка      
         if( flag_btn ){
            timer = TIMER_PERIOD;
            mode  = tmManualPower;
         }
// Если сработал датчик влажности
         else if( flag_hum ){
            timer = TIMER_PERIOD;
            mode  = tmAutoPower;
         }   
// Если сработал датчик освещенности
         else if( flag_light ){
            timer = TIMER_PERIOD;
            mode  = tmAutoPower;
         }   
         break;
// Состояние ожилания работы вентилятора
      case tmNeedPower:
         digitalWrite(ctrPIN, LOW);
// Нажата кнопка      
         if( flag_btn ){
            mode  = tmManualPower;
         }
// Свет выключен
        else if( !flag_light ){
           mode  = tmWait;
       }
         break;
// Состояние "Вентилятор работает в автомате"
      case tmAutoPower:
// Включить вентилятор
         digitalWrite(ctrPIN, HIGH);
// Таймер считает
         if( timer > 0 )timer--;
// Нажата кнопка      
         if( flag_btn ){
            mode  = tmWait;
            timer = 0;
         }
// Таймер сработал
         else if( timer <= 0 ){
            timer = 0;
            mode  = tmWait;
         }
         break;
// Состояние "Вентилятор работает в ручном режиме"
      case tmManualPower:
// Включить вентилятор
         digitalWrite(ctrPIN, HIGH);
// Таймер считает
         if( timer > 0 )timer--;
// Нажата кнопка      
         if( flag_btn ){
            mode  = tmWait;
            timer = 0;
         }
// Таймер сработал
         else if( timer <= 0 ){
            timer = 0;
            mode  = tmWait;
         }
         break;
   } 
// Сбросить флани кнопка и влажность   
   flag_btn = false;
   flag_hum = false;

}