Журнал РАДИОЛОЦМАН, октябрь 2017
Вадим Колесник, г. Тирасполь
Ранее на страницах портала Радиолоцман публиковались описания двух устройств для автоматического управления подсветкой рабочей зоны на кухне: вариант на Arduino [2] и вариант на NodeMCU [3]. Последний, несмотря на некоторые недостатки, о которых я сообщу в конце статьи, подключен к серверу Cayenne и работает надежно (Рисунок 1).
![]() |
||
Рисунок 1. | Контроллер на NodeMCU для управления подсветкой на кухне и контроля параметров хорошо зарекомендовал себя в работе. |
В статье [3] я говорил, что планирую расширение функционала контроллера, подключение дополнительных сенсоров и управление вытяжкой на кухне. В этом случае нужно отметить, что «Контроллер подсветки» для устройства на NodeMCU – это было лишь рабочее название проекта по аналогии с Arduino-версией.
Одной из первых задач которую необходимо решить при расширении функционала контроллера, является обновление прошивки. Ввиду того, что контроллер расположен в труднодоступном месте (на верхних шкафах кухни, в моем случае), и подключение его к ПК или ноутбуку по USB для прошивки (без полного демонтажа) – задача достаточно трудоемкая, я решил реализовать процесс обновления прошивки по Wi-Fi (Over-The-Air Update, OTA Update). Подключение дополнительных сенсоров и реле затруднений не вызовет, ввиду того, что они просто подключаются к нужным штыревым разъемам на плате контроллера.
Для понимания процесса обновления прошивки ESP8266 по Wi-Fi я рекомендую ознакомиться с материалами и пользовательскими примерами реализации OTA [4], которые можно найти в сети Интернет. Основные условия:
- Объем Flash-памяти модуля NodeMCU должен быть в 2 раза больше размера скетча Arduino;
- Устройство и ПК с которого выполняется обновление должны находится в одной локальной сети;
- Удостовериться, что процесс обновления прошивки не приведет к сбоям в работе периферии и исполнительных устройств.
- Для универсализации я выбрал способ обновления прошивки через Web браузер.
В общем случае все реализации OTA работоспособны, но в нашем случае есть один нюанс: основное приложение при запуске подключается и работает с сервером Cayenne, и при простом добавлении ОТА функций в приложение (как описано в примерах) наблюдается нестабильная работа устройства. Поэтому пришлось пойти на хитрость.
На приборной панели Cayenne была добавлена кнопка Switch to Update Mode (переключить в режим обновления прошивки), при нажатии на которую в EEPROM контроллера записывается флаг, указывающий на необходимость запуска ОТА после перезагрузки контроллера. Далее выполняется программная перезагрузка контроллера и, если установлен флаг запуска ОТА, инициализируется сервер с определенным IP-адресом (и именем) в локальной сети. В браузере переходим по указанному адресу и видим страницу, на которой выбираем бинарный файл прошивки и отправляем его на сервер. Если прошивка выполнена удачно, то в EEPROM контроллера удаляется флаг запуска OTA и выполняется перезагрузка контроллера. После рестарта (флаг OTA отсутствует) инициализируется сервис Cayenne и выполняется основное приложение.
Рассмотрим подробнее основные моменты.
Кнопка "Switch to Update Mode" на приборной панели Cayenne (Рисунок 2) подключена к виртуальному каналу 4 (Virtual Channel 4). При нажатии на кнопку (иконка кнопки становится активной) с сервера Cayenne передается в контроллер значение, равное 1. Обработка нажатия кнопки и установка флага OTA в EEPROM выполняются в функции CAYENNE_IN(V4) (Листинг 1).
![]() |
||
Рисунок 2. | Свойства кнопки переключения контроллера в режим OTA на приборной панели Cayenne. |
Листинг 1. Обработчик нажатия кнопки на приборной панели и запись флага OTA в EEPROM контроллера.
CAYENNE_IN(V4) {
Cayenne_OTA_Button = getValue.asInt();
if (Cayenne_OTA_Button == 1) {
EEPROM.begin(4);
EEPROM.write(0, 83);
EEPROM.commit();
delay(2000);
}
}
Обратите внимание на функции работы с EEPROM. У СнК ESP8266 отсутствует энергонезависимая память, область EEPROM (4 байта) выделяется во внешней Flash-памяти программ. Запись флага (значение 83 соответствует ASCII символу S) производится по адресу 0.
В основном цикле программы отслеживается состояние переменной Cayenne_OTA_Button, и если она равна 1, то деактивируем кнопку Switch to Update Mode на приборной панели, выполняем задержку на 4 секунды и перезагружаем контроллер (Листинг 2).
Листинг 2. Деактивируем кнопку на приборной панели и выполняем перезагрузку контроллера.
if (Cayenne_OTA_Button == 1) {
Cayenne_OTA_Button = 0;
Cayenne.virtualWrite(V4, Cayenne_OTA_Button);
delay(4000);
ESP.restart();
}
После перезагрузки модуля выполняется функция инициализации setup(), в которой проверяется флаг OTA_Start_Flag. Если флаг установлен, то выполняется инициализация сервера и содержимого веб-страницы. В основном цикле (при установленном флаге) запускается сервер, и при обращении клиента генерируется веб-страница (Рисунок 3). Также запускается таймер на 3 минуты – по истечении этого времени сбрасывается флаг OTA, выполняется перезагрузка модуля и переход к выполнению основного приложения (Листинг 3). Состояние готовности сервера и его IP-адрес можно узнать в мониторе последовательного порта в среде Arduino IDE (если устройство подключено по USB к ПК) или в ARP таблице маршрутизатора. В настройках маршрутизатора лучше сразу прописать постоянный IP-адрес для контроллера (по МАС-адресу).
![]() |
||
Рисунок 3. | Веб-страница, генерируемая контроллером в режиме обновления прошивки по Wi-Fi. |
Листинг 3. Запуск сервера OTA, обработка подключенного клиента и запуск таймера времени для обновления прошивки контроллера.
if (OTA_Start_Flag == 83) {
server.handleClient();
if (millis() - timeout_1 > interval_2) {
EEPROM.begin(4);
EEPROM.write(0, 70);
EEPROM.commit();
delay(1000);
ESP.restart();
}
}
Выбираем файл прошивки (как найти бинарный файл прошивки, скомпилированный в Arduino IDE, думаю, объяснений не требует) и нажимаем кнопку Update. Прошивка займет несколько секунд, после чего в браузере появится сообщение о статусе процесса обновления, сбросится флаг OTA (запись в EEPROM по адресу 0 десятичного значения 70, ASCII символ F), спустя несколько секунд контроллер автоматически перезагрузится и перейдет к выполнению основного приложения.
Кроме того, в скетче вы можете задать имя Host-устройства, по которому можно обратиться в адресной строке браузера, когда контроллер находится в режиме обновления прошивки, а также это имя будет отображаться в списке DHCP маршрутизатора. В скетче имя задается как константа:
const char* host = "ESP-Kitchen";
Следует отметить, что также просто можно реализовать режим обновления прошивки с дополнительной защитой по логину и паролю.
Первоначально прошивка с поддержкой OTA функций программируется в контроллер стандартным способом (по USB). После этого можно пользоваться функцией обновления по Wi-Fi; главное не забыть, чтобы в обновленной прошивке (скетче) присутствовали функции OTA. В ходе этого процесса вы столкнетесь с одним неудобством. Дело в том, что после первого OTA обновления потребуется однократно выполнить аппаратный сброс Wi-Fi модуля (кнопка сброса на NodeMCU). В последующих OTA обновлениях все будет происходить автоматически. Связано это с какими-то внутренними регистрами и архитектурой СнК ESP8266.
![]() |
||
Рисунок 4. | Плата ШИМ контроллера на микросхеме PCA9685. |
Еще один недостаток, выявленный в работе контроллера подсветки, связан с программной реализацией ШИМ в среде Arduino. При малых значениях ШИМ наблюдается нестабильность скважности ШИМ сигнала в моменты обращения к датчику температуры DS18B20, которая проявляется кратковременным и слабозаметным миганием светодиодной ленты. Поэтому, думаю, что потребуется отказаться от использования программного ШИМ в ESP8266 в пользу распространенной микросхемы 16-канального ШИМ PCA9685 или платы расширения на ее основе с управлением по интерфейсу I2C (Рисунок 4).
Ссылки
- Разработка IoT устройств на Arduino с помощью сервиса myDevices Cayenne
- Контроллер управления подсветкой рабочей зоны на кухне. Часть 1. Версия на Arduino
- Контроллер управления подсветкой рабочей зоны на кухне. Часть 2. Вариант на NodeMCU
- Over The Air Updates ESP8266 (OTA)
- Все проектные файлы для контроллера подсветки на NodeMCU