#include <LiquidCrystal.h> // Подгрузка библиотеки LiquidCrystal.h - взаимодействие с ЖКИ
#include "DHT.h" // Подгрузка библиотеки DHT.h - взаимодействие с датчиком DHT11
#define DHTPIN1 8 // Пин для подключения датчика DHT
#define DHTPIN2 7 // Пин для подключения датчика DHT
#define DHTTYPE DHT22 // Тип датчика DHT
#define PIN_RELAY 6 // Пин для подключения реле
#define KN_OFF 10 // Кнопка откл. вентилятора
DHT dht1(DHTPIN1, DHTTYPE); // Создание экземпляра объекта DHT
DHT dht2(DHTPIN2, DHTTYPE); // Создание экземпляра объекта DHT
LiquidCrystal lcd(12,11,5,4,3,2); // Инициализация портов, которые будут применены.
byte degree[8] = // Кодируем символ градуса
{
B11100,
B10100,
B11100,
B00000,
B00000,
B00000,
B00000,
};
byte vent1[8] = // Кодируем символ вентилятора - 1
{
B00100,
B00100,
B00100,
B11111,
B00100,
B00100,
B00100,
};
byte vent2[8] = // Кодируем символ вентилятора - 2
{
B00010,
B10010,
B01100,
B00100,
B00110,
B01001,
B01000,
};
byte vent3[8] = // Кодируем символ вентилятора - 3
{
B00000,
B10001,
B01010,
B00100,
B01010,
B10001,
B00000,
};
int HUM1, HUM2, x1, x2, zaderzhka, stop, button_press, delta;
float t2;
unsigned long timing;
void setup()
{
Serial.begin(9600); // Подключение последовательного порта
dht1.begin(); // Запуск датчика DHT снаружи
dht2.begin(); // Запуск датчика DHT внутри
lcd.begin(16, 2); // Устанавливаем кол-во столбцов и строк
lcd.createChar(1, degree); // Создаем символ под номером 1 (символ градуса)
lcd.createChar(2, vent1); // Создаем символ под номером 2
lcd.createChar(3, vent2); // Создаем символ под номером 3
lcd.createChar(4, vent3); // Создаем символ под номером 3
lcd.clear(); // Очистка дисплея
pinMode(PIN_RELAY, OUTPUT); // Объявляем пин реле как выход
digitalWrite(PIN_RELAY, LOW); // Выключаем реле
pinMode(KN_OFF, INPUT); // Объявляем пин кнопки как вход
zaderzhka = 1000;
timing = zaderzhka;
button_press = 0;
delta = 6;
}
void loop()
{
t2 = dht2.readTemperature(); // Получение данных температуры
HUM1 = dht1.readHumidity(); // Получение данных влажности снаружи
HUM2 = dht2.readHumidity(); // Получение данных влажности внутри
indicator(); // Вывод на индикатор
if (millis() - timing > zaderzhka) // Время задержки включения/выключения вентилятора
{
timing = millis();
rele();
}
button(); // Опрос кнопок
}
//---------------------------------------------------------------------------------------------------------
int indicator()
{
lcd.setCursor(0,0); //Вывод на LCD температуры
lcd.print("Temp.: ");
lcd.print(t2);
lcd.print("\1C");
lcd.setCursor(0,1); //Вывод на LCD влажности
lcd.print("Hum.:");
if (HUM2 < 10) {
x1=7;
lcd.setCursor(6,1);
lcd.print(" ");
}
else x1=6;
lcd.setCursor(x1,1);
lcd.print(HUM2);
lcd.print("%");
lcd.print("(");
if (HUM1 < 10) {
x2=11;
lcd.setCursor(10,1);
lcd.print(" ");
}
else x2=10;
lcd.setCursor(x2,1);
lcd.print(HUM1);
lcd.print("%) ");
if(stop == 0){
lcd.setCursor(15,1);
lcd.print('\2');
delay(50);
lcd.setCursor(15,1);
lcd.print('\2');
delay(50);
lcd.setCursor(15,1);
lcd.print('\3');
delay(50);
}
if(stop == 1)
{
lcd.setCursor(15,1);
lcd.print('X');
}
//lcd.setCursor(15,0);
//lcd.print(stop);
lcd.setCursor(1,0); // Убрать курсор за пределы LCD
}
//---------------------------------------------------------------------------------------------------------
int button()
{
int KN_State_OFF = digitalRead(KN_OFF); //Читаем состояние кнопки OFF
if(KN_State_OFF == LOW && digitalRead(PIN_RELAY) == HIGH){
lcd.clear(); // Очистка дисплея
lcd.setCursor(3,0);
lcd.print("STOP");
lcd.setCursor(8,1);
lcd.print("VENT.");
digitalWrite(PIN_RELAY, LOW);
pinMode(PIN_RELAY, INPUT);
delay(2000);
stop = 1;
button_press = 1;
}
}
//---------------------------------------------------------------------------------------------------------
int rele()
{
if (HUM2 >= HUM1 + delta && button_press == 0) // Работа реле (если влажность превышает значение 1-го датчика)
{
digitalWrite(PIN_RELAY, HIGH); // Включаем реле
stop = 0;
}
if (HUM2 < HUM1 + delta)
{
digitalWrite(PIN_RELAY, LOW); // Отключаем реле
stop = 1;
}
}