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

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.

 

001#include <DHT.h>
002#include <SevenSegmentDisplay.h>
003 
004 
005 
006#define DEBUG        1
007#define TIMER_PERIOD 2400
008 
009#define ctrPIN   13 //Дискретный вывод для вентелятора
010#define dhtPIN   15 //Дискретный вход для датчика температуры
011#define btnPIN   18 //Кнопка
012 
013// Указатель на функцию перезагрузки контроллера
014void(* resetFunc) (void) = 0; // Reset MC function
015 
016// Инициируем светодиодную матрицу
017SevenSegmentDisplay<true, BiDigit<17, 16> > ss(9, 8, 7, 6, 5, 4, 3, 2);
018 
019// Инициируем DHT11 на контроллере с частотой 16МГц
020DHT dht(dhtPIN, DHT11); //16МГц
021 
022// Состояния FSM
023enum TMode
024  {
025  tmWait,       //Режим ожидания
026  tmNeedPower,  //Требуется включение вентилятора
027  tmAutoPower,  //Вентилятор работает в автоматическом режиме
028  tmManualPower //Вентилятор работает в ручном режиме
029};
030   
031// Состояния отображения
032enum TDisplayMode
033  {
034  tdmTemp       , //Отображение температуры
035  tdmHum        , //Отображение влажности
036  tdmTimer        //Отображение таймера 
037};
038   
039   
040//int h_prev;
041int t,h,a0;
042 
043int h_arr[6];
044 
045 
046 
047void setup()
048{
049// Инициируем порт отладки
050#ifdef DEBUG
051    Serial.begin(9600);
052    Serial.println("Humidity controller start ...");
053#endif
054// Инициируем выход управления
055    pinMode(ctrPIN, OUTPUT); // будем мигать лампочкой при передаче
056    digitalWrite(ctrPIN, LOW);
057// Инициируем вход с кнопкой
058    pinMode(btnPIN, INPUT);    
059//Включаем подтягивающий резистор   
060    digitalWrite(btnPIN, HIGH);
061 
062     
063// Инициируем датчик температуры DHT11   
064    dht.begin();
065// Считываем первоначальное значение влажности
066    h = dht.readHumidity();
067    for( int i=0; i<6; i++)h_arr[i] = h;
068 
069}
070 
071// Счетчик 0.5 секудных тактов
072unsigned long cnt05 = 0;
073unsigned long ms1   = 0;
074// Флаг включения света
075boolean flag_light = false;
076// Флаг нажатия кнопки
077boolean flag_btn   = false;
078// Флаг влажерсти
079boolean flag_hum   = false;
080// Считчик таймера работы вентилятора
081unsigned int timer = 0;
082TMode mode         = tmWait;
083TDisplayMode dmode = tdmTemp;
084boolean blink_stat = false;  
085 
086void loop ()
087{
088   unsigned long ms = millis();
089   int p = ms - ms1;
090 
091// Считываем состояние кнопки
092    
093   if( digitalRead(btnPIN) == LOW ){
094      int n = 1;
095      for( int i=0; i<9; i++ ){
096         if( digitalRead(btnPIN) == LOW )n++;
097         delay(10);
098      }
099      if( n > 9 )flag_btn = true;  
100      delay(400);
101#ifdef DEBUG
102      Serial.println("Button is press");
103#endif
104   }//end if    
105 
106// Проверка, что прошло не менее 0.5 сек
107   if( p < 0 || p > 500 ){
108      cnt05++;
109      ms1 = ms;
110// Считываем состояние фоторезистора
111      a0 = analogRead(A0);
112      if( a0 > 400 )flag_light = true;
113      else flag_light = false;
114// Каждые 10 секунд опрашиваем датчик DHT11 и меняем отображение дисплея    
115      if( cnt05%20 == 0 ){   
116         h = dht.readHumidity();
117         t = dht.readTemperature();
118// Если влажность изменилась на 3% или влажность превысила 85%  
119          
120         if( h - h_arr[5] > 3 || h > 85 )flag_hum = true;
121// Исправлена ошибка из предыдущей версии
122         for( int i=5; i>0; i--)h_arr[i] = h_arr[i-1];
123         h_arr[0] = h;
124#ifdef DEBUG
125         Serial.print("VAL: Temp=");
126         Serial.print(t);
127         Serial.print(" H=");
128         Serial.print(h);
129         Serial.print(" A0=");
130         Serial.print(a0);
131         Serial.print(" X=");
132         Serial.print(cnt05);
133         Serial.print(" TM=");
134         Serial.print(timer);
135         Serial.print(" MODE=");
136         Serial.print(mode);
137         Serial.print(" DMODE=");
138         Serial.print(dmode);
139         Serial.println("");
140#endif
141// Переключаем дисплей
142         switch( dmode ){
143            case tdmTemp : dmode = tdmHum; break;
144            case tdmHum  : dmode = tdmTimer; break;
145            default:       dmode = tdmTemp;
146         }//end switch
147      }//end if( cnt05%20 == 0 )  
148      blink_stat = !blink_stat;
149      SetStatusFSM();
150   }//end if( p < 0 || p > 500 ){  
151   DisplayStatus();
152 
153}//end loop()    
154 
155/**
156* Функция отображение разных параметров
157*/
158void DisplayStatus(){
159// Настройка отображения режима в   
160   int point = -1;
161   switch( mode ){
162      case tmNeedPower:
163         point = 0;
164         break;
165      case tmAutoPower:
166      case tmManualPower:
167         if( blink_stat )point = 0;
168         break;  
169   
170   switch( dmode ){
171      case tdmTemp :
172         ss.print((unsigned)t,point,50);
173         break;
174      case tdmHum  :
175         ss.print((unsigned)h,point,50);
176         break;
177      case tdmTimer:
178// Показываем минуты     
179         if( timer > 120 )ss.print((unsigned)(timer/120),point,50);
180// Показываем секунды
181         else if( timer > 0 )ss.print((unsigned)(timer/2),point,50);
182// Показываем 0
183         else ss.print(0,point,50);   
184//         ss.print((unsigned)(a0/100),point,50);
185         break;
186   }//end switch
187    
188}
189 
190 
191/**
192* Функция перехода автомата состояний
193*/
194void SetStatusFSM(){
195   switch(mode){
196// Режим ожидания    
197      case tmWait :
198         digitalWrite(ctrPIN, LOW);
199// Нажата кнопка     
200         if( flag_btn ){
201            timer = TIMER_PERIOD;
202            mode  = tmManualPower;
203         }
204// Если сработал датчик влажности
205         else if( flag_hum ){
206            timer = TIMER_PERIOD;
207            mode  = tmAutoPower;
208         }  
209// Если сработал датчик освещенности
210         else if( flag_light ){
211            timer = TIMER_PERIOD;
212            mode  = tmAutoPower;
213         }  
214         break;
215// Состояние ожилания работы вентилятора
216      case tmNeedPower:
217         digitalWrite(ctrPIN, LOW);
218// Нажата кнопка     
219         if( flag_btn ){
220            mode  = tmManualPower;
221         }
222// Свет выключен
223        else if( !flag_light ){
224           mode  = tmWait;
225       }
226         break;
227// Состояние "Вентилятор работает в автомате"
228      case tmAutoPower:
229// Включить вентилятор
230         digitalWrite(ctrPIN, HIGH);
231// Таймер считает
232         if( timer > 0 )timer--;
233// Нажата кнопка     
234         if( flag_btn ){
235            mode  = tmWait;
236            timer = 0;
237         }
238// Таймер сработал
239         else if( timer <= 0 ){
240            timer = 0;
241            mode  = tmWait;
242         }
243         break;
244// Состояние "Вентилятор работает в ручном режиме"
245      case tmManualPower:
246// Включить вентилятор
247         digitalWrite(ctrPIN, HIGH);
248// Таймер считает
249         if( timer > 0 )timer--;
250// Нажата кнопка     
251         if( flag_btn ){
252            mode  = tmWait;
253            timer = 0;
254         }
255// Таймер сработал
256         else if( timer <= 0 ){
257            timer = 0;
258            mode  = tmWait;
259         }
260         break;
261   }
262// Сбросить флани кнопка и влажность  
263   flag_btn = false;
264   flag_hum = false;
265 
266}

 

николай76
Offline
Зарегистрирован: 08.06.2019

Прошу помощи!

Индикатор от стиральной машинки 3х разрядный общий анод. Один сегмент у которого изображён как часики. Я его использую в место разделительной точки(очень симпатично смотрится когда работает таймер). Подскажите пожалуйста где в каких строках что дописать чтоб на самом левом разряде зажигались буквы H и C во время влажности и температуры. В программировании не силён. Изменил только на 3-х разрядный и левый разряд анод посадил на PB5.

// Инициируем светодиодную матрицу

SevenSegmentDisplay<true, TriDigit<19, 17, 16> > ss(9, 8, 7, 6, 5, 4, 3, 2);// поменял на 3-х разрядный и подключил на PB5