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


1. Инициализация программного кода
Подключение библиотек
Определение пинов
Создание объектов
Объявление глобальных переменных
Объявление EEPROM
Чтение сохранённых значений в EEPROM
Запуск датчика температуры 
Привязка сервопривода к пину
Инициализация bluetooth соединения 
2. Тело цикла
Чтение температуры с датчика
Преобразование показателей температуры в наклон угла
Наклон сервопривода на основе полученных данных
Отправка значений по bluetooth

Сначала подключаются библиотеки, затем инициализируется сервопривод и объявляются порты. Датчик температуры и влажности запускается и начинает считывать температуру. После этого выполняется синхронизация сервопривода с датчиком температуры. Полученные показания передаются сервоприводу. При наличии питания после задержки цикл повторяется с этапа считывания температуры.

#include <SoftwareSerial.h>   // Библиотека для программного последовательного порта (Bluetooth)
#include <DHT.h>              // Библиотека для работы с датчиками DHT (температура и влажность)
#include <Servo.h>            // Библиотека для управления сервоприводами
#include <EEPROM.h>           // Библиотека для работы с энергонезависимой памятью (сохранение настроек)

// Определение пинов подключения
#define DHTPIN 2              // Пин данных датчика DHT11
#define SERVO_PIN 9           // Пин управления сервоприводом
#define BT_RX_PIN 10          // RX программного UART для Bluetooth (приём данных)
#define BT_TX_PIN 11          // TX программного UART для Bluetooth (передача данных)

// Создание объектов
DHT dht(DHTPIN, DHT11);                      // Инициализация датчика DHT11
Servo Servo;                                 // Объект для управления сервоприводом
SoftwareSerial bluetooth(BT_RX_PIN, BT_TX_PIN); // Программный Serial-порт для связи с Bluetooth-модулем

// Глобальные переменные
float currentTemp = 0;       // Текущая измеренная температура
float tempMin = 0.0;         // Минимальная температура диапазона (соответствует углу 0°)
float tempMax = 50.0;        // Максимальная температура диапазона (соответствует углу 180°)

// Адреса в EEPROM для хранения значений tempMin и tempMax
const int EEPROM_ADDR_MIN = 0;  // Адрес для сохранения минимальной температуры
const int EEPROM_ADDR_MAX = 4;  // Адрес для сохранения максимальной температуры (следующие 4 байта)

void setup() {
  // Чтение сохранённых значений из энергонезависимой памяти (EEPROM)
  EEPROM.get(EEPROM_ADDR_MIN, tempMin);
  EEPROM.get(EEPROM_ADDR_MAX, tempMax);
  
  dht.begin();                       // Запуск датчика температуры/влажности
  Servo.attach(SERVO_PIN);           // Привязка объекта сервопривода к указанному пину
  bluetooth.begin(9600);             // Инициализация Bluetooth-соединения на скорости 9600 бод
}

void loop() {
  // Чтение текущей температуры с датчика DHT11 (в градусах Цельсия)
  currentTemp = dht.readTemperature();
  
  // Преобразование температуры в угол поворота сервопривода
  // map() пропорционально отображает значение из диапазона [tempMin, tempMax] в [0, 180]
  int angle = map(currentTemp, tempMin, tempMax, 0, 180);
  angle = constrain(angle, 0, 180);  // Ограничение угла в пределах допустимого диапазона (0–180°)
  Servo.write(angle);                // Установка сервопривода в вычисленный угол
  
  // Отправка значения температуры по Bluetooth с одним знаком после запятой
  bluetooth.print(currentTemp, 1);
  bluetooth.println("C");
  
  // Проверяем, есть ли данные, пришедшие по Bluetooth
  if (bluetooth.available()) {
    // Читаем строку до символа перевода строки (\n)
    String cmd = bluetooth.readStringUntil('\n');
    cmd.trim();                         // Убираем лишние пробелы и невидимые символы по краям

    // Если команда начинается с "SET_MIN:"
    if (cmd.startsWith("SET_MIN:")) {
      tempMin = cmd.substring(8).toFloat(); // Берём часть строки после "SET_MIN:" (8-й символ и до конца) и преобразуем в float
      EEPROM.put(EEPROM_ADDR_MIN, tempMin); // Сохраняем новое значение минимальной температуры в EEPROM
    }
    // Иначе если команда начинается с "SET_MAX:"
    else if (cmd.startsWith("SET_MAX:")) {
      tempMax = cmd.substring(8).toFloat(); // Извлекаем число после "SET_MAX:" и преобразуем в float
      EEPROM.put(EEPROM_ADDR_MAX, tempMax); // Сохраняем новое значение максимальной температуры в EEPROM
    }
  }
  
  delay(1000); // Пауза на 1 секунду (1000 миллисекунд) перед следующим циклом измерений
}