Проект автоматического управления вытяжным вентилятором на ардуино
Очень часто в наших домах возникает проблема с работой естественной вентиляции. Особенно в ванной комнате. В результате: высокая влажность, появление плесени и т.п. Установив вытяжной вентилятор, эти проблемы уходят, но появляются другие. Например, если вентиляция включается с освещением, то приходится оставлять его включённым, чтобы проветрить ванну после использования. Это не удобно из-за того, что приходиться следить, когда комната проветрится и выключать (а вентиляторы с таймером могут не справляться с этой задачей, так как имеют фиксированное значение времени таймера). А если мы хотим использовать ванну, не включая воду, то вентиляция тоже работает, хотя и не нужна. Всё это приводит к финансовым затратам. Кроме того, если во время использования ванны вентилятор работает постоянно, то может становиться холодно и некомфортно.
Микроконтроллер Arduino в моём проекте берёт на себя задачу управления включением и выключением вентилятора в режиме, который подходит лично для меня и экономит мои средства. Так как я не нашёл в интернете подобного простого и подходящего мне проекта на ардуино, решил его сделать сам. Совместив разные варианты, я получил свой проект, который эффективно работает в моей ванне уже год.
Цель проекта
Сборка проекта
Для сборки проекта нужны следующие компоненты из набора Arduino GyverKIT PRO:
- Плата Arduino Nano
- Блок питания 5В
- Одноканальное электромеханическое реле, работающее от 5 вольт
- Сенсорная кнопка ТТР223 в режиме триггера, запаять перемычку В (любая кнопка)
- Дисплей ТМ1637 (можно изменить код под любой дисплей из набора)
- Датчик температуры и влажности HTU21D (можно изменить код под любой датчик)
- Фоторезистор и 1 резистор на 10 КОм
- Беспаечная макетная плата
- Соединительные провода (мама-папа, папа-папа)
Схема проекта:



Программирование
Скетч я написал с учётом датчика влажности HTU21D и сенсорной кнопки из набора. Используется две библиотеки: GyverHTU21D.h и GyverTM1637.h. Скетч ещё нуждается в доработке, но в целом он рабочий.
Скетч
#include <GyverHTU21D.h > // подключаем библиотеку для работы с датчиком HTU21D
GyverHTU21D htu; // инициализация
#define RELAY 2 // пин реле
#include <GyverTM1637.h> // библиотека дисплея
#define CLK 6 // пин CLK дисплей
#define DIO 5 // пин DIO дисплей
GyverTM1637 disp(CLK, DIO); // подключаем дисплей
unsigned long p; // переменная для millis()
long i = 12000; // период чтения показаний датчика HTU21D
long F = 1000; // период чтения фоторезистора
long s = 120000; // период включения и выключения реле в режиме 2
int RelayState = LOW; // изначально реле выключено
int h = 0; // переменная влажности сначала равна 0
int t = 0; // переменная температуры сначала равна 0
int OldOneHum = 0; // переменные для работы с дисплеем
int OldTwoHum = 0;
int OldOneTem = 0;
int OldTwoTem = 0;
#define PinButton 7 // пин сенсорной кнопки в режиме триггера
uint32_t Now, clocktimer; // 2 переменные дисплея
boolean flag;
const int PIN_Photosensor = A7; // указываем пин к которому подключен фоторезистор
int sensorValue = 0; // объявляем переменную для хранения значений фоторезистора
void setup()
{
Serial.begin(9600); // работа с дисплеем
disp.clear(); // очистка дисплея
disp.brightness(7); // яркость, 0 - 7 (минимум - максимум)
byte hell[4] = {_A, _B, _C, _D}; // выводим при включении заставку на дисплей
disp.twistByte(hell, 50);
htu.begin(); // запустить датчик
pinMode(RELAY, OUTPUT);
pinMode(PinButton, INPUT);
pinMode(PIN_Photosensor, INPUT);
}
void loop() {
if (htu.readTick(i) ) { // чтение датчика с периодом i
t = htu.getTemperature() ; // чтение температуры
h = htu.getHumidity() ; // чтение влажности
}
//выводим на дисплей показания датчика. Можно использовать любой эффект из библиотеки.
int NewOneHum = h / 10; // первая цифра дисплея показывает десятичные данных влажности
int NewTwoHum = h % 10; // вторая цифра дисплея показывает единичные данных влажности
int NewOneTem = t / 10; // третья цифра дисплея показывает десятичные данных температуры
int NewTwoTem = t % 10; // четвертая цифра дисплея показывает десятичные данных температуры
if (NewOneHum != OldOneHum) { // эффектное изменение цифры 1
OldOneHum = NewOneHum;
disp.scroll(0, OldOneHum, 50);
}
if (NewTwoHum != OldTwoHum) { // эффектное изменение цифры 2
OldTwoHum = NewTwoHum;
disp.scroll(1, OldTwoHum, 50);
}
if (NewOneTem != OldOneTem) { // эффектное изменение цифры 3
OldOneTem = NewOneTem;
disp.scroll(2, OldOneTem, 50);
}
if (NewTwoTem != OldTwoTem) { // эффектное изменение цифры 4
OldTwoTem = NewTwoTem;
disp.scroll(3, OldTwoTem, 50);
}<
//Считываем значения с фоторезистора через время F
if (millis() - p >= F) {
sensorValue = analogRead(PIN_Photosensor);
p = millis();
}
//Режимы работы вентилятора в зависимости от показаний фоторезистора, датчика влажности и кнопки
// Режим 1: если не нажата кнопка и влажность меньше 50%, то реле выключить
if (digitalRead(PinButton) == 0 && h < 50) {
digitalWrite(RELAY, LOW);
RelayState = LOW;
}
// Режим 2: если свет горит и не нажата кнопка и влажность между 50% и 97%, то реле включать и
// выключать с периодом s
else if (sensorValue > 200 && h >= 50 && h <= 97 && digitalRead(PinButton) == 0) {
digitalWrite(RELAY, RelayState);
if (millis() - p >= s) {
p = millis();
RelayState = !RelayState;
}
}
// Режим 3: если свет горит и не нажата кнопка и влажность больше 97%, то реле включить
else if (sensorValue > 200 && digitalRead(PinButton) == 0 && h > 97) {
digitalWrite(RELAY, HIGH);
RelayState = HIGH;
}
// Режим 4: если свет не горит и не нажата кнопка и влажность больше 50%, то реле включить
else if (sensorValue < 200 && h >= 50 && digitalRead(PinButton) == 0) {
digitalWrite(RELAY, HIGH);
}
// Режим 5: Если кнопка нажата, то вентилятор работает постоянно
else if (digitalRead(PinButton) == 1) {
digitalWrite(RELAY, HIGH);
}
else {
digitalWrite(RELAY, LOW);
}
Итог
В результате проекта мы получили работающее автоматическое управление, созданное своими руками! Его можно перепрограммировать под свои пожелания и предпочтения, при этом сэкономив кучу денег на покупке аналогичного гаджета в магазине, где он стоит в разы дороже.
Узнать больше об этом контроллере вентиляции можно на канале автора в Телеграмме: @AlmerAlex87
- Комментарии