Загрузка данных
#include <DHT.h> // Подключение библиотеки для работы с цифровым датчиком DHT
#include <Servo.h> // Подключение библиотеки для управления сервоприводом
#define DHTPIN 2 // Определение цифрового пина D2 для линии данных DHT22
#define DHTTYPE DHT22 // Указание используемой модели датчика (DHT22)
#define SERVO_PIN 9 // Определение цифрового пина D9 с ШИМ для сервопривода
#define LED_PIN 7 // Определение цифрового пина D7 для красного светодиода
#define BUZZER_PIN 8 // Определение цифрового пина D8 для пьезозуммера
DHT dht(DHTPIN, DHTTYPE); // Инициализация объекта датчика DHT22 с заданным пином и типом
Servo damperServo; // Создание управляющего объекта сервопривода заслонки
void setup() {
Serial.begin(9600); // Запуск последовательного порта на скорости 9600 бод для отладки
dht.begin(); // Запуск опроса и инициализация сенсора DHT22
damperServo.attach(SERVO_PIN); // Привязка объекта сервопривода к аппаратному выводу 9
pinMode(LED_PIN, OUTPUT); // Настройка вывода светодиода в режим выхода
pinMode(BUZZER_PIN, OUTPUT); // Настройка вывода пьезозуммера в режим выхода
damperServo.write(10); // Установка заслонки в начальное закрытое положение (10 градусов)
digitalWrite(LED_PIN, LOW); // Выключение светодиода при старте системы
noTone(BUZZER_PIN); // Отключение звукового сигнала на зуммере при старте
}
void loop() {
delay(2000); // Пауза 2 секунды между измерениями (аппаратное требование DHT22)
float h = dht.readHumidity(); // Считывание относительной влажности воздуха в процентах
float t = dht.readTemperature(); // Считывание температуры окружающей среды в градусах Цельсия
// Вывод текущих считанных параметров в монитор порта
Serial.print("Температура: "); // Печать поясняющего текста в монитор порта
Serial.print(t); // Печать полученного численного значения температуры
Serial.print(" °C | Влажность: "); // Печать разделителя и пояснения для влажности
Serial.print(h); // Печать полученного численного значения влажности
Serial.println(" %"); // Печать знака процента с переводом на новую строку
// 1. Проверка на ошибку считывания данных с сенсора
if (isnan(h) || isnan(t)) { // Если датчик вернул не число (обрыв линии или сбой опроса)
Serial.println("Ошибка чтения DHT22!"); // Сообщение об аварии датчика в монитор порта
damperServo.write(0); // Перевод сервопривода в безопасное положение 0 градусов
for (int i = 0; i < 3; i++) { // Цикл для генерации серии коротких предупреждающих сигналов
digitalWrite(LED_PIN, HIGH); // Включение светодиода
tone(BUZZER_PIN, 1000); // Включение звукового тона частотой 1000 Гц
delay(150); // Длительность звука и свечения 150 мс
digitalWrite(LED_PIN, LOW); // Выключение светодиода
noTone(BUZZER_PIN); // Выключение зуммера
delay(150); // Длительность паузы между короткими сигналами 150 мс
}
return; // Выход из текущей итерации loop до следующего цикла измерений
}
// 2. Аварийный режим по температуре (наивысший приоритет регулирования)
if (t > 32.0) { // Проверка превышения критического порога температуры 32 °C
Serial.println("Режим: АВАРИЯ (T > 32°C)"); // Вывод статуса критического перегрева
damperServo.write(180); // Максимальное открытие заслонки на угол 180 градусов
tone(BUZZER_PIN, 2000); // Включение непрерывной громкой тревоги на частоте 2000 Гц
for (int i = 0; i < 5; i++) { // Цикл для обеспечения быстрого мигания светодиода
digitalWrite(LED_PIN, HIGH); // Зажигание светодиода
delay(100); // Короткая задержка свечения 100 мс
digitalWrite(LED_PIN, LOW); // Гашение светодиода
delay(100); // Короткая задержка паузы 100 мс
}
}
// 3. Превышение порога нормальной температуры (приоритет над влажностью)
else if (t > 27.0) { // Проверка условия температуры в диапазоне выше 27 °C
Serial.println("Режим: Повышенная температура (T > 27°C)"); // Вывод статуса в Serial
damperServo.write(90); // Открытие заслонки на 90 градусов для проветривания
digitalWrite(LED_PIN, HIGH); // Непрерывное свечение индикаторного светодиода
tone(BUZZER_PIN, 1000); // Подача короткого предупредительного звукового сигнала
delay(200); // Длительность короткого сигнала 200 мс
noTone(BUZZER_PIN); // Отключение звука зуммера после короткого писка
}
// 4. Повышенная влажность при нормальной температуре
else if (h > 60.0) { // Проверка превышения порога влажности воздуха более 60%
Serial.println("Режим: Повышенная влажность (H > 60%)"); // Вывод статуса влажности
damperServo.write(90); // Открытие заслонки на угол 90 градусов для вентиляции
tone(BUZZER_PIN, 1000); // Подача короткого предупредительного звукового сигнала
delay(200); // Длительность звука 200 мс
noTone(BUZZER_PIN); // Отключение звукового оповещения
for (int i = 0; i < 2; i++) { // Цикл умеренного мигания светодиода
digitalWrite(LED_PIN, HIGH); // Зажигание светодиода
delay(400); // Время включенного состояния 400 мс
digitalWrite(LED_PIN, LOW); // Гашение светодиода
delay(400); // Время выключенного состояния 400 мс
}
}
// 5. Нормальный климатический режим
else { // Выполняется, если T от 18 до 27 °C и H не выше 60%
Serial.println("Режим: НОРМА"); // Отправка статуса нормальной работы в монитор порта
damperServo.write(10); // Удержание заслонки в штатном закрытом положении 10 градусов
digitalWrite(LED_PIN, LOW); // Светодиод выключен
noTone(BUZZER_PIN); // Зуммер выключен
}
}