Умное проветривание подпола на Arduino.

Здравствуйте! Хочу поделиться записью из своего блокнота о том, как самостоятельно реализовать устройство для проветривания подпола на базе Arduino. Сделал я его по просьбе шурина, исходя из его пожеланий. Назначение его простое — активировать приточный и вытяжной вентиляторы в том случае, если температура и влажность уличного воздуха примут определенные значения.

Какие же это значения? При каких условиях будет работать проветриватель на ардуино? Наблюдая за состоянием подпола в процессе эксплуатации, шурин выяснил, что наибольшее выпадение конденсата на поверхностях в подполе происходит в период весна — осень… Зимой все в подполе хорошо. Итак, первое условие которое было обозначено — это работа при положительной температуре на улице (конкретизировали +5°С =) ). Второе условие и основное — если температура в подполе (поверхности перекрытия, например) больше температуры образования точки росы, вычисленная из температуры и относительной влажности приточного (уличного) воздуха. Для этого мне была продемонстрирована вот такая занимательная таблица для определения температуры точки росы (картинки кликабельны):

Таблица определения температуры точки росы
Таблица определения температуры точки росы

Скажу вам честно, поначалу долго смотрел на эту таблицу и вникал, что же это такое «температура образования точки росы». Шурин для понимания этой таблицы привел пример про бутылку пива, которую в зной вытащили из холодильника :))). Пусть в доме температура воздуха +24°С и относительная влажность 50%, по табличке определили температуру точки росы, которая равна +12,3°С. Температура бутылки пива из холодильника +5°С. Соответственно на поверхности бутылки будет образовываться конденсат. Но, как только бутылка нагреется до температуры большей чем +12.3°С, образование конденсата прекратится.

Вот и в нашем подполе при определенных условиях на поверхностях образуется конденсат, и мы попытаемся с этим бороться с помощью проветривалки на Arduino. Все это эксперимент, опыт эксплуатации и наблюдения покажут насколько система рабочая, отчет будет.

Железо, используемое в проекте:

  1. Плата Arduino UNO или подобная;
  2. дисплей LCD 2004 (без I2C);
  3. Модули DHT22 — 2 шт.
  4. Кнопка без фиксации;
  5. Модуль реле (High state).
  6. Резисторы номиналом 220 Ом, 10 КОм.
  7. Вентиляторы — 2 шт (приток и вытяжка).
Комплектующие для проветривателя на ардуино
Комплектующие для проветривателя на ардуино

Плата, модули и дисплей куплены на али, все остальное повыпаивал со старых плат.

Схема подключения.

Схема проветривателя на базе контроллера Arduino
Схема проветривателя на базе контроллера Arduino

И в помощь к схеме — таблица подключения контактов всех элементов к контактам платы ардуино.

Пины платы Ардуино UNOКонтакты модулей, кнопки, реле…
A0 out уличного датчика DHT22
A1 out датчика подпола DHT22
2D7 LCD 
3D6 LCD
4D5 LCD
5D4 LCD
6RS LCD
7E LCD
9 Кнопка
10A LCD (анод подсветки через резистор 220Ом)
12IN модуля реле
GNDВсе GND, DC-,
VCC (+5B)Все VCC, DC+, +

Для подключения кнопки понадобится резистор номиналом 10 КОм, для ограничения тока подсветки дисплея — резистор номиналом 220 Ом. Для регулирования контраста LCD дисплея — потенциометр 10 КОм.

В этом примере, для возможности управления подсветкой LCD, я подключил анод (A) подсветки дисплея к выходу ардуино, используя лишь токоограничивающий резистор. В моем случае, ток потребления подсветки, измеренный амперметром, составляет 7.2 мА. Это допустимый ток для выхода Ардуино. К слову, максимально допустимый ток на один пин ардуино не должен превышать 20мА, учитывайте это при подключении различной нагрузки к GPIO платы. Подсветка у некоторых LCD дисплеев может потреблять до 120мА!!!! И если вам попался дисплей с прожорливой подсветкой и вы хотите ей управлять, то включите n-p-n транзистор по следующей схеме:

Базу n-p-n транзистора через резистор 1КОм подключим к выходу ардуино. Эмиттер посадим на землю, а коллектор транзистора к катоду (K, —) подсветки дисплея. Я подключал транзистор c1815Y, подойдет также 2N2222A или аналогичный n-p-n транзистор. До подключения необходимо разобраться с цоколевкой!!!

Будьте осторожны, в проекте используются вентиляторы, работающие от сети переменного тока с напряжением 220В, при их подключении и работе с ними Вы должны четко понимать что делаете .

С помощью модуля реле происходит включение или выключение вентиляторов, в зависимости от состояния цифрового выхода на ардуино. К контакту «COM» реле подключим рабочий проводник «фазу» сети ~220В, к контакту «NO» по рабочему проводу от каждого вентилятора. Нейтральные проводники N подключим к вентиляторам напрямую.

Скетч.

Осталось залить скетч в плату Arduino UNO или аналогичную и проверить работоспособность проветривалки =)). Нужно будет установить соответствующие библиотеки для работы датчиков и дисплея, останавливаться на этом не буду, подробности в записях :

#include <LiquidCrystal.h>
#include <DHT.h>

#define DHT_EXT A0 //номер входа уличного датчика 
#define DHT_INT A1 //номер входа датчика подпола
#define DHTTYPE DHT22 //тип датчика DHT
#define MODE_BUTTON 9 // номер входа кнопки выбора режимов работы
#define FAN_RELAY 12 // номер выхода реле вентилятора
#define LCD_BACKLIGHT 10 // выход на подсветку LCD

DHT dht_ext(DHT_EXT, DHTTYPE);
DHT dht_int(DHT_INT, DHTTYPE);

const int rs = 6, en = 7, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

bool auto_mode = false; // будем запоминать режим работы проветривалки
bool mode_button_state = false; //будем фиксировать короткое 
bool mode_button_long_state = false; //и длинное нажатие кнопки mode
bool state = false; // запоминаем статус системы (типа активно проветривание или нет)
unsigned long mode_button_ms; //будем фиксировать millis кнопки mode
unsigned long backlight_ms; //для подсчета длительности работы подсветки
int mintemp = 5; //минимальное значение температуры наружного воздуха, при которой возможно автопроветривание 


// переменные для подсчета точки росы.
float Tr;
float a = 17.27;
float b = 237.7;
float TRH;

void setup() {
Serial.begin(115200);
lcd.begin(20, 4);
dht_ext.begin();
dht_int.begin();

// инициализируем пин, подключенный к реле как выход
pinMode(FAN_RELAY, OUTPUT);
digitalWrite(FAN_RELAY, LOW);    

// инициализируем пин, подключенный к кнопке, как вход
pinMode(MODE_BUTTON, INPUT); 

// инициализируем пин, подключенный к подстветке (катоду дисплея через n-p-n) как выход.
pinMode(LCD_BACKLIGHT,OUTPUT);
digitalWrite(LCD_BACKLIGHT, LOW);

}

void loop() {
     
//считываем данные влажности и температуры с датчиков
int h_e = dht_ext.readHumidity();
int t_e = dht_ext.readTemperature();
int h_i = dht_int.readHumidity();
int t_i = dht_int.readTemperature();
  

//Рассчитываем темепературу точки росы по влажности и температуре наружного воздуха (t_e, h_e)
 TRH = ((a*t_e)/(b+t_e))+log(h_e*0.01);
 Tr = (b*TRH)/(a-TRH);

 
//=========работаем с кнопкой выбора режима работы проветривалки=========
//=======================================================================

//фиксируем нажатие кнопки
 if( digitalRead(MODE_BUTTON) == HIGH && !mode_button_state && ( millis() - mode_button_ms ) > 50 ) {
  mode_button_state = true;
  mode_button_long_state = false;  
  mode_button_ms = millis();
  backlight_ms = millis();
  }
 
//фиксируем длинное нажатие кнопки и вкл-выкл проветриватель
 if( digitalRead(MODE_BUTTON) == HIGH && !mode_button_long_state && !state && !auto_mode &&  ( millis() - mode_button_ms ) > 1000) {
  mode_button_long_state = true;
  state = true;
  }

 else if( digitalRead(MODE_BUTTON) == HIGH && !mode_button_long_state && state && !auto_mode && ( millis() - mode_button_ms ) > 1000) {
  mode_button_long_state = true;
  state = false;
  }

// фиксируем отпускание кнопки, и меняем режим работы проветривалки авто/ручной.
if( digitalRead(MODE_BUTTON) == LOW && mode_button_state && ( millis() - mode_button_ms ) > 50 ) {
  mode_button_state = false;
  mode_button_ms = millis();
  
  if ( !mode_button_long_state && !auto_mode ) { 
    auto_mode = true;
    state = false;}
  else if (!mode_button_long_state && auto_mode ){ 
    auto_mode = false;
    state = false;
    }
 }  


//========работаем в авторежиме======== 
if (auto_mode){
  lcd.setCursor(5, 3);
  lcd.print("auto");
  if (t_e > mintemp && t_i > Tr)state = true;
  else state = false;
}

if (!auto_mode){
  lcd.setCursor(5, 3);
  lcd.print("man ");
}
//========управляем нагрузкой, отображаем статус проветривателя===========
if (state){
  digitalWrite(FAN_RELAY, HIGH);
  lcd.setCursor(11, 3);
  lcd.print("fan: ON ");
}

if (!state){
  if (digitalRead(FAN_RELAY) == HIGH){digitalWrite(FAN_RELAY, LOW);}
  lcd.setCursor(11, 3);
  lcd.print("fan: OFF");
}

//=======================РАБОТАЕМ с LCD дисплеем========================
//======================================================================

//====Активируем подсветку по нажатию кнопки выбора режима работы======= 

if (millis()-backlight_ms < 10000) {
digitalWrite(LCD_BACKLIGHT, HIGH);
} else digitalWrite(LCD_BACKLIGHT, LOW);

//==========выводим информацию на дисплей=========
lcd.setCursor(0,0);
lcd.print("Ext:");
lcd.setCursor(0,1);
lcd.print("Int:");
lcd.setCursor(0,2);
lcd.print("Tr:");
lcd.setCursor(0,3);
lcd.print("Mode:");

//===========выводим показания температуры=========
lcd.setCursor(5,0);
lcd.print(t_e);
if (t_e <= -10) lcd.print("");
else if (t_e > -10 && t_e <= -1) lcd.print(" ");
else if (t_e >= 0 && t_e <= 9) lcd.print("   ");
else lcd.print("  ");
lcd.setCursor(8,0);
lcd.print((char)223);
//lcd.setCursor(9,0);
lcd.print("C");

lcd.setCursor(5,1);
lcd.print(t_i);
if (t_i <= -10) lcd.print("");
else if (t_i > -10 && t_i <= -1) lcd.print(" ");
else if (t_i >= 0 && t_i <= 9) lcd.print("   ");
else lcd.print("  ");
lcd.setCursor(8,1);
lcd.print((char)223);
//lcd.setCursor(9,1);
lcd.print("C");

//===========выводим показания влажности==========
lcd.setCursor(11,0);
lcd.print("hum:");
lcd.setCursor(16,0);
lcd.print(h_e);
lcd.setCursor(18,0);
lcd.print("%");

lcd.setCursor(11,1);
lcd.print("hum:");
lcd.setCursor(16,1);
lcd.print(h_i);
lcd.setCursor(18,1);
lcd.print("%");

//===========выводим значение темп. точки росы========== 
lcd.setCursor(4,2);
lcd.print(Tr);
lcd.setCursor(10,2);
lcd.print((char)223);
lcd.setCursor(11,2);
lcd.print("C");

}

Если все электрические соединения были выполнены правильно, а в коде верно заданы номера входов/выходов, то после заливки скетча в плату Arduino на дисплей будут выведены значения температур и влажности, а также режим работы проветривателя и его состояние. По умолчанию режим работы — ручной «man» и вентиляторы выключены (Fan: «OFF»). Длительное нажатие кнопки в ручном режиме (более 1 секунды) принудительно запустит вентиляторы.

ручной режим работы проветривателя на Ардуино
ручной режим работы проветривателя на Ардуино

Для перехода в автоматический режим работы необходимо кратковременно нажать на кнопку. Если условия для запуска вентиляторов выполняются, то в автоматическом режиме проветриватель на arduino начнет работать.

Работа проветривателя на ардуино в авторежиме
Работа проветривателя на ардуино в авторежиме

Мы видим, что сейчас проветриватель работает в автоматическом режиме, и вентиляторы включены. Об этом свидетельствует наличие соответствующей индикации на модуле реле (светится красный светодиод). Кстати, можете сравнить рассчитанное контроллером значение температуры точки росы для Т и Н снаружи с таблицей, которая приведена в начале записи. На дисплее Т=25°C, H=56%, Tp=15,6°С. Вроде все сходится )). Формула в скетче. Вот еще картинка:

Расчет точки росы на Ардуино
Расчет точки росы на Ардуино

В качестве регистратора температуры в подполе можно было использовать датчик ds18b20, т.к. в этом проекте мы не ориентируемся на показания влажности в подполе. Но, какой бы датчик мы не выбрали, его необходимо закрепить на поверхности перекрытия и изолировать его от непосредственного контакта с воздухом подпола. Ведь температуру воздуха подпола мы относительно быстро сравняем с температурой воздуха на улице. А вот температура поверхностей (особенно бетонных) обладает большей тепловой инертностью. За ней то нам и надо наблюдать для выполнения всех условий и адекватной работы всей системы.

В любом случае, сейчас — это эксперимент!!! Работа проветривателя подпола на базе arduino будет проверена с наступлением тепла (>+5°C). Владелец будет наблюдать за работой системы и состоянием подпола. По результатам наблюдений будем корректировать работу ардуино проветривалки. На этом запись в блокноте про Умное проветривание подпола на Arduino приостанавливаю. До новых встреч!!!

Добавлено 04.03.2020. Если Вы столкнулись с проблемой отображения отрицательных температур при использовании датчика DHT22 и Ардуино, то, возможно, вам поможет прочтении записи: Исправление проблемы некорректного подсчета и отображения отрицательных температур датчиком DHT22 при работе с библиотекой DHT sensors library.

Поделиться ссылкой:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *