Загрузка данных
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 миллисекунд) перед следующим циклом измерений
}