#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// -------------------------------------------------------------------
// НАСТРОЙКА ПИНОВ И КОНСТАНТ
// -------------------------------------------------------------------
#define DHTPIN 2 // КТ Датчик DHT22 (Цифровой пин 2)
#define DHTTYPE DHT22
#define SOIL_PIN A0 // КТ3: Вход АЦП Датчик влажности почвы (A0)
#define LDR_PIN A1 // КТ2: Вход АЦП Фоторезистор (A1)
#define FAN_PIN 3 // КТ4: Вентилятор (D3)
#define HEATER_PIN 4 // Нагреватель (D4)
#define PUMP_PIN 5 // Насос (D5)
#define LAMP_PIN 6 // Фитолампа (D6)
#define LED_OK_PIN 13 // КТ5: Светодиод "НОРМА" (D13)
// Пороговые значения (Уставки) для контрольных режимов
const float TEMP_HIGH = 28.0; // Порог перегрева (°C)
const float TEMP_LOW = 18.0; // Порог переохлаждения (°C)
const int SOIL_DRY = 400; // Порог сухой почвы (значение АЦП 0-1023)
const int LIGHT_LOW = 300; // Порог недостатка света (значение АЦП 0-1023)
// Инициализация объектов библиотеки
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Адрес I2C дисплея (16 символов, 2 строки)
void setup() {
// Инициализация последовательного порта и датчиков
Serial.begin(9600);
dht.begin();
// Инициализация измерительного LCD-экрана
lcd.init();
lcd.backlight();
// Настройка пинов на выход
pinMode(FAN_PIN, OUTPUT);
pinMode(HEATER_PIN, OUTPUT);
pinMode(PUMP_PIN, OUTPUT);
pinMode(LAMP_PIN, OUTPUT);
pinMode(LED_OK_PIN, OUTPUT);
// Исходное состояние выходов (все выключены)
digitalWrite(FAN_PIN, LOW);
digitalWrite(HEATER_PIN, LOW);
digitalWrite(PUMP_PIN, LOW);
digitalWrite(LAMP_PIN, LOW);
digitalWrite(LED_OK_PIN, LOW);
// Приветственное сообщение
Serial.println("==================================================");
Serial.println(" Система 'АгроКлимат' с измерительными приборами ");
Serial.println("==================================================");
lcd.setCursor(0, 0);
lcd.print("AgroClimat System");
lcd.setCursor(0, 1);
lcd.print("Status: Init...");
delay(1500);
lcd.clear();
}
void loop() {
// 1. Считывание показаний с датчиков
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int soilVal = analogRead(SOIL_PIN);
// ИНВЕРСИЯ ФОТОРЕЗИСТОРА: чем больше света, тем больше значение АЦП
int lightVal = 1023 - analogRead(LDR_PIN);
// Проверка ошибки считывания DHT22
if (isnan(temp) || isnan(hum)) {
Serial.println("Ошибка считывания с датчика DHT22!");
lcd.setCursor(0, 0);
lcd.print("DHT22 Error! ");
delay(2000);
return;
}
// 2. Расчёт напряжений и токов в Контрольных Точках (КТ)
float v_supply = 5.00; // КТ1: Напряжение питания VCC (В)
float v_light = (lightVal / 1023.0) * 5.0; // КТ2: Напряжение фоторезистора на входе A1 (В)
float v_soil = (soilVal / 1023.0) * 5.0; // КТ3: Напряжение датчика почвы на входе A0 (В)
// 3. Логика управления нагрузками по порогам
bool fanOn = (temp > TEMP_HIGH);
bool heaterOn = (temp < TEMP_LOW);
bool pumpOn = (soilVal < SOIL_DRY);
bool lampOn = (lightVal < LIGHT_LOW);
bool isNormal = !fanOn && !heaterOn && !pumpOn && !lampOn;
// Управление цифровыми выходами
digitalWrite(FAN_PIN, fanOn ? HIGH : LOW);
digitalWrite(HEATER_PIN, heaterOn ? HIGH : LOW);
digitalWrite(PUMP_PIN, pumpOn ? HIGH : LOW);
digitalWrite(LAMP_PIN, lampOn ? HIGH : LOW);
digitalWrite(LED_OK_PIN, isNormal ? HIGH : LOW);
float v_fan = fanOn ? 5.00 : 0.00; // КТ4: Напряжение управления Вентилятором D3 (В)
float i_led = isNormal ? ((5.00 - 2.00) / 220.0) * 1000.0 : 0.00; // КТ5: Ток LED_OK D13 (мА)
// 4. Вывод измерительных данных на LCD-экран (КТ2 и КТ3)
lcd.setCursor(0, 0);
lcd.print("V_Soil: ");
lcd.print(v_soil, 2);
lcd.print("V ");
lcd.setCursor(0, 1);
lcd.print("V_LDR: ");
lcd.print(v_light, 2);
lcd.print("V ");
// 5. Вывод подробного протокола в Serial Monitor (для отчёта)
Serial.print("КТ1 (VCC): "); Serial.print(v_supply); Serial.print(" B | ");
Serial.print("КТ2 (V_LDR): "); Serial.print(v_light); Serial.print(" B | ");
Serial.print("КТ3 (V_Soil): "); Serial.print(v_soil); Serial.print(" B | ");
Serial.print("КТ4 (V_Fan): "); Serial.print(v_fan); Serial.print(" B | ");
Serial.print("КТ5 (I_LED): "); Serial.print(i_led); Serial.println(" мА");
Serial.print("Датчики: Темп = "); Serial.print(temp); Serial.print(" C, Влажн = "); Serial.print(hum);
Serial.print(" %, Почва (АЦП) = "); Serial.print(soilVal);
Serial.print(", Свет (АЦП) = "); Serial.println(lightVal);
Serial.print("Текущий режим: ");
if (isNormal) Serial.print("[НОРМА] ");
if (fanOn) Serial.print("[ПЕРЕГРЕВ -> ВЕНТИЛЯТОР] ");
if (heaterOn) Serial.print("[ПЕРЕОХЛАЖДЕНИЕ -> НАГРЕВАТЕЛЬ] ");
if (pumpOn) Serial.print("[СУХАЯ ПОЧВА -> НАСОС] ");
if (lampOn) Serial.print("[ТЕМНО -> ФИТОЛАМПА] ");
Serial.println("\n--------------------------------------------------");
delay(1500); // Интервал обновления
}