#include <DHT.h>
#include <Servo.h>
// Настройка пинов
#define DHTPIN 2
#define DHTTYPE DHT22
#define STEP_PIN 5
#define SERVO_PIN 4
#define LED_PIN 10
#define SOIL_POT A0
#define TEMP_POT A1
#define LIGHT_POT A2
#define LIGHT_SENSOR A3
// Объекты
DHT dht(DHTPIN, DHTTYPE);
Servo servo;
void setup() {
Serial.begin(9600);
// Инициализация
dht.begin();
pinMode(STEP_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
servo.attach(SERVO_PIN);
servo.write(0); // Форточка закрыта
Serial.println("Система умной теплицы запущена!");
}
void loop() {
// Чтение данных с датчиков
float humidity = dht.readHumidity(); // Влажность почвы
float temperature = dht.readTemperature(); // Температура
int lightLevelRaw = analogRead(LIGHT_SENSOR); // Сырой сигнал освещенности
// Проверка данных DHT22
if (isnan(humidity) || isnan(temperature)) {
Serial.println("Ошибка чтения с датчика DHT22!");
return; // Пропускаем текущую итерацию цикла
}
// Масштабирование данных освещенности (0-1023 -> 0.1-100000 lux)
float lightLevel = map(lightLevelRaw, 0, 1023, 1, 100000);
// Чтение порогов с потенциометров
int soilThresholdRaw = analogRead(SOIL_POT);
int tempThresholdRaw = analogRead(TEMP_POT);
int lightThresholdRaw = analogRead(LIGHT_POT);
// Масштабирование порогов:
int soilThreshold = map(soilThresholdRaw, 0, 1023, 0, 100); // 0-100% для влажности
float tempThreshold = map(tempThresholdRaw, 0, 1023, -40, 80); // -40 до 80°C для температуры
float lightThreshold = map(lightThresholdRaw, 0, 1023, 1, 100000); // 1 до 100000 lux для освещенности
// Диагностика датчиков
Serial.print("Влажность: ");
Serial.print(humidity);
Serial.print("% (порог: ");
Serial.print(soilThreshold);
Serial.println("%)");
Serial.print("Температура: ");
Serial.print(temperature);
Serial.print("°C (порог: ");
Serial.print(tempThreshold);
Serial.println("°C)");
Serial.print("Освещенность: ");
Serial.print(lightLevel);
Serial.print(" lux (порог: ");
Serial.print(lightThreshold);
Serial.println(" lux)");
// Полив
if (humidity < soilThreshold) {
Serial.println("Полив включен");
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(5); // Настройка скорости работы двигателя
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(5);
} else {
Serial.println("Полив выключен");
}
// Форточка
if (temperature > tempThreshold) {
Serial.println("Форточка открыта");
servo.write(180); // Форточка полностью открыта
} else {
Serial.println("Форточка закрыта");
servo.write(0); // Форточка закрыта
}
// Освещение (исправленное условие)
if (lightLevel < lightThreshold) { // Включаем свет, если уровень освещенности ниже порога
Serial.println("Освещение включено");
digitalWrite(LED_PIN, HIGH); // Включить свет
} else {
Serial.println("Освещение выключено");
digitalWrite(LED_PIN, LOW); // Выключить свет
}
Serial.println("----------------------"); // Разделитель для удобства
delay(1000); // Задержка перед следующим циклом
}