#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"

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

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

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

// Создание экземпляра LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Адрес I2C 0x27, 16 символов, 2 строки

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

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

    // Настройка пинов для светодиодов
    pinMode(LED_TEMP_PIN, OUTPUT);
    pinMode(LED_HUMIDITY_PIN, OUTPUT);
}

void loop() {
    if (millis() - millis_int1 >= INTERVAL_GET_DATA) {
        // Получение данных с DHT22
        int humidity = get_data_humidity();
        int temperature = get_data_temperature();
        
        // Вывод в монитор последовательного порта
        Serial.print("humidity=");
        Serial.println(humidity);
        Serial.print("temperature=");
        Serial.println(temperature);
        
        // Вывод на LCD
        lcd.clear(); // Очистка экрана
        lcd.setCursor(0, 0); // Установка курсора на первую строку
        lcd.print("H: "); // Вывод текста
        lcd.print(humidity); // Вывод влажности
        lcd.print("%"); // Символ процента
        
        lcd.setCursor(0, 1); // Установка курсора на вторую строку
        lcd.print("T: "); // Вывод текста
        lcd.print(temperature); // Вывод температуры
        lcd.print("C"); // Символ градуса

        // Управление светодиодами
        if (temperature < 18 || temperature > 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();
    }
}

int get_data_humidity() {
    int h = dht.readHumidity(); // Получение влажности
    return h;
}

int get_data_temperature() {
    int t = dht.readTemperature(); // Получение температуры
    return t;
}