Загрузка данных


// --- Подключение библиотек ---
#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("% ");
}