Контроллер управления вытяжным вентилятором в ванной
- Войдите на сайт для отправки комментариев
Мои требования к устройству управления
- устройство управления должно работать в автоматическом режиме;
- вентилятор должен включаться от повышения влажности;
- включение вентилятора не должно зависеть от текущего уровня влажности в квартире;
- вентилятор должен работать, когда в ванной комнате никого нет;
- устройство управление должно быть максимально простым и дешевым;
Компоненты
- микроконтроллер 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.
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
// Указатель на функцию перезагрузки контроллера
014
void
(* resetFunc) (
void
) = 0;
// Reset MC function
015
016
// Инициируем светодиодную матрицу
017
SevenSegmentDisplay<
true
, BiDigit<17, 16> > ss(9, 8, 7, 6, 5, 4, 3, 2);
018
019
// Инициируем DHT11 на контроллере с частотой 16МГц
020
DHT dht(dhtPIN, DHT11);
//16МГц
021
022
// Состояния FSM
023
enum
TMode
024
{
025
tmWait,
//Режим ожидания
026
tmNeedPower,
//Требуется включение вентилятора
027
tmAutoPower,
//Вентилятор работает в автоматическом режиме
028
tmManualPower
//Вентилятор работает в ручном режиме
029
};
030
031
// Состояния отображения
032
enum
TDisplayMode
033
{
034
tdmTemp ,
//Отображение температуры
035
tdmHum ,
//Отображение влажности
036
tdmTimer
//Отображение таймера
037
};
038
039
040
//int h_prev;
041
int
t,h,a0;
042
043
int
h_arr[6];
044
045
046
047
void
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 секудных тактов
072
unsigned
long
cnt05 = 0;
073
unsigned
long
ms1 = 0;
074
// Флаг включения света
075
boolean flag_light =
false
;
076
// Флаг нажатия кнопки
077
boolean flag_btn =
false
;
078
// Флаг влажерсти
079
boolean flag_hum =
false
;
080
// Считчик таймера работы вентилятора
081
unsigned
int
timer = 0;
082
TMode mode = tmWait;
083
TDisplayMode dmode = tdmTemp;
084
boolean blink_stat =
false
;
085
086
void
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
*/
158
void
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
*/
194
void
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
}
Прошу помощи!
Индикатор от стиральной машинки 3х разрядный общий анод. Один сегмент у которого изображён как часики. Я его использую в место разделительной точки(очень симпатично смотрится когда работает таймер). Подскажите пожалуйста где в каких строках что дописать чтоб на самом левом разряде зажигались буквы H и C во время влажности и температуры. В программировании не силён. Изменил только на 3-х разрядный и левый разряд анод посадил на PB5.
// Инициируем светодиодную матрицу
SevenSegmentDisplay<true, TriDigit<19, 17, 16> > ss(9, 8, 7, 6, 5, 4, 3, 2);// поменял на 3-х разрядный и подключил на PB5