- PVSM.RU - https://www.pvsm.ru -
В предыдущей статье [1] мы достаточно кратко рассмотрели организацию и процессинг IoT данных с помощью проекта Apache NiFi. Этой статьей мы открываем серию, в которой детально расскажем о каждом этапе, начиная от самих устройств и заканчивая DataLake платформой аналитикой, машинным обучением, предсказанием аномалий и т.д.

Сейчас же начнем с самого первого уровня, непосредственно “вещей”, букве T из аббревиатуры IoT. С самого устройства, организации канала связи и использования протокола MQTT. Тренду IoT уже несколько лет, но по большей части представление о нем, как о лампочке и розетке, включающейся с телефона. Но на производстве, добыче, и в различных других индустриях десятками лет используются самые разнообразные сенсоры, значения с которых собираются в производственные SCADA [2]. Всего-то подключить поток данных к интернету, и мы получаем тот самый IoT, точнее IIoT — индустриальный интернет вещей.
Зачем это все нужно если все эти десятки лет SCADA успешно управляет производственным циклом?
Причин несколько:
В итоге, датчики на производстве уже не просто отправляют значения в SCADA. Нужна программная архитектура, которая позволит построить построить цепочку от конечного сенсора на каком-либо станке до вычислительного облака, в котором, исходя из истории работы станка, с помощью обученной модели обслуживающему персоналу прилетит сообщение «37% вероятность выхода из строя механизма, нужно отправить инженера».

Ну а теперь назад, к вещам! Обычно для демонстрации таких систем используются открытые наборы исторических показателей датчиков какой-либо индустрии. Но к сожалению в таком варианте «пощупать» систему не получиться. Нет, на завод мы не заберемся, а вот свою простую «вещь с интернетом» сделаем.
Наша сфера деятельности связана с серверными инфраструктурами, но некоторыми хобби-электронными навыками все же обладаем, так что «вещь» будет самодельная.
Выберем самый простой вариант мониторинга — климатический датчик, будем собирать данные о температуре, влажности и давлении.
В качестве датчика возьмем BMP280 [3].
Очень навороченная вещь, предназначен не только для метеоданных, но и, благодаря чувствительному барометру, для помощи GPS, для навигации в здании (определить этаж), для игр в помощь акселерометру. Мы же будем использовать его только для метеоданных.
Возьмем в качестве модуля такой:

В качестве одновременно контроллера и канала связи возьмем, уже наверное культовую, esp8266 [4] (https://en.wikipedia.org/wiki/ESP8266 [5])
В нашем случае, модуль ESP-07:

В качестве питания — 9В батарейка «Крона». Так как все устройства работают от 3.3В — нужен понижающий преобразователь. Рука тянется поставить любимый всеми линейный LD1117 [6]:

Но все, что понижает линейный преобразователь — он просто рассеивает в тепло. Пиковый ток esp8622 около 0.4A, это значит с линейным преобразователем (9-3.3)*0.4 = 2.28Вт в никуда. Еще и расплавится.
Поэтому собрали импульсный понижающий преобразователь на LM2576 [7]:

3 ампера точно хватит всем (по-настоящему, что из компонентной базы было, то и припаяли).
В качестве CAD использовался Eagle, схема получилась такая:

Для запуска esp8622 нужно притянуть RESET и CH_PD к плюсу(включает модуль), GPIO15 к минусу. Когда GPIO0 притянут к земле — модуль переходит в режим программирования, поэтому там стоит перемычка.
GPIO02 и GPIO15 используются как SDA/SDL линии шины I2C [8] для подключения BMP280, а также любых других устройств на шину(штырьковый разъем JP5), например, дисплея, для отладки прямо на месте.
JP1 используется для подключения по UART (через UART-USB преобразователь) к компьютеру для программирования и отладки модуля.
На резисторах R6 и R5 собран делитель напряжения для АЦП, чтобы можно было следить за зарядом батареи.
Разводка получилась такая:

Скорее всего, в лучших традициях хоббийной схемотехники, нарушает все возможные правила, но главное — работает :)
Само устройство получилось такое:


Плата изготовлена по лазерно-утюжной технологии (один из тысяч примеров: http://cxem.net/master/45.php [9]).
Для быстрого старта для esp8622 взяли прошивку NodeMCU [10].
NodeMCU представляет из себя интерпретатор Lua для esp8622 и кучу библиотек для различных устройств, датчиков, дисплеев и т.п.
Чтобы прошить устройство, сначала нужно эту прошивку получить. Документация [11] предлагает несколько вариантов, но самый простой из них — сервис nodemcu-build.com [12], который позволяет, просто выбрав нужные модули, получить готовую прошивку на почту.

Для нашего устройства обязательно нужно выбрать MQTT, I2C (т.к. на этой шине расположен датчик), ну и сам датчик BME280 (у нас BMP280, но библиотека универсальная), а также ADC для контроля за батареей. После сборки прошивки — сервис отправит ее на указанную почту.
Дальше нужно замкнуть GPIO0 на землю и перевести модуль в режим программирования (перемычка JP2), подключить USB-UART переходник и передернуть питание.
Загрузка прошивки выполняется с помощью NodeMCU PyFlasher [13]. Нужно выбрать соответствующий последовательный порт, саму прошивку и для модуля ESP-07 — Quad i/O, остальные режимы работать не будут.

Немного терпения, пока прошивка завершится, потом снять перемычку JP2, передернуть питание и в итоге наше устройство готово к пользовательскому коду.
Настройки UART для подключения — 115200 8N1, подключившись каким-нибудь терминалом для последовательного порта(например, terminalbpp [14]) можно прямо вводить lua команды, этакий REPL.

Но нас все же интересует менее эфемерная прошивка, чтобы после перезагрузки оставалась:)
При запуске NodeMCU начинает выполнять с флеш карты файл init.lua (если он есть). Вот его и напишем.
За образец берем пример из документации:
Для загрузки мы использовали простенькую утилитку Asmodat ESP LUA Loader [16]. Она просто пропихивает в терминал file.open и построчно Lua командами его записывает.
Логика следующая:
Lua скрипт, схему и разводку платы мы выложили [17], в принципе там все достаточно прозрачно.
Места которые хотелось бы отметить:
Вход ADC esp8266 требует напряжение в диапазоне от 0 до 1В и на выходе дает соответствующее число от 0 до 1024. Для резисторов 39кОм и 470кОм — коэффициент для пересчета получается примерно 13. Т.е. для того чтобы оценить (не очень точно измерить) напряжение на батарее — нужно полученное значение умножить на 13 и поделить на 1024.
Так как сенсор BMP280 универсальный, у него несколько вариантов конфигурации для разных применений. Для NodeMCU инициализация датчика для климатических измерений выглядит так (одни магические числа):
bme280.setup(1, 1, 1, 1, 7, 0) -- weather mode
Подробнее про эти числа в документации [18]. Ну, и в датащите на BMP280, приведенном выше.
Так и не удалось уйти в режим Deep Sleep, по какой-то причине модуль не будится.
Библиотека для работы с MQTT достаточно специфическая, невозможно точно определить, когда закрывать соединение. В сообществе куча вопросов по этому поводу без какого-либо решения. Есть различные обходные пути, например как этой статье [19].
Но в нашем случае мы просто таймаутом ждем несколько секунд, а потом выключаем WiFi.
Также, поддержка TLS хоть и заявлена, но завести ее так и не удалось, данные отправляются нешифрованные.
Раз в минуту модуль подключается к WiFi и отправляет MQTT брокеру показания с датчиков.
Топики в MQTT следующего формата:
/device_location/device_name/sensor
Это позволяет подписываться на потоки данных с сенсоров как по местоположению так и на конкретные сенсоры, например, температура за окном:
/outdoor/#/temperature
В качестве MQTT брокера мы используем Eclipse Mosquitto. Чтобы установить, например в Debian нужны два пакета: mosquitto и mosquitto_clients.
В /etc/mosquitto/mosquitto.conf нужно прописать
require_certificate false # отключаем tls
allow_anonymous true # пускаем всех:)
Дальше запускаем наше устройство, с помощью утилиты mosquitto_sub подписываемся на топики устройств, следим за погодой)
root@baikal:~# mosquitto_sub -v -t "/outdoor/#"
/outdoor/iottest/temperature 30.07
/outdoor/iottest/pressure 713
/outdoor/iottest/humidity 38.765
/outdoor/iottest/voltage 439
/outdoor/iottest/temperature 30.09
/outdoor/iottest/pressure 713
/outdoor/iottest/humidity 38.445
/outdoor/iottest/voltage 451
/outdoor/iottest/temperature 29.93
/outdoor/iottest/pressure 713
/outdoor/iottest/humidity 38.400
/outdoor/iottest/voltage 452
Baikal тут упомянут не просто так. Мы всё же географически расположены рядом с Байкалом, так что для базовой станции под устройства не было других вариантов, кроме как использовать BFK 3.1 на ядре Baikal T-1 [20] :)
В последующих статьях перейдем к передаче данных, полученных от IIoT в систему аналитики и визуализации и расскажем об очередях. И про Baikal, конечно :)
Автор: Евгений Потапов
Источник [21]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy-ili-sdelaj-sam/285248
Ссылки в тексте:
[1] статье: https://habr.com/company/itsumma/blog/415933/
[2] SCADA: https://en.wikipedia.org/wiki/SCADA
[3] BMP280: https://www.bosch-sensortec.com/bst/products/all_products/bmp280
[4] esp8266: https://www.espressif.com/en/products/hardware/esp8266ex/overview
[5] https://en.wikipedia.org/wiki/ESP8266: https://en.wikipedia.org/wiki/ESP8266
[6] LD1117: https://www.st.com/resource/en/datasheet/cd00002116.pdf
[7] LM2576: http://www.ti.com/lit/ds/symlink/lm2576.pdf
[8] I2C: https://en.wikipedia.org/wiki/I%C2%B2C
[9] http://cxem.net/master/45.php: http://cxem.net/master/45.php
[10] NodeMCU: http://nodemcu.com/index_en.html
[11] Документация: https://nodemcu.readthedocs.io/en/master/en/build/
[12] nodemcu-build.com: https://nodemcu-build.com/
[13] NodeMCU PyFlasher: https://github.com/marcelstoer/nodemcu-pyflasher/releases
[14] terminalbpp: https://sites.google.com/site/terminalbpp/
[15] https://nodemcu.readthedocs.io/en/dev/en/upload/#initlua: https://nodemcu.readthedocs.io/en/dev/en/upload/#initlua
[16] Asmodat ESP LUA Loader: https://sourceforge.net/projects/asmodat-esp-lua-loader/
[17] Lua скрипт, схему и разводку платы мы выложили: https://www.itsumma.ru/files/habr/iotdevice.zip
[18] документации: https://nodemcu.readthedocs.io/en/dev/en/modules/bme280/#bme280setup
[19] статье: https://blog.vinczejanos.info/2016/09/29/reliable-mqtt-conenction-with-nodemcu/
[20] BFK 3.1 на ядре Baikal T-1: https://www.baikalelectronics.ru/products/olkhon_bfk/
[21] Источник: https://habr.com/post/416291/?utm_source=habrahabr&utm_medium=rss&utm_campaign=416291
Нажмите здесь для печати.