// --- Подключение библиотек ---
#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// --- Настройки пинов и параметров ---
#define DHTPIN 2 // Пин, к которому подключен датчик DHT11
#define DHTTYPE DHT11 // Тип датчика (DHT11 или DHT22)
#define RELAY_PIN 8 // Пин, к которому подключено реле
#define HUMIDITY_LOW 60 // Порог для включения реле (%)
#define HUMIDITY_HIGH 75 // Порог для выключения реле (%)
int h;
// --- Инициализация объектов ---
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Адрес I2C дисплея 0x27, 16 столбцов и 2 строки
void setup() {
// Инициализация Serial-порта для отладки со скоростью 9600 бод
Serial.begin(9600);
while (!Serial) { ; } // Ожидание открытия Serial-монитора (нужно только для некоторых плат, например, Leonardo)
Serial.println("System started...");
h=0;
// Инициализация пинов
pinMode(RELAY_PIN, OUTPUT);
//digitalWrite(RELAY_PIN, LOW); // Исходное состояние реле - ВЫКЛЮЧЕНО
// Инициализация компонентов
dht.begin();
lcd.init();
lcd.backlight();
}
void loop() {
// Задержка для стабильного чтения с датчика DHT11
delay(2000);
// Чтение данных с датчика
float temperature = dht.readTemperature(); // Температура в градусах Цельсия
float humidity = dht.readHumidity(); // Влажность в процентах
// Проверка, удалось ли считать данные
if (isnan(temperature) || isnan(humidity)) {
lcd.clear(); // Очищаем экран перед выводом ошибки
lcd.setCursor(0, 0);
lcd.print("Sensor Error");
return; // Останавливаем выполнение loop() и пробуем снова через 2 секунды
}
// --- Логика управления реле с гистерезисом ---
bool relayState = digitalRead(RELAY_PIN); // Считываем текущее состояние реле
if (humidity <= HUMIDITY_HIGH && h==0) {
digitalWrite(RELAY_PIN, HIGH);
delay(400);
digitalWrite(RELAY_PIN, LOW);
delay(5000);
h=1;
Serial.println(h);
}
if (humidity >= HUMIDITY_LOW && h==1) {
digitalWrite(RELAY_PIN, HIGH);
delay(400);
digitalWrite(RELAY_PIN, LOW);
// delay(1000);
// digitalWrite(RELAY_PIN, HIGH);
// delay(400);
// digitalWrite(RELAY_PIN, LOW);
delay(5000);
h=0;
Serial.println(h);
}
// --- Вывод информации на дисплей ---
// Строка 1: Температура и статус реле
lcd.clear(); // Очищаем экран перед новым циклом вывода
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temperature, 1);
lcd.print((char)223);
lcd.print("C ");
lcd.setCursor(10, 0);
lcd.print(relayState ? "R:ON " : "R:OFF"); // Тернарный оператор для краткости
// Строка 2: Влажность
lcd.setCursor(0, 1);
lcd.print("H:");
lcd.print(humidity, 0);
lcd.print("% ");
}