Реле Sonoff широко известны энтузиастам, но и рядовым пользователям. Эти реле легко включаются в разрыв цепи любой нагрузки и позволяют управлять питанием по средством интернета из любой точки мира. Стандартная прошивка позволяет подключиться к телефону через приложение, но не дает гибкости в управлении и не позволяет интегрировать эти устройства в системы управления "умным домом". Этот факт обусловил появление некоторого количества кастомных прошивок, наиболее известной из которых является Sonoff-Tasmota и ESPHome.
Если Вам хватает функционала - целесообразнее использовать эти кастомные прошивки. Они, как правило, разрабатываются сообществом и неплохо оттестированы и проверены большим количеством пользователей, если Вам нужен иной функционал - самое быстрое решение - написать программу для платформы NodeMCU.
Реле от Sonoff под капотом содержат микроконтроллер ESP8266 от Espressif Systems с модулем WiFi на борту, а так же флэш память ~1 Мб. На плате устройства имеются отверстия под штыревой разъем. Его туда нужно запять для прошивки МК. Распиновка разъема для прошивки (нумерация пинов от тактовой кнопки): 1 - 3,3в, 2 - Rx, 3 - Tx, 4 - Gnd. В этом разъеме имеется еще один, пятый вывод, он соединен с GPIO14 портом микроконтроллера. Кроме того, тактовая кнопка подключена к GPIO0 МК, зеленый светодиод к GPIO13. Реле посажено на GPIO13.
Генерация прошивки
Идем на сайт https://nodemcu-build.com/ и генерируем прошивку, не забыв включить модули MQTT, WIFI, file, net, GPIO и Captive Portal(End User Setup). Для прошивки будем использовать integer версию, прошивать будем программой NodeMCU PyFlasher. Для корректной прошивки выставить следующую конфигурацию: Baud Rate 115200, Flash Mode: DOUT, Earse Flash: yes. Путь к файлу прошивки не должен содержать пробелов и кириллических символов. Далее, подключаемся по UART и заливаем туда наш sdk. Если все сделано верно, прошивка зальеnся без танцев с бубном. Возможные проблемы - микросхема flash памяти могут отличаться, после перепрошивки реле может не запуститься. Если у вас появилась эта проблема, попробуйте выбрать режим DIO.
Алгоритм работы реле
В любом режиме работы реле всегда реагирует на нажатие тактовой кнопки. Короткое однократное нажатие переключает реле, длинное нажатие переводит реле в режим настройки. Мы поступим аналогичным образом: Переведем GPIO0 в режим триггера, срабатывающий по обоим фронтам. При падении уровня на ноге GPIO0 будем запускать таймер на 50 мс, в течение этого времени будем игнорировать любые срабатывания триггера. По истечении этого времени будем смотреть уровень на входе GPIO0, если 0 - значит, срабатывание было ложным, если 1 - кнопка нажата. Таким нехитрым образом, реализуем защиту от дребезга контактов.
Если мы определили нажатие кнопки, запустим еще один таймер на 5 секунд. В коллбек этого таймера поместим обработчик длительного нажатия. Если триггер на GPIO0 сработает в течение этого времени, он остановит таймер длительного нажатия и вызовет обработчик короткого нажатия, по сути просто меняющий уровень на выходе реле (GPIO13).
Параллельно с этим, при наличии конфигурационного файла eus_params.lua, мы читаем его, и пытаемся подключиться к Wi-Fi сети, а далее, к MQTT брокеру. При успешном подключении мы подписываемся на прописанные в конфиге топики, и публикуем свое состояние (вкл/выкл).
Настройка Captive Portal
Отдельно хотелось бы остановиться на настройке Captive Portal. Это технология, позволяющая подключаться к Wi-Fi сетям путем аутентификации через логин/пароль (либо иными способами). Суть проста - NodeMCU создает точку доступа без пароля и поднимает небольшой web-сервер. При подключении Вам предлагается ввести SSID Вашей сети и пароль, а так же, опционально, можно добавить иные параметры. Для добавления опциональных параметров в конфигурацию, необходимо добавить html файл с именем enduser_setup.html, в котором размещена обычная html форма. Имена и значения полей этой формы и будут формировать дополнительные параметры.
Важно отметить, что для корректной настройки нужно заполнить все поля формы, либо реализовать заполнение этих полей дефолтными значениями, иначе Captive Portal работает некорректно и конфигурационный файл не создаст.
Загрузка скриптов в ESP8266
Для загрузки наших скриптов удобно пользоваться программой ESPlorer. Из всего объема ОЗУ ESP8266 для исполнения скриптов нам остается не так уж много, всего порядка 20 кб. Поэтому, после загрузки каждый файл со скриптом (кроме init.lua) нужно скомпилировать, сделать это можно прямо в sdk, который предоставляет NodeMCU, после компиляции исходник нужно удалить. Скомпилированные файлы имеют расширение lc, не ошибитесь. Кроме того, файл enduser_setup.html можно сжать zip архиватором и дописать расширение gz: enduser_setup.html.gz.
Исходники проекта можно скачать с моего githib.