/* Схема соединений.
* Датчик DHT11 - 1 (внешний):
* 1 -> 5v
* 2 -> D8
* 2 -> 10k -> 5v
* 4 -> GND
*
* Датчик DHT11 - 2 (внутренний):
* 1 -> 5v
* 2 -> D7
* 2 -> 10k -> 5v
* 4 -> GND
*
* Реле:
* S -> D6
* + -> 5v
* - -> GND
*
* Индикатор:
* 1 -> GND
* 2 -> 5v
* 3 -> ср.RP (л.5v, п.GND) -> L-3.63k-M-1.44-R
* 4 -> D12
* 5 -> GND
* 6 -> D11
* 11 -> D5
* 12 -> D4
* 13 -> D3
* 14 -> D2
* 15 -> 5v
* 16 -> GND
*/
#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, xMin, xSec, stopVent, button_press, gist_on, gist_off;
int tHour, tMin, tSec;
//int zad;
float t2;
unsigned long time, tTmp, zad;
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); // Объявляем пин кнопки как вход
button_press = 0;
gist_on = 0;
gist_off = 0;
time = 0;
zad = 28800000; //28800000
}
void loop()
{
t2 = dht2.readTemperature(); // Получение данных температуры
HUM1 = dht1.readHumidity(); // Получение данных влажности снаружи
HUM2 = dht2.readHumidity(); // Получение данных влажности внутри
indicator(); // Вывод на индикатор
rele();
button(); // Опрос кнопок
}
//---------------------------------------------------------------------------------------------------------
int indicator()
{
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(stopVent == 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(stopVent == 1)
{
lcd.setCursor(15,1);
lcd.print('X');
}
// Когда нажата кнопка СТОП
if (button_press == 1)
{
lcd.setCursor(0,0); //Вывод на LCD температуры
lcd.print(t2);
lcd.print("\1C");
time = millis();
if (time >= zad)
{
asm volatile("jmp 0x00");
}
tTmp = (zad - time)/1000; //Инверсия остатка времени и перевод в сек.
tHour = tTmp / 3600;
tMin = (tTmp % 3600) / 60;
tSec = tTmp % 60;
lcd.setCursor(9,0);
lcd.print(tHour);
lcd.print(':');
if (tMin < 10)
{
xMin = 12;
lcd.setCursor(11,0);
lcd.print('0');
}
else xMin = 11;
lcd.setCursor(xMin,0);
lcd.print(tMin);
lcd.print(':');
if (tSec < 10)
{
xSec = 15;
lcd.setCursor(14,0);
lcd.print('0');
}
else xSec = 14;
lcd.setCursor(xSec,0);
lcd.print(tSec);
}
else
{
lcd.setCursor(0,0); //Вывод на LCD температуры
lcd.print("Temp.: ");
lcd.print(t2);
lcd.print("\1C");
}
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);
stopVent = 1;
button_press = 1;
tTmp = zad;
time = 0;
}
}
//---------------------------------------------------------------------------------------------------------
int rele()
{
if (HUM2 >= HUM1 + 11 + gist_on && button_press == 0) // Работа реле (если влажность превышает значение 1-го датчика)
{
digitalWrite(PIN_RELAY, HIGH); // Включаем реле
stopVent = 0;
gist_on = 0;
gist_off = 5; //Зима
//gist_off = 0; //Лето
}
if (HUM2 < HUM1 + 11 - gist_off)
{
digitalWrite(PIN_RELAY, LOW); // Отключаем реле
stopVent = 1;
gist_on = 5;
gist_off = 0;
}
}