#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// Инициализация LCD 16x2 (адрес 0x27 или 0x3F, зависит от модуля)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Пины подключения
#define DHTPIN 2 // DHT22 - пин данных
#define DHTTYPE DHT22 // Тип датчика DHT
#define LDRPIN A0 // Фоторезистор (LDR)
#define POTPIN A1 // Потенциометр (регулировка температуры)
#define PIRPIN 3 // PIR-датчик (датчик движения)
#define RELAYPIN 9 // Реле (управление вентилятором или обогревателем)
// Создаём объект DHT
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(LDRPIN, INPUT);
pinMode(POTPIN, INPUT);
pinMode(PIRPIN, INPUT);
pinMode(RELAYPIN, OUTPUT);
// Инициализация LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Climate Control");
delay(2000);
lcd.clear();
}
void loop() {
// Считываем данные с датчиков
float temp = dht.readTemperature(); // Температура
float humidity = dht.readHumidity(); // Влажность
int ldrValue = analogRead(LDRPIN); // Освещенность
int potValue = analogRead(POTPIN); // Уровень потенциометра
int pirState = digitalRead(PIRPIN); // Движение: 1 - есть, 0 - нет
// Конвертируем потенциометр в температуру (от 18°C до 28°C)
float setTemp = map(potValue, 0, 1023, 18, 28);
// Определяем ночь (если освещённость ниже 500)
bool isNight = ldrValue < 500;
// Вывод информации в Serial Monitor
Serial.print("Температура: "); Serial.print(temp);
Serial.print("°C | Влажность: "); Serial.print(humidity);
Serial.print("% | Заданная темп: "); Serial.print(setTemp);
Serial.print("°C | Свет: "); Serial.print(ldrValue);
Serial.print(" | Пассажиры: "); Serial.println(pirState);
// Логика управления реле
if (temp > setTemp || (pirState == 1 && isNight)) {
digitalWrite(RELAYPIN, HIGH); // Включаем вентилятор/обогреватель
} else {
digitalWrite(RELAYPIN, LOW); // Выключаем
}
// Вывод данных на LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:"); lcd.print(temp); lcd.print("C ");
lcd.print("H:"); lcd.print(humidity); lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("Set:"); lcd.print(setTemp); lcd.print("C ");
lcd.print(pirState ? "P:Yes" : "P:No");
delay(1000); // Обновление данных раз в секунду
}