Загрузка данных


#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);            // Зуммер выключен
  }
}