Wi-Fi розетка с управлением через Интернет за 60 минут

5 минут: размышляем над задачей

Почему Wi-Fi? Потому что он у всех есть и не требует проводов, а значит, в пределах нашего помещения розетку можно будет перемещать в любой угол.

Раз розетка у нас смотрит в интернет, то помимо самой аппаратуры нам понадобится еще и нечто в этом самом Интернете. Причем разрабатывать что-то с нуля мы вот вообще не хотим, хотим максимально готовое.

Первое, что приходит в голову — для розетки берем микроконтроллер с ESP8266/ESP32, так как это очень известная и популярная платформа со встроенным Wi-Fi, а для бекэнда в Интернете готовый облачный сервис Azure IoT Central, для которого код писать вообще не надо.

Ну раз это первое пришло в голову — так и сделаем, у нас же всего 60 минут!

У автора была плата с обтекаемым названием ESP32 Dev Board, на которой установлен USB-UART конвертер CP2102 и модуль ESP-WROOM-3. Плату можно опознать по картинке ниже и по ключевику "ESP32" найти на известном китайском сайте.

Что еще нужно?

  • собственно сами розетки. Так как мы хотим больше приключений, возьмем сразу две штуки, ведь тогда продукт получится более конкурентоспособный! Автор статьи использовал корпус удлинителя с двумя гнездами.
  • модуль реле на 220 В — возьмем готовый, двухканальный, с гальванической развязкой. Нам важно, чтобы реле переключались логическими сигналами с уровнем 3.3В. Выглядит так:

  • пара кнопок, мы ведь не только из Интернета хотим включать/выключать розетки, но и кнопками на них;
  • любой AC-DC преобразователь 220В — 5В для питания ESP32 Dev Board, например, такой:

  • провода, чтобы все это соединить.

Впрочем, необходимый минимум из этого всего — только сама плата ESP32: можно просто подключить ее по USB, от которого и питать, и посмотреть по отладочному выводу или мультиметром на выводах, как она работает совместно с облаком. Правда, в этом случае такая "розетка" не будет выполнять свою основную функцию собственно розетки.


Для ESP32 понадобится прошивка. Вариантов для ее разработки немного:

  • взять стандартный тулчейн от производителя. Установка несложная, но и не особо простая. Подчеркиваю также то неприятное обстоятельство, что IDE в этом случае в комплект средств разработки не входит, и собирать все нужно будет с командной строки.
  • прослойка для Arduino. Это очевидно проще и быстрее, все ставится и настраивается из самой IDE Arduino. В качестве минуса — не вдаваясь в подробности, нет полноценной готовой библиотеки для работы именно с IoT Central, но мы это обстоятельство обойдем.

20 минут: подготовим облачный сервис

Заходим по ссылке. Понадобится учетная запись Microsoft, с которой следует залогиниться. Подписка Azure для пробной 7-дневной версии — не нужна, но лучше все-таки ее оформить, чтобы взять один из стандартных ценовых планов, где время использования не ограничено и есть два бесплатных устройства.

Выбираем слева Мои приложения — Новое приложение, далее Пользовательские приложения и заполняем поля:

  • Имя приложения: любое удобное;
  • URL-адрес: любой, но он должен быть уникальным;
  • Шаблон приложения: пользовательское приложение;
  • Ценовой план: стандартный 1 или бесплатный;

Если выбрали стандартный ценовой план, ниже создайте подписку Azure и выберите расположение, ближайшее к вам (для России — Европа).

Нажмите кнопку Создать

В меню выберите Шаблоны устройств — Создать, как показано на рисунке ниже.

Далее Устройство IoT — Следующий: Настроить. В поле Имя шаблона устройства введите Socket. Нажмите Далее: проверка, Создать.

В появившемся диалоге выберите Импорт модели и выберите файл Socket.json, прилагающийся к данной статье.

Видим следующую картину:

Что только что произошло? Фактически, мы объявили для IoT Central "язык" ("шаблон"), на котором говорит наша розетка при обмене данными с облаком, а именно, если развернем параметры каждой возможности (в оригинале — Capability), увидим следующее:

  • каждая из двух розеток передает сообщение телеметрии, в котором закодировано состояние: 0 — выключено, 1 — включено;
  • каждая из двух розеток принимает команду с параметром типа Boolean (true — включено, false — выключено).

Почему в телеметрии 0/1, а в команде true/false? Это связано с особенностями визуализации в IoT Central, короче говоря, телеметрию в виде 0/1 на картинках можно отобразить нагляднее, чем true/false.

Откуда взялся файл Socket.json? Автор подготовил его заранее, введя описание всех возможностей розетки в самом IoT Central, затем просто сохранил шаблон в файл, используя встроенную функцию экспорта.

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

В разделе Телеметрия выберите Socket1State, нажмите + Телеметрия и выберите Socket2State, затем нажмите Добавить плитку. На появившейся плитке нажмите иконкуи выберите Диаграмма состояний из меню. Нажмите Сохранить.

Теперь нам нужно "опубликовать" наш шаблон, т.е. перевести его из черновика в состояние, когда им можно будет пользоваться. Для этого нажмите соответствующую кнопку (Опубликовать). Подтвердите публикацию, нажав в появившемся окне кнопку Опубликовать.

Пока что мы только опубликовали шаблон устройства, теперь заведем запись для нашего конкретного устройства. Для этого переходим в главном меню в раздел Устройства и нажимаем кнопку + Создать. В появившемся окне изменяем только шаблон устройства на Socket. Нажимаем кнопку Создать и кликаем по имени появившегося устройства. Нажмем кнопку Подключить в верхней части окна и в появившемся окне видим всю необходимую информацию, которую нам нужно будет использовать в прошивке устройства, чтобы оно могло "разговаривать" с IoT Central. В поле Тип проверки подлинности выберем Подписанный URL-адрес (SAS) (так проще). Итого нам понадобятся:

  • Область идентификатора — это идентификатор нашего приложения IoT Central;
  • Идентификатор устройства — не требует пояснений;
  • Первичный ключ — считаем, что это "пароль" этого конкретного устройства.

С этими данными устройство должно обратиться к сервису регистрации устройств (Device Provisioning Service, DPS) для получения адреса IoT Hub, еще одного сервиса Azure. Зачем еще IoT Hub? Дело в том, что IoT Central работает "поверх" IoT Hub, являясь как бы "оберткой" для него. Вся последующая коммуникация будет происходить именно с этим IoT Hub.

Проблема в том, что простые в использовании библиотеки Arduino не включают готового клиента DPS. Ну раз так, то возьмем систему с Windows 10, и получим этот адрес IoT Hub вручную. Утилита dps-keygen умеет это делать, правда для ее запуска понадобится node.js.

Раз так, установим последнюю версию node.js с официального сайта с параметрами по умолчанию, затем запустим стандартную командную строку Windows и выполним команды (естественно, подставив нужные данные из нашего приложения IoT Central):

npm i -g dps-keygen
dps-keygen -si:область_идентификатора -di:идентификатор_устройства -dk:первичный_ключ_устройства

Порядок аргументов в последней строке не имеет значения.

Нас предупредят, что эта возможность "deprecated" и не "best practices", но нам очень надо, и не "best", а "fast", иначе не уложимся за 60 минут, которые обещал автор, поэтому продолжаем. На выходе будет строка подключения, которую мы позже укажем в прошивке розетки:

Отлично! Мы готовы к сборке стенда.

15 минут: достаем компоненты из ящика и собираем стенд

Сгребаем в охапку все провода, компоненты, и собираем их, как показано на схеме ниже. Можно как припаивать провода, так и соединять через разъемы — дело вкуса. В любом случае особое внимание уделяем высоковольтной части. Автор сделал разъемные соединения, где это было возможно, остальное — припаял.

Схема:

Результат немного угрожающий, но для стенда вполне работоспособный:

Такой вид в общем-то вполне нормален для всяких самоделок, но если под рукой (совершенно случайно!) есть 3D-принтер, можно сделать что-то более презентабельное:

Как и обещал, две кнопки, две розетки.
Между прочим, если задумаете поменять пины на Dev Board, рекомендую эту картинку для понимания, что на каких пинах есть:

Также из-за ошибки трассировки на плате автора был не подключен пинов GND около кнопки EN (RST), так что такие моменты тоже неплохо бы проверить (на вашей плате).

Ну и для справки, схема соединений сигнальных проводов в виде таблицы (для удобства сборки):

15 минут: подготовка инструментов и сборка прошивки

Будем собирать прошивку на Windows 10 (любой сборки, но авторы категорически рекомендуют LTSC).

  1. Загрузим и установим Arduino IDE.
  2. Загрузим и установим драйверы моста UART-USB, распаянного на плате. В случае автора это был CP2102 (на нем самом написано).
  3. Запустим Arduino IDE и перейдем в меню Файл — Настройки. В поле Дополнительные ссылки для Менеджера плат вводим https://dl.espressif.com/dl/package_esp32_index.json. Это позволит установить поддержку ESP32 прямо из Arduino с сайта производителя чипа. Нажмем OK и закроем диалог.
  4. Перейдем в меню Инструменты — Плата — Менеджер плат, в поиске введем esp32. В появившемся пункте нажимаем Установить.
  5. Из прилагающегося архива распаковываем каталог GetStarted и открываем скетч GetStarted.ino.
  6. Находим следующие строки и внутри кавычек соответственно прописываем SSID Wi-Fi сети и пароль:

const char* ssid = "";
const char* password = "";

7. Находим строку и внутри кавычек вставляем строку соединения, которую мы получили ранее при помощи утилиты dps-keygen.

static const char* connectionString = "";

8. Находим строку и внутри кавычек вставляем идентификатор нашего устройства:

#define DEVICE_ID ""

9. В настройках платы (Инструменты — Плата) устанавливаем параметры, как на рисунке ниже.

10. Поправим баг библиотеки SNTP, приводящий к перезагрузке ESP32 при пропадании соединения, для чего откроем файл

C:\Users\имя_пользователя\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.5\libraries\AzureIoT\src\az_iot\c-utility\pal\lwip\sntp_lwip.c и в самое начало функции SNTP_Init() вставим код:

if (sntp_enabled()) sntp_stop();

Версия библиотеки может отличаться. Замените 1.0.5 на ту, которая применяется в вашем случае.

11. Подключаем плату и выбираем появившийся последовательный порт в том же меню (номер порта можно уточнить в диспетчере устройств).

12. Нажимаем Ctrl + U, чтобы собрать и загрузить скетч в плату. Если все прошло успешно (как и должно быть), нажимаем кнопки на плате и видим, как переключаются реле.

13. Из меню Инструменты — Монитор порта можно посмотреть отладочный вывод платы.

Если хотите больше двух розеток — без проблем! Внесите изменения в схему и добавьте номера пинов кнопки и сокета в массивы BUTTON_PIN и SWITCH_PIN.

5 минут: наслаждаемся собранным устройством

Теперь вернемся в IoT Central, чтобы потестировать наше устройство.

  1. На дашборде устройства есть закладка Необработанные данные, где можно увидеть сообщения телеметрии, отправляемые розеткой. Здесь же можно увидеть, что поля deviceId и messaageId не соответствуют модели. Так и есть — в шаблоне устройства их нигде нет, они добавлены только для отладочной телеметрии.

  1. На закладке Команды можно включать и отключать каждую из двух розеток отдельно:

  1. Также можно включать и отключать каждую розетку кнопкой на ней. В любом случае, все изменения отражаются на в телеметрии вкладке Состояние при любом переключении. Причем телеметрия отсылается не реже, чем раз в час, так что можно, например, в IoT Central создать правило, отслеживающее наличие подключения розетки: если за последний час не было ни одного сообщения, розетка потеряла связь. При срабатывании правила можно предпринять ряд действий, например, отправить e-mail и т.п.

Пример создания правила (высылает e-mail с предупреждением на заданный адрес, если не было ни одного сообщения телеметрии за последние 60 минут, другими словами, розетка "не в сети"):

Вместо заключения

Это еще не все, и мы планируем продолжить эксперименты в подобном формате, а именно:

  • Сделать поддержку DPS в прошивке;
  • Добавить поддержку IoT Plug and Play, тогда на стороне IoT Central не нужно будет регистрировать устройство, и оно все сделает само;
  • Сделать голосовое управление розеткой ("Эй Кварта Технологии! Включи розетку 1!").

О нас

Компания Кварта Технологии была основана в 1997 году и сегодня является лидирующим поставщиком программного обеспечения и облачных сервисов для рынка встраиваемых систем и IoT в России, Украине, Грузии и странах СНГ.

Мы предоставляем услуги по лицензированию, разработке и обучению в области встраиваемых решений, помогая производителям из разных стран создавать передовые интеллектуальные системы и устройства в кратчайшие сроки.

С 2004 года компания является авторизованным дистрибутором и тренинг-партнером Microsoft Windows Embedded (IoT) на территории России и СНГ. Последние несколько лет входит в Топ-5 лучших дистрибуторов Microsoft по Embedded-продуктам в регионе EMEA (Европа, Ближний Восток, Африка) и обладает статусом «Windows Embedded Partner Gold Level».

Архив с файлами к статье

Автор статьи — Сергей Антонович, ведущий инженер Кварта Технологии. Связаться с ним можно по адресу sergant (at) quarta.ru.Статья опубликована в блоге компании на Хабр.