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

LiquidCrystal lcd(12, 11, 10, 9, 8, 7);

// Константы
#define DHTPIN 22          // Пин подключения контакта DATA
#define DHTTYPE DHT22      // Датчик DHT 22
#define INTERVAL_GET_DATA 2000 // Интервал измерений, мс

#define LED_TEMP_PIN 2     // Пин для светодиода температуры
#define LED_HUMIDITY_PIN 3 // Пин для светодиода влажности

// Создание экземпляра объекта DHT
DHT dht(DHTPIN, DHTTYPE);

// Переменная для интервала измерений
unsigned long millis_int1 = 0;

void setup() {
  lcd.begin(16, 2); // Инициализация LCD
  Serial.begin(9600); // Запуск последовательного порта
  dht.begin(); // Запуск DHT

  // Установка пинов для светодиодов как выходные
  pinMode(LED_TEMP_PIN, OUTPUT);
  pinMode(LED_HUMIDITY_PIN, OUTPUT);

  // Изначально выключаем светодиоды
  digitalWrite(LED_TEMP_PIN, LOW);
  digitalWrite(LED_HUMIDITY_PIN, LOW);
}

void loop() {
  if (millis() - millis_int1 >= INTERVAL_GET_DATA) {
    // Получение данных с DHT22
    float humidity = get_data_humidity();
    float temp = get_data_temp();

    // Вывод в монитор последовательного порта
    Serial.print("humidity=");
    Serial.println(humidity);
    Serial.print("temp=");
    Serial.println(temp);

    // Вывод данных на LCD
    lcd.clear(); // Очистка дисплея
    lcd.setCursor(0, 0); // Установка курсора на первую строку
    lcd.print("Humidity: ");
    lcd.print(humidity);
    lcd.print(" %");
    
    lcd.setCursor(0, 1); // Установка курсора на вторую строку
    lcd.print("Temp: ");
    lcd.print(temp);
    lcd.print(" C");

    // Логика для управления светодиодами
    if (temp < 17 || temp > 25) {
      digitalWrite(LED_TEMP_PIN, HIGH); // Включение светодиода температуры
    } else {
      digitalWrite(LED_TEMP_PIN, LOW); // Выключение светодиода температуры
    }

    if (humidity < 40 || humidity > 60) {
      digitalWrite(LED_HUMIDITY_PIN, HIGH); // Включение светодиода влажности
    } else {
      digitalWrite(LED_HUMIDITY_PIN, LOW); // Выключение светодиода влажности
    }

    // Запуск отсчета интервала
    millis_int1 = millis();
  }
}

float get_data_humidity() {
  return dht.readHumidity();
}

float get_data_temp() {
  return dht.readTemperature();
}