Архитектура и принцип работы

Структурная схема



Центральным элементом структурной схемы является микроконтроллерный модуль, выполняющий функции управления, обработки данных и обеспечения сетевого взаимодействия. В качестве данного модуля, как было обосновано ранее, выбран ESP-12F на базе чипа ESP8266EX. Этот блок получает входные сигналы от двух источников информации: от цифрового датчика температуры и влажности, формирующего данные о текущих параметрах микроклимата в помещении, и от инфракрасного приемника, преобразующего оптические сигналы пульта дистанционного управления в цифровые коды команд. На основании заложенных в программу алгоритмов и пользовательских настроек микроконтроллер формирует управляющие сигналы, которые поступают на исполнительный блок — релейный модуль, коммутирующий силовые цепи питания электродвигателя вентилятора.


Отдельным функциональным узлом структурной схемы является блок питания. Он выполняет задачу преобразования сетевого переменного напряжения 220 Вольт в постоянное низковольтное напряжение, необходимое для питания микроконтроллерного модуля и логической части релейного модуля. При этом силовые контакты реле коммутируют непосредственно сетевое напряжение, поступающее на обмотки двигателя вентилятора, минуя понижающий преобразователь. Такое разделение цепей питания и управления является стандартным решением, обеспечивающим электробезопасность и гальваническую развязку.


Для обеспечения возможности удаленного управления и настройки в структурной схеме предусмотрен блок беспроводной связи, который физически интегрирован в микроконтроллерный модуль ESP-12F. Он обеспечивает работу устройства в двух режимах: в качестве клиента домашней Wi-Fi сети и в качестве самостоятельной точки доступа. С этим блоком неразрывно связан программный веб-сервер, формирующий адаптивный веб-интерфейс пользователя и реализующий JSON API для асинхронного обмена данными с клиентскими устройствами.


Взаимодействие между описанными функциональными блоками можно представить в виде следующей цепочки преобразования информации и энергии. Электрическая энергия из сети поступает в блок питания, где преобразуется и распределяется между микроконтроллером и релейным модулем. Данные о температуре и влажности от датчика DHT22 по однопроводному цифровому интерфейсу передаются в микроконтроллер. Команды пользователя в виде инфракрасных импульсов принимаются и декодируются ИК-приемником, после чего также поступают в микроконтроллер. Альтернативным маршрутом поступления команд является беспроводной канал Wi-Fi, через который клиентское устройство (смартфон, планшет или компьютер) отправляет HTTP-запросы к веб-серверу. Микроконтроллер обрабатывает полученные данные и команды в соответствии с текущим режимом работы (ручной, автоматический, таймер) и выставляет соответствующие логические уровни на линиях управления реле. Релейный модуль, в свою очередь, замыкает или размыкает силовые контакты, подключая соответствующие отводы обмотки электродвигателя вентилятора к сети 220 Вольт. Таким образом, структурная схема наглядно демонстрирует замкнутый контур управления, включающий сенсорную подсистему, вычислительное ядро, исполнительные элементы и многоканальный интерфейс взаимодействия с пользователем.

Электрическая принципиальная схема



На основании разработанной структурной схемы и обоснованного выбора элементной базы была спроектирована электрическая принципиальная схема цифрового устройства «Умный вентилятор». Схема объединяет все компоненты в единую функционально завершенную систему и определяет электрические соединения между ними.


Цепь питания.

Сетевое переменное напряжение 220 Вольт, 50 Гц подается на входные клеммы устройства. От входных клемм напряжение поступает по двум параллельным трактам. Первый тракт ведет на вход встроенного импульсного AC-DC преобразователя, который формирует стабилизированное постоянное напряжение для питания низковольтной части схемы. Выход преобразователя формирует два уровня напряжения: 5 Вольт для питания катушек релейного модуля и оптоэлектронных развязок, и 3.3 Вольта для питания модуля ESP-12F. Для получения напряжения 3.3 Вольта из 5 Вольт на плате установлен линейный стабилизатор AMS1117-3.3, что является стандартным решением для модулей на базе ESP8266. Второй тракт сетевого напряжения подводится непосредственно к силовым клеммам релейного модуля (общие контакты COM), минуя понижающий преобразователь. Нормально-разомкнутые контакты (NO) каждого из трех задействованных реле подключаются к соответствующим выводам обмоток электродвигателя вентилятора. Такое решение обеспечивает полную гальваническую развязку между низковольтной цифровой частью и силовой цепью 220 Вольт.


Подключение микроконтроллерного модуля.

Модуль ESP-12F является центральным коммутационным узлом схемы. На модуль подается напряжение питания 3.3 Вольта от стабилизатора. Выводы GPIO модуля запрограммированы в исходном коде прошивки и распределены следующим образом. Вывод GPIO4 сконфигурирован как цифровой вход для подключения датчика DHT22 по однопроводному интерфейсу. Вывод GPIO5 сконфигурирован как цифровой вход для подключения выхода инфракрасного приемника VS1838B. Выводы GPIO12, GPIO13 и GPIO14 сконфигурированы как цифровые выходы и подключены к соответствующим входам управления релейного модуля (входы IN1, IN2, IN3). Вывод GPIO15 сконфигурирован как цифровой выход и подключен к четвертому входу управления релейного модуля (IN4), он зарезервирован для будущего расширения функционала. Выбор конкретных выводов GPIO для подключения периферийных устройств не случаен и продиктован следующими соображениями. Выводы GPIO12, GPIO13, GPIO14 являются полностью безопасными для использования в качестве выходов, поскольку их состояние в момент загрузки микроконтроллера не влияет на выбор режима работы чипа. Вывод GPIO5, используемый для ИК-приемника, также не принадлежит к группе загрузочных пинов. Вывод GPIO4 для датчика DHT22 выбран из соображений его доступности и отсутствия конфликтов. Выводы GPIO0 и GPIO2, являющиеся загрузочными, в схеме не задействованы для управления внешними устройствами во избежание нестабильного поведения при старте.


Подключение датчика DHT22.

Датчик DHT22 имеет три вывода: питание (VCC), земля (GND) и линия данных (DATA). Вывод VCC подключается к шине питания 3.3 Вольта, GND — к общей шине (земле). Вывод DATA подключается к GPIO4 микроконтроллера. В соответствии с рекомендациями производителя, между линией данных и шиной питания установлен подтягивающий резистор сопротивлением 4.7 кОм. Этот резистор необходим для обеспечения стабильного высокого логического уровня на линии в пассивном состоянии, когда ни датчик, ни микроконтроллер не передают данные.


Подключение ИК-приемника VS1838B.

Инфракрасный приемник имеет три вывода: питание (VCC), земля (GND) и выход данных (OUT). Питание подается от шины 3.3 Вольта, хотя приемник сохраняет работоспособность и при питании 5 Вольт (в этом случае на выходе необходимо было бы использовать согласователь уровней). В данной схеме приемник запитан от 3.3 Вольта, что обеспечивает совместимость логических уровней с входами ESP8266 без дополнительного преобразования. Выход приемника подключен к выводу GPIO5 микроконтроллера.


Подключение релейного модуля.

Релейный модуль имеет раздельные цепи питания логической части и силовых контактов. Логическая часть модуля питается от шины 5 Вольт, поступающей от AC-DC преобразователя. Земля логической части объединена с землей микроконтроллера для обеспечения общего опорного уровня. Четыре входа управления (IN1, IN2, IN3, IN4) релейного модуля подключены к соответствующим выводам GPIO12, GPIO13, GPIO14 и GPIO15 модуля ESP-12F. Важно отметить, что в типовых релейных модулях данного класса входной сигнал является инвертированным: для включения реле на вход требуется подать низкий логический уровень (0), а для выключения — высокий (1). Это обусловлено тем, что оптрон управляется током, и активным является низкий уровень. В программном коде прошивки данная особенность учтена путем определения констант RELAY_ON как HIGH или LOW в зависимости от конкретной конфигурации модуля. Силовые контакты реле подключаются к клеммным колодкам, с которых напряжение подается на двигатель вентилятора.


Схема блокировки скоростей.

Принципиально важным схемотехническим и программным решением является реализация защиты от одновременного включения двух и более скоростей вентилятора. В отличие от схем с механическими переключателями, где одновременное включение исключено самой конструкцией галетного переключателя, в схеме с независимыми реле такая защита должна быть реализована программно. В исходном коде функция setFanSpeed() перед подачей сигнала на включение любого реле в обязательном порядке выполняет программное отключение всех остальных реле. Это гарантирует, что даже в случае сбоя программы или ошибки в передаче команды по Wi-Fi на обмотки двигателя никогда не будет подано напряжение одновременно с двух разных отводов.

Блок-схемы алгоритма основного цикла программы



Программное обеспечение микроконтроллера ESP-12F является ключевым элементом проекта, определяющим функциональность, надежность и удобство эксплуатации устройства «Умный вентилятор». Разработка программного кода осуществлялась в интегрированной среде Arduino IDE с использованием языка программирования C++ и набора специализированных библиотек для работы с периферийными устройствами и сетевыми протоколами. Общий объем исходного кода составляет порядка 600 строк, не считая встроенных HTML-страниц веб-интерфейса.


Архитектура программного обеспечения и основной цикл.

Программное обеспечение построено по классической для встраиваемых систем схеме с суперциклом. В функции setup() выполняется однократная инициализация всех подсистем: последовательного порта для отладочного вывода, модуля Wi-Fi, сервера DNS, веб-сервера, библиотек датчика DHT22 и ИК-приемника, конфигурации портов ввода-вывода для управления реле, а также чтение сохраненных пользовательских настроек из энергонезависимой памяти (эмулируемой EEPROM). После завершения инициализации управление передается функции loop(), которая вызывается циклически и содержит логику опроса всех подсистем. Архитектурной особенностью, заложенной в код, является использование исключительно неблокирующих задержек, реализованных на основе функции millis(), возвращающей количество миллисекунд с момента запуска микроконтроллера. Вместо применения функции delay(), которая полностью останавливает выполнение программы и делает устройство неотзывчивым к сетевым запросам и командам с пульта, в коде реализована проверка временных интервалов. Каждая подсистема (опрос датчика, проверка ИК-приемника, обновление таймера) имеет свою статическую переменную для хранения метки времени последнего выполнения и выполняется только тогда, когда разница между текущим значением millis() и этой меткой превышает заданный интервал. Благодаря этому основной цикл программы выполняется максимально быстро, и устройство сохраняет высокую отзывчивость на запросы веб-сервера.


Модуль работы с Wi-Fi и Captive Portal.

Одним из наиболее сложных и ответственных модулей программы является модуль управления беспроводным соединением. Он реализует гибкий конечный автомат, обеспечивающий работу устройства в двух режимах: в качестве клиента домашней Wi-Fi сети (Station Mode) и в качестве самостоятельной точки доступа (Access Point Mode). При старте устройства микроконтроллер считывает сохраненные в EEPROM параметры домашней сети (SSID и пароль). Если эти параметры заданы, предпринимается попытка подключения к сети в режиме клиента. В течение заданного таймаута (10 секунд) программа ожидает успешного соединения. Если соединение установлено, устройство работает в штатном режиме клиента, получая IP-адрес от DHCP-сервера роутера. Если же параметры не заданы, либо попытка подключения не увенчалась успехом, устройство автоматически переходит в режим точки доступа, создавая собственную сеть с именем «SmartFan_Config» и паролем «12345678». В этом режиме запускается DNS-сервер, который перенаправляет любые DNS-запросы на IP-адрес самого устройства. Это реализует механизм Captive Portal: пользователь, подключившийся к точке доступа, при попытке открыть любой сайт в браузере автоматически перенаправляется на страницу настройки Wi-Fi. Такое решение делает процесс первоначальной настройки устройства предельно простым и интуитивно понятным. На странице настройки реализована функция сканирования доступных сетей Wi-Fi, благодаря которой пользователь может выбрать свою сеть из списка, ввести пароль и сохранить настройки. После сохранения устройство перезагружается и пытается подключиться к указанной сети уже в режиме клиента. Дополнительно реализована возможность принудительного перехода в режим точки доступа по команде с инфракрасного пульта (кнопка CH) или через веб-интерфейс. Эта аварийная функция позволяет восстановить доступ к настройкам, если, например, был изменен пароль домашней сети или устройство было перемещено в другое место.


Веб-сервер и JSON API.

Веб-сервер, построенный на базе класса ESP8266WebServer, является основным интерфейсом взаимодействия пользователя с устройством в штатном режиме работы. Сервер прослушивает 80-й порт и маршрутизирует входящие HTTP-запросы в соответствии с заданным набором обработчиков. Главная страница управления (/) отдает статический HTML-файл, хранящийся в памяти программ с использованием директивы PROGMEM и синтаксиса raw-литералов. Этот файл содержит полноценный адаптивный веб-интерфейс, включающий отображение текущих значений температуры и влажности, индикацию режима работы и скорости вентилятора, кнопки ручного управления, модальные окна настройки таймера и порогов авторежима. Для стилизации интерфейса используются CSS-переменные и медиазапросы, что обеспечивает корректное отображение на устройствах с любой шириной экрана. Для динамического обновления данных без перезагрузки страницы используется технология AJAX. JavaScript-код, встроенный в страницу, с интервалом в одну секунду отправляет асинхронный GET-запрос на URL /getData. Сервер в ответ формирует JSON-пакет с помощью библиотеки ArduinoJson, содержащий поля: текущая температура, текущая влажность, текущая скорость, массив пороговых значений температуры для авторежима, а также информацию о состоянии таймера (активен ли, сколько секунд осталось до окончания, целевая скорость). Клиентский JavaScript парсит этот JSON и обновляет соответствующие элементы DOM-дерева страницы, не перезагружая ее полностью. Аналогичным образом реализованы обработчики команд управления: /setSpeed для установки скорости, /setThresholds для изменения порогов авторежима, /setTimer и /stopTimer для управления таймером. Каждый из этих обработчиков принимает параметры через строку запроса (query string), выполняет требуемое действие и возвращает ответ в формате JSON, содержащий флаг успешности выполнения операции и, при необходимости, текстовое сообщение для отображения пользователю.


Алгоритм автоматического режима.

Автоматический режим является ключевой функцией, отличающей разработанное устройство от простых контроллеров с ручным или таймерным управлением. Алгоритм реализован в функции updateAutoMode(), которая вызывается как при активации режима, так и периодически при обновлении показаний датчика температуры. Логика работы алгоритма базируется на трех пользовательских пороговых значениях температуры, хранящихся в массиве tempThresholds и доступных для изменения через веб-интерфейс. По умолчанию установлены значения 24.0°C, 26.0°C и 28.0°C. Функция getAutoSpeedForTemperature() определяет требуемую скорость вращения вентилятора по следующим правилам. Если текущая температура ниже первого порога (24.0°C), вентилятор должен быть выключен (скорость 0). Если температура находится в диапазоне от первого порога до второго (от 24.0°C до 26.0°C), устанавливается первая (низкая) скорость. Если температура находится между вторым и третьим порогами (от 26.0°C до 28.0°C), активируется вторая (средняя) скорость. Если температура превышает третий порог (28.0°C), включается третья (высокая) скорость. Для предотвращения излишнего износа реле и обеспечения плавности работы в функции updateAutoMode() реализован гистерезисный механизм: переключение скорости происходит только в том случае, если новое требуемое значение скорости отличается от последнего установленного автоматической системой значения (lastAutoSpeed). Это исключает многократные переключения реле в случае, если температура колеблется вблизи одного из пороговых значений. При любом ручном вмешательстве пользователя (через пульт или веб-интерфейс) авторежим отключается, и управление полностью переходит к пользователю.


Модуль управления таймером.

Для обеспечения возможности программирования работы устройства на заданный интервал времени в коде реализован модуль таймера, описываемый структурой FanTimer. Таймер позволяет пользователю задать продолжительность работы в часах, минутах и секундах (с максимальным суммарным временем до 24 часов), а также целевую скорость (включая авторежим), которая будет установлена на время работы таймера. Запуск таймера осуществляется через веб-интерфейс, обработчик /setTimer принимает параметры, вычисляет суммарное количество секунд и вызывает функцию startFanTimer(). Эта функция сохраняет время окончания работы (endTime) как сумму текущего значения millis() и заданной длительности в миллисекундах, после чего устанавливает целевую скорость. В основном цикле программы периодически вызывается функция updateFanTimer(), которая проверяет, не истекло ли заданное время, и если истекло — выключает вентилятор. Клиентский JavaScript-код на странице управления при обнаружении активного таймера отображает специальный блок с обратным отсчетом времени в формате ЧЧ:ММ:СС, обновляемым ежесекундно. Предусмотрена также возможность досрочной остановки таймера через веб-интерфейс или по ручному изменению скорости.


Модуль ИК-управления.

Прием и обработка сигналов инфракрасного пульта реализованы с помощью библиотеки IRremoteESP8266. В функции setup() приемник инициализируется вызовом irrecv.enableIRIn(). В основном цикле программы с периодичностью 100 миллисекунд вызывается метод irrecv.decode(), который проверяет, был ли принят сигнал. Если сигнал принят и успешно декодирован, его числовой код передается в функцию handleIRCommand(). Эта функция сопоставляет принятый код с таблицей известных команд, определенной в массиве структур buttons[]. Каждой записи в таблице сопоставлены код кнопки, ее символьное имя и описание действия. При успешном сопоставлении выполняется соответствующее действие: вызов setFanSpeed() с нужным параметром, остановка таймера или принудительный запуск точки доступа. После обработки команды вызывается метод irrecv.resume(), подготавливающий приемник к приему следующего сигнала.


Хранение настроек в EEPROM.

Для сохранения пользовательских настроек между перезагрузками устройства используется эмулируемая память EEPROM. В памяти хранится структура WiFiConfig, содержащая SSID и пароль домашней Wi-Fi сети. Функции loadWiFiConfig() и saveWiFiConfig() обеспечивают чтение и запись этой структуры. Вызов сохранения происходит при изменении настроек Wi-Fi через веб-интерфейс. Такой подход позволяет устройству после перезагрузки автоматически подключаться к ранее сохраненной сети без повторного ввода данных.

×