Вентиляция в бане
- Цена: 1690 р
- Перейти в магазин
Вентиляция в бане
Воздушная заслонка.
Габаритные размеры.
Длина — 150 мм
Диаметр 100 мм.
Изготовлена из нержавеющей стали.
Имеет моторизованный редуктор на 220 В.
Клапан снабжен силиконовым уплотнителем.
Опорный подшипник клапана пластиковый.
Китайцы заявляют следующие параметры:
Напряжение питания 220 В
Потребляемая мощность 4 Вт
Номинальный крутящий момент 1 Н*м
Срок службы 60 000 закрытий.
Схема подключения:
Центральный контакт — ноль.
Крайние — фаза на открытие или закрытие.
Качество изготовления — хорошее.
Я покупал их в 2020 году по цене от 12 до 14 USD.
Хотел потренироваться сначала на бане, а потом сделать приточно-вытяжную для дома.
Но вот только сейчас руки дошли до бани.
Итак. Баня имеет размер 12 х 6 м. Проекта не было, был эскиз.
Получилось вот что:
Схема вентиляции:
Работать должна так.
1. При нажатии кнопки вытяжки, земля подается на вход сенсора 1, открывается задвижка 1 и включается вентилятор.
При выключении кнопки — задвижка 1 закрывается.
2. При обнаружении человека в туалете открывается задвижка 2, взводится таймер.
После удаления человека из туалета через время timeout закрывается задвижка 2
3. При обнаружении человека в душе открывается задвижка 3, взводится таймер.
После удаления человека из душа через время timeout закрывается задвижка 3
4. Вентилятор включен если нажата кнопка вытяжки или взведен хоть один таймер
Вот такой простой алгоритм.
И еще. Из вытяжки на кухне я выдрал встроенный вентилятор.
Я не понимаю зачем в этом приборе нужно управление скоростью вращения вентилятором.
В итоге я припаял к кнопкам реле и сухим контактом даю сигнал на ноль для блока управления вентиляцией.
Вентиляционные трубы покупал в Леруа.
Вентилятор канальный.
По чем брал уже не помню. Сейчас аналогичные в Леруа от 2,500 р.
Блок управления.
Собран на базе Arduino.
В качестве сенсоров перепробовал всякие. В итоге использовал модули hsf-dc6, как наиболее стабильные.
Покупал здесь: https://aliexpress.ru/item/item/32786483344.html
Поскольку я хотел попробовать разные датчики, на плате установил Джампер J1, переключающий напряжение питания сенсоров 3,3V, 5V.
Для питания 3,3V используется DC-DC преобразователь.
Покупал здесь: https://aliexpress.ru/item/item/32320177001.html
Ко входу A0 Arduino подключен многооборотный переменный резистор, служащий для установки задержки выключения вентилятора и закрытия клапана воздуховода. Сопротивление может быть любым разумным.
Поскольку это не серийное устройство я установил LCD индикатор, подключенный по шине I2C.
В качестве питания использовал какой то бэушный преобразователь. Покупал давно, найти продавца не могу. Выглядит вот так:
Ну и последний модуль — плата с реле на 4 канала.
Покупал здесь: https://aliexpress.ru/item/item/32649659086.html
Сначала было желание развести и заказать плату в Китае.
Но пошел по пути наименьшего сопротивления и распаял модули на макетке.
Вот что получилось.
Все поместил в коробочку, купленную в Леруа.
Протестил.
И установил на чердаке в бане.
Ниже привожу код. Может кому будет полезно.
// #define DEBUG
#define LCD
#include <Wire.h>
#include <avr/interrupt.h>
#ifdef LCD
#include <LiquidCrystal_I2C.h>
#endif
#define LEDPIN 13
// реле включаются при низком потенциале на входе
#define ON LOW
#define OFF HIGH
// Назначение Pins
const int RRR = A0; // Потенциометр, устанавливает timeout.
const int sensor1 = 2; // Датчик Кухни. Сухой контакт реле при
// срабатывании замыкается на землю.
const int valve1 = 5; // Задвижка кухни.
const int sensor2 = 3; // Датчик Туалета.
const int valve2 = 6; // Задвижка Туалета.
const int sensor3 = 4; // Датчик Душа.
const int valve3 = 7; // Задвижка Душа.
const int fan = 8; // Вентилятор.
unsigned int timerValve2; // Таймер задвижки туалета
unsigned int timerValve3; // Таймер задвижки душа
#ifdef LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Инициализируем дисплей
#endif
// Тест исполнительного механизма (задвижки, вентилятора)
void test_drive(int pin, char* name){
char buff[20];
digitalWrite(pin, ON); // Открываем задвижку
lcd.setCursor(0, 1);
strcpy(buff,name);
strcat(buff, " On ");
lcd.print(buff);
delay(3000); // Три секунды задержка
lcd.setCursor(0, 1);
strcpy(buff,name);
strcat(buff, " Off ");
lcd.print(buff);
digitalWrite(pin, OFF); // Закрываем задвижку
delay(1000);
}
// Проверка работы систем на 3 секунды послеовательно включаем каждый прибор.
void test_env(){
lcd.clear();
lcd.noAutoscroll();
lcd.setCursor(0, 0);
lcd.print("Valve & Fun Test");
lcd.setCursor(0, 1);
lcd.print("All Valve Closed");
digitalWrite(valve1, OFF); // Все закрываем, выключаем
digitalWrite(valve2, OFF);
digitalWrite(valve3, OFF);
digitalWrite(fan, OFF);
delay(1000); // 1 секунда задержка
test_drive(valve1, "Valve1");
test_drive(valve2, "Valve2");
test_drive(valve3, "Valve3");
test_drive(fan, "Fan");
lcd.clear();
}
//-------------------------------------------
void setup() {
// Устанавливаем режи работы Pin
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
pinMode(sensor3, INPUT);
pinMode(valve1, OUTPUT);
pinMode(valve2, OUTPUT);
pinMode(valve3, OUTPUT);
pinMode(fan, OUTPUT);
pinMode(RRR, INPUT);
timerValve2 = 0;
timerValve3 = 0;
// инициализация Timer1. Будет делать прерывания раз в секунду
cli(); // отключить глобальные прерывания
TCCR1A = 0; // установить регистры в 0
TCCR1B = 0;
OCR1A = 15624; // установка регистра совпадения
TCCR1B |= (1 << WGM12); // включение в CTC режим
// Установка битов CS10 и CS12 на коэффициент деления 1024
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS12);
TIMSK1 |= (1 << OCIE1A); // включение прерываний по совпадению
sei(); // включить глобальные прерывания
#ifdef LCD
// Инициализация дисплея
lcd.init();
lcd.backlight(); // Включаем подсветку дисплея
#endif
#ifdef DEBUG
// Инициализация serial
Serial.begin(9600);
#endif
// установка внутреннего референсного источника
analogReference(DEFAULT);
// Проверяем задвижки и вентиллятор
test_env();
// Выводим строку заголовка
lcd.setCursor(0, 0);
lcd.print(" Fan");
}
//-------------------------------------------
// Читаем значение потенциометра
// и делим на 4
int set_timer_val(){
const int meterings = 50; // Усредняем показания по 50-ти значениям
int delay = 0;
for(int x=0; x < meterings; x++)
delay += analogRead(RRR);
delay /= (meterings * 4);
#ifdef DEBUG
Serial.println(delay);
#endif
return delay;
}
#ifdef LCD
//-------------------------------------------
// Вывод на дисплей состояния датчиков
void siaplay_sensors(int c1, int c2, int c3){
// c1 - датчик вытяжки
// c2 - датчик туалета
// c3 - датчик душа
lcd.setCursor(0, 1); // Состояние датчика 1
if(c1 == HIGH)
lcd.print("On ");
else
lcd.print("Off");
lcd.setCursor(4, 1); // Состояние датчика 2
if(c2 == HIGH)
lcd.print("On ");
else
lcd.print("Off");
lcd.setCursor(8, 1); // Состояние датчика 2
if(c3 == HIGH)
lcd.print("On ");
else
lcd.print("Off");
}
//-------------------------------------------
// Вывод на дисплей состояния таймеров
void display_timers(int c1, int t2, int t3, int timeout) {
// c1 - датчик вытяжки
// t2 - таймер включения вытяжки туалета
// t3 - таймер включения вытяжки душа
char tmp_str[3];
lcd.setCursor(0, 0);
sprintf(tmp_str, "%3d", timeout);
lcd.print(tmp_str);
lcd.setCursor(4, 0);
sprintf(tmp_str, "%3d", t2);
lcd.print(tmp_str);
lcd.setCursor(8, 0);
sprintf(tmp_str, "%3d", t3);
lcd.print(tmp_str);
lcd.setCursor(13, 1);
if (c1 == HIGH || t2 > 0 || t3 > 0)
lcd.print("On ");
else
lcd.print("Off");
}
#endif
//-------------------------------------------
// Обработка прерывания каждую секунду
ISR(TIMER1_COMPA_vect) {
digitalWrite(LEDPIN, !digitalRead(LEDPIN)); // Мигаем светодиодом
if (timerValve2 > 0) // если таймер заслонки туалета больше 0
timerValve2--; // уменьшаем его на единицу
if (timerValve3 > 0) // если таймер заслонки душа больше 0
timerValve3--; // уменьшаем его на единицу
}
//-------------------------------------------
// Основной цикл
void loop() {
int fanDelay = set_timer_val(); // Устанавливаем время работы вентилятора
int s1 = !digitalRead(sensor1); // Инверсный сигнал. 0 - включен
int s2 = digitalRead(sensor2);
int s3 = digitalRead(sensor3);
// реле включаются при нулевом потенциале на входе
if (s1 == HIGH) // Если нажата кнопка вытяжки
digitalWrite(valve1, ON); // Открываем воздушный клапан
else
digitalWrite(valve1, OFF);
if (s2 == HIGH) { // Сработал датчик туалета
timerValve2 = fanDelay; // Устанавливаем таймер
digitalWrite(valve2, ON); // Открываем клапан
}
if (timerValve2 == 0) // таймер закончился?
digitalWrite(valve2, OFF);// Закрываем клапан
if (s3 == HIGH) { // То же самое с душем
timerValve3 = fanDelay;
digitalWrite(valve3, ON);
}
if (timerValve3 == 0)
digitalWrite(valve3, OFF);
// управляем вентилятором
if (s1 == HIGH || // Если нажата кнопка вытяжки или
timerValve2 != 0 || // активен любой таймер, то
timerValve3 != 0)
digitalWrite(fan, ON); // включаем вентилятор
else
digitalWrite(fan, OFF); // иначе - выключаем
#ifdef LCD
siaplay_sensors(s1, s2, s3); // показать состояния сенсоров
display_timers(s1, timerValve2, timerValve3, fanDelay); // показать состояние таймеров
#endif
}
Планирую купить
+9
Добавить в избранное
Обзор понравился
+39
+54
// #define DEBUG
#define LCD
#include <Wire.h>
#include <avr/interrupt.h>
#ifdef LCD
#include <LiquidCrystal_I2C.h>
#endif
#define LEDPIN 13
// реле включаются при низком потенциале на входе
#define ON LOW
#define OFF HIGH
// Назначение Pins
const int RRR = A0; // Потенциометр, устанавливает timeout.
const int sensor1 = 2; // Датчик Кухни. Сухой контакт реле при
// срабатывании замыкается на землю.
const int valve1 = 5; // Задвижка кухни.
const int sensor2 = 3; // Датчик Туалета.
const int valve2 = 6; // Задвижка Туалета.
const int sensor3 = 4; // Датчик Душа.
const int valve3 = 7; // Задвижка Душа.
const int fan = 8; // Вентилятор.
unsigned int timerValve2; // Таймер задвижки туалета
unsigned int timerValve3; // Таймер задвижки душа
#ifdef LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Инициализируем дисплей
#endif
// Тест исполнительного механизма (задвижки, вентилятора)
void test_drive(int pin, char* name){
char buff[20];
digitalWrite(pin, ON); // Открываем задвижку
lcd.setCursor(0, 1);
strcpy(buff,name);
strcat(buff, " On ");
lcd.print(buff);
delay(3000); // Три секунды задержка
lcd.setCursor(0, 1);
strcpy(buff,name);
strcat(buff, " Off ");
lcd.print(buff);
digitalWrite(pin, OFF); // Закрываем задвижку
delay(1000);
}
// Проверка работы систем на 3 секунды послеовательно включаем каждый прибор.
void test_env(){
lcd.clear();
lcd.noAutoscroll();
lcd.setCursor(0, 0);
lcd.print("Valve & Fun Test");
lcd.setCursor(0, 1);
lcd.print("All Valve Closed");
digitalWrite(valve1, OFF); // Все закрываем, выключаем
digitalWrite(valve2, OFF);
digitalWrite(valve3, OFF);
digitalWrite(fan, OFF);
delay(1000); // 1 секунда задержка
test_drive(valve1, "Valve1");
test_drive(valve2, "Valve2");
test_drive(valve3, "Valve3");
test_drive(fan, "Fan");
lcd.clear();
}
//-------------------------------------------
void setup() {
// Устанавливаем режи работы Pin
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
pinMode(sensor3, INPUT);
pinMode(valve1, OUTPUT);
pinMode(valve2, OUTPUT);
pinMode(valve3, OUTPUT);
pinMode(fan, OUTPUT);
pinMode(RRR, INPUT);
timerValve2 = 0;
timerValve3 = 0;
// инициализация Timer1. Будет делать прерывания раз в секунду
cli(); // отключить глобальные прерывания
TCCR1A = 0; // установить регистры в 0
TCCR1B = 0;
OCR1A = 15624; // установка регистра совпадения
TCCR1B |= (1 << WGM12); // включение в CTC режим
// Установка битов CS10 и CS12 на коэффициент деления 1024
TCCR1B |= (1 << CS10);
TCCR1B |= (1 << CS12);
TIMSK1 |= (1 << OCIE1A); // включение прерываний по совпадению
sei(); // включить глобальные прерывания
#ifdef LCD
// Инициализация дисплея
lcd.init();
lcd.backlight(); // Включаем подсветку дисплея
#endif
#ifdef DEBUG
// Инициализация serial
Serial.begin(9600);
#endif
// установка внутреннего референсного источника
analogReference(DEFAULT);
// Проверяем задвижки и вентиллятор
test_env();
// Выводим строку заголовка
lcd.setCursor(0, 0);
lcd.print(" Fan");
}
//-------------------------------------------
// Читаем значение потенциометра
// и делим на 4
int set_timer_val(){
const int meterings = 50; // Усредняем показания по 50-ти значениям
int delay = 0;
for(int x=0; x < meterings; x++)
delay += analogRead(RRR);
delay /= (meterings * 4);
#ifdef DEBUG
Serial.println(delay);
#endif
return delay;
}
#ifdef LCD
//-------------------------------------------
// Вывод на дисплей состояния датчиков
void siaplay_sensors(int c1, int c2, int c3){
// c1 - датчик вытяжки
// c2 - датчик туалета
// c3 - датчик душа
lcd.setCursor(0, 1); // Состояние датчика 1
if(c1 == HIGH)
lcd.print("On ");
else
lcd.print("Off");
lcd.setCursor(4, 1); // Состояние датчика 2
if(c2 == HIGH)
lcd.print("On ");
else
lcd.print("Off");
lcd.setCursor(8, 1); // Состояние датчика 2
if(c3 == HIGH)
lcd.print("On ");
else
lcd.print("Off");
}
//-------------------------------------------
// Вывод на дисплей состояния таймеров
void display_timers(int c1, int t2, int t3, int timeout) {
// c1 - датчик вытяжки
// t2 - таймер включения вытяжки туалета
// t3 - таймер включения вытяжки душа
char tmp_str[3];
lcd.setCursor(0, 0);
sprintf(tmp_str, "%3d", timeout);
lcd.print(tmp_str);
lcd.setCursor(4, 0);
sprintf(tmp_str, "%3d", t2);
lcd.print(tmp_str);
lcd.setCursor(8, 0);
sprintf(tmp_str, "%3d", t3);
lcd.print(tmp_str);
lcd.setCursor(13, 1);
if (c1 == HIGH || t2 > 0 || t3 > 0)
lcd.print("On ");
else
lcd.print("Off");
}
#endif
//-------------------------------------------
// Обработка прерывания каждую секунду
ISR(TIMER1_COMPA_vect) {
digitalWrite(LEDPIN, !digitalRead(LEDPIN)); // Мигаем светодиодом
if (timerValve2 > 0) // если таймер заслонки туалета больше 0
timerValve2--; // уменьшаем его на единицу
if (timerValve3 > 0) // если таймер заслонки душа больше 0
timerValve3--; // уменьшаем его на единицу
}
//-------------------------------------------
// Основной цикл
void loop() {
int fanDelay = set_timer_val(); // Устанавливаем время работы вентилятора
int s1 = !digitalRead(sensor1); // Инверсный сигнал. 0 - включен
int s2 = digitalRead(sensor2);
int s3 = digitalRead(sensor3);
// реле включаются при нулевом потенциале на входе
if (s1 == HIGH) // Если нажата кнопка вытяжки
digitalWrite(valve1, ON); // Открываем воздушный клапан
else
digitalWrite(valve1, OFF);
if (s2 == HIGH) { // Сработал датчик туалета
timerValve2 = fanDelay; // Устанавливаем таймер
digitalWrite(valve2, ON); // Открываем клапан
}
if (timerValve2 == 0) // таймер закончился?
digitalWrite(valve2, OFF);// Закрываем клапан
if (s3 == HIGH) { // То же самое с душем
timerValve3 = fanDelay;
digitalWrite(valve3, ON);
}
if (timerValve3 == 0)
digitalWrite(valve3, OFF);
// управляем вентилятором
if (s1 == HIGH || // Если нажата кнопка вытяжки или
timerValve2 != 0 || // активен любой таймер, то
timerValve3 != 0)
digitalWrite(fan, ON); // включаем вентилятор
else
digitalWrite(fan, OFF); // иначе - выключаем
#ifdef LCD
siaplay_sensors(s1, s2, s3); // показать состояния сенсоров
display_timers(s1, timerValve2, timerValve3, fanDelay); // показать состояние таймеров
#endif
}
- Обзор электронной книги ONYX BOOX 7.8” Kon-Tiki 3 и сравнение с 7.8” Edison
- Акция на беспроводной, трёх диапазонный Wi-Fi 6E роутер Tenda AX5700 RX27 Pro (цена 9560р)
- Точилка Claw Element - обзор личных впечатлений.
- Пробная офтальмологическая оправа HTF-1 для оптических линз
- Перья-стабы от Goulet Pens, 1.1 и 1.5 мм
- Краткий обзор электронной книги LikeBook S62
- RFID-ридеры из МФУ и анатомия кредитки
- Переделка питания мультиметра от Li-Ion 18650. Крону — долой
- Вулканизирующая изолента TDM Electric. Что ты такое?..
- Сверла Graff с алмазным напылением по керамограниту. Сверлят или нет?