Контроллер управления вытяжным вентилятором в ванной
- Войдите на сайт для отправки комментариев
Мои требования к устройству управления
- устройство управления должно работать в автоматическом режиме;
- вентилятор должен включаться от повышения влажности;
- включение вентилятора не должно зависеть от текущего уровня влажности в квартире;
- вентилятор должен работать, когда в ванной комнате никого нет;
- устройство управление должно быть максимально простым и дешевым;
Компоненты
- микроконтроллер Atmega328P-PU с панелькой;
- макетная плата;
- датчик температуры и влажности DHT11;
- двухразрядный семисегментый индикатор CPS03621BR от неработающих часов;
- фоторезистор из коробочики с радиолюбительским хламом;
- стабилизатор напряжения на LM2596;
- симистор BT137;
- оптосимистор MOC3061 для гальванической развязки;
- кнопка и несколько резисторов
- корпус из под старой кроссовой коробочки от телефонной станции
Алгоритм работы
Микроконтроллер с периодичностью раз в 10 секунд меряет влажность и температуру.
Влажность циклически накапливается в архиве из 6 значений. Если текущая влажность выше первой из архива более чем на 3% либо абсолютное значение влажности выше 85%, значит нужно включать вентилятор.
Вентилятор включается на 20 минут при отсутствии света на фоторезисторе.
Кнопка принудительно включает вентилятор на 20 минут (если он не работает) или выключает (если работает).
Все константы в алгоритме подбирались эксперементальным путем.
Индикатор циклически показывает текущую температуру, влажность и таймер обратного отчета.
Точка второго разряда горит, если требуется понижение влажности и мигает, если подана команда на включения вентилятора.
Cхема


Более подробное описание в моем блоге
Главное не написали - кота как зовут?
Главное не написали - кота как зовут?
Кота зовут Тимофей. Главный помощник
Хорошая работа! Приятно читать, все просто и по делу
Ванная: У меня все наоборот. Кот орет когда я парюсь в ванной, а его не пустил повалятся на полке в тепле и влаге.
Туалет: А вентиляцию в туалете решил простым вырезанием прямоугольника для пролезания кота к своему туалету-ванночке. Второе решение получил приточную вытяжку всех запахов сразу.
Но руки чешутся какой-нибудь микропроцессор присобачить туда :) рядом с нотебуком.
А работа прекрасная.
Но руки чешутся какой-нибудь микропроцессор присобачить туда :)
Сделать автоматическую дверь для кота и в туалет, и в ванну :)
Плдскажите лучше, как сделать анализатор запахов, чтобы после кота (или не кота) включался вентилятор в талете
Плдскажите лучше, как сделать анализатор запахов, чтобы после кота (или не кота) включался вентилятор в талете
просто вырезать прямоугольник в двери внизу
закрывать эту дырку не дело
все равно с пола никто снизу за вами ничего не поглядит
я когда електролобзиком вырезал проверял
целых 10 лет тот кусок хранил думал дверь может сделать
и проследить
1 естественная вытяжная ветиляция в доме есть
2 любую ставню на микропроветривание
3 на улице зелени много
по маршруту приточной вентиляции всегда свежий воздух
вы никогда не знаете что кто-то где-то делает свои дела пока не услышите шкрябанье лапой
мой почемуто когда сделает свое дело выходит и делает мяв
видимо все можем бежать убирать его высочество облегчилось
прикольно так
откройте балкон например чуть приоткройте дверь туалета и листок бумажки к двери
куда дует
в дом или естественная вентиляция сосать начинает
все гениальное просто
Не знаю как у вас. Мой кот когда посрет (извините за подробности) - вонь стоит такая, что, никакая вентиояция не успевает :)
И чем меньше дырок щелей, тем лучше.
Если бы в это время включалась вытяжная вентиляция, запах бы удалялся быстрее.
Вот думаю, может обучить кота кнопку нажимать. ;)
на уровне кота поставить датик присутствия или движения
например светодиодный барьер прямо над кошачим туалетом, где кроме кота никто не может нарушить барьер
По запаху было бы надежнее. Есть причина - есть действие.
По всему остальному, мне кажется, будет много ложных срабатываний. Эта зараза иногда в туалет забегает спрятаться, когда играет.
увы, датчиков запаха пока нет)) есть датчики на разные типы газов. так что сначала надо понять какие газы производит кот))
Наполнитель на основе опилок, вне туалета никакого запаха
Наполнитель на основе опилок, вне туалета никакого запаха
Это слишком просто. Не наш путь. Да и не прижился у нас наполнитель.
Отлично. Но с анализом газов пока тяжко все.. а вот про кнопку где то я уже слышал.
Научить кота пользоваться кнопкой - это прорыв на стыке двух наук
Еще хороший сигнал, поймать звук, когда код начинает заскребать. Главное, чтобы, как при хлопанье в ладоши, не было ложгых срабатываний
Ложные срабатывания не критично. Это же вентилятор будет включаться, а не термоядерная реакция стартовать. На самом деле решение простое. Датчик присутствия на кошачем лотке.
АААА! Захожу на тему, а тут коты про свои туалеты общаются!
А по теме - в принципе когда кот играет (пусть и в своем туалете :) он будет пригибаться, а при "делах и делишках" высоко и неподвижно сидеть гордо выгнув спину в течении 5-10 секунд. вот это и надо "ловить".
Пластерем запасись и бинтами прежде чем ловить гордо выгнувшего кота.
Вот что имелось ввиду под "ловить" ))))
на уровне кота поставить датик присутствия или движения
например светодиодный барьер прямо над кошачим туалетом, где кроме кота никто не может нарушить барьер
Это не факт.. вот тут всякие с совочками лазят по туалету а потом из лотка все пропадает.
Нарисовался такой алгоритм:
Имеется три датчика - инфракрасный, фотодатчик и микрофон.
1. Инфракрасный ловит последовательность: Движение, пауза на 10сек и более, снова движение. Взводится флаг.
2. Если микрофон фиксирует продолжительный звук - загребания кота или смыв унитаза, включаем вентилятор на 5 минут
3. Если при этом не было света - "кот детектед" - посылаем хозяину СМС: "Убери за котом"
4. Если микрофон не зафиксировал звука за 5 минут, флаг сбрасываем.
значит сверху направить, и потом совочек же не держат по долгу на одном месте? Или кот реактивно нужду справляет?
значит сверху направить, и потом совочек же не держат по долгу на одном месте? Или кот реактивно нужду справляет?
Ну если после совочка включиться вентилятор, то тоже хорошо.
Кот справляет нужду по разному, но не менее 10 сек, мне кажется. Да и человек тоже.
Все равно все тайминги по факту по факту корректировать.
А микрофон вы чем собрались обрабатывать?
Ничем не буду.
Снимаю показания постоянно с порта, добустим, кждые 0.1 - 0.2 сек. И суммирую 10-50 последних значений.
Обрабатывется горомкость + продолжительность.
Можно конечно еще спектроанализатор, как в эквалайзере подключить. Но это уже следующий этап.
Начну с установки всех датчиков в туалете и сбора статистики.
Меня последние лет 10 страшно поражают люди которые носяться со своими туалетами.. то они тратят несколько тысяч что бы сделать там теплый пол, теперь с вентиляторами.. у меня вопрос, сколько времени вв проводите в туалете что вам таки архи важно потратить на него кучу времени и средств.
Лично я трачу время не на туалет, а на свое хобби.
Есть задача, пусть высосанная из пальца - мне интересно ее решить.
p.s. А денег на это потратится не так уж и много.
Задача в данном случае высасывается из туалета :)
Неверю что не нашлось более интересной задачи.
А чем эта задача не интересна? Еще ни кем не решалась :)
Как раз разобрался со своей погодной станцией. Осталась куча деталек.
Переделал контроллер
Теперь он на ESP8266. Вроде как и не по теме сайта, но запрограммирован в Arduino IDE
В общем, кому интересно, здесь проект:
Контроллер управления вентилятором 2. Теперь с WiFi
Программирование и настройка WiFi контроллера управления вентилятором
Доброго времени, sav13.
Можно ли с Вами как-нибудь в личке поговорить об некоторых изменениях в этом Вашем проекте.
Сам в программировании еще не силен. Небольшие переделки еще сам не осилю...
Доброго времени, Уважаемые.
Спасибо автору за проделанную работу.
Немного изменил скетч под свои нужды:
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; }Прошу помощи!
Индикатор от стиральной машинки 3х разрядный общий анод. Один сегмент у которого изображён как часики. Я его использую в место разделительной точки(очень симпатично смотрится когда работает таймер). Подскажите пожалуйста где в каких строках что дописать чтоб на самом левом разряде зажигались буквы H и C во время влажности и температуры. В программировании не силён. Изменил только на 3-х разрядный и левый разряд анод посадил на PB5.
// Инициируем светодиодную матрицу
SevenSegmentDisplay<true, TriDigit<19, 17, 16> > ss(9, 8, 7, 6, 5, 4, 3, 2);// поменял на 3-х разрядный и подключил на PB5