ShIoTiny5 — OTA, часы, Encoder и прочие новости от v0.26 до v0.32
О чём эта статья
Это продолжение цикла статей о хобби-проекте ShIoTiny5 - встраиваемой системе графического программирования микроконтроллеров семейства ESP8266.
Для тех, кто не знает о чём речь
Для тех, кто слышит о проекте ShIoTiny5 впервые - можно посмотреть сайт проекта и там же найти подробную инструкцию прошивки v0.32 и саму прошивку.
Кроме того, в конце статьи есть ссылки, которые помогут понять о чём речь.
Для написания программ для ShIoTiny5 не нужно ничего, кроме интернет-браузера и модуля на базе ESP8266, соединённого с компьютером или ноутбуком по WiFi.
Впрочем, программы можно писать (а точнее - рисовать) и без модуля на базе ESP8266 - есть онлайн-версия редактора схем-программ, находящаяся тут. Но без ESP8266 эти программы не получится запустить и проверить в работе.
Для тех, кто уже понимает и в курсе
Уже минуло несколько месяцев с момента написания моей последней статьи про хобби-проект ShIoTiny5.
За время с момента написания последней статьи, версия программного обеспечения ShIoTiny5 поднялась с v0.26 до v0.32. Исправлена масса ошибок. Добавлены новые устройства. Введены новые функции всей системы и узлов. Эта статья - обзор новых возможностей проекта ShIoTiny5.
Я получаю довольно много писем от тех, кто использовал ShIoTiny5 для своих нужд. В них повторяются вопросы о том, что я планирую сделать, когда и "а нельзя ли ещё и вот это приделать".
С одной стороны я очень рад, что людям интересно и не просто интересно, но и используется для несложных поделок.
С другой стороны отвечать всем и выполнять все пожелания я не могу.
Во-первых - это время, которое ограничено у меня основной работой и прочими делами вроде детских праздников, походов в больницы, детсады, школы и прочими семейными заботами.
Во-вторых - это память ESP8266-модулей, которая не бесконечна. Я заранее ограничился объёмом FLASH в 1Мбайт и не хочу вылазить за его пределы.
В-третьих - у меня есть идеи по развитию этого проекта, но уже для ESP32.
Поэтому, сейчас есть некий минимум функций, который я хочу добавить, отладить, довести до ума и поставить точку, переключившись на ESP32-модули.
В этой статье я опишу последние изменения, которые постигли программное обеспечение ShIoTiny5 с версии v0.26 до текущей версии v0.32. Кроме того, там где это уместно, я поделюсь планами на будущее.
Краткий список изменений от версии v0.26 до v0.32
Появилась возможность обновления прошивок по сети - OTA;
Введена поддержка часов реального времени на базе микросхемы DS1307;
Появилась возможность подключения до 16 датчиков температуры DS18s20, DS18b20, DS1822 на одну шину;
Добавлена поддержка датчик концентрации CO2 - SCD30;
Поддержан датчик угла поворота - энкодер (валкодер);
Исправлена ошибка соединения с MQTT-сервером;
Исправлено множество ошибок редактора;
Появилась возможность автоматического перестроения линий связи между узлами.
Это основное. Тут нет ещё нескольких десятков мелких исправлений, которые не давали мне спокойно жить, но описывать их не имеет смысла, потому что внешне они почти ни на что не влияют и пользователю не заметны.
Ниже изменения рассмотрены подробнее.
OTA - возможность обновления прошивок по сети
Важнейшее изменение, которое облегчило работу с ShIoTiny5 - это появление кнопки Upgrade на странице конфигурации устройства. Эта кнопка появляется, только если ваш модуль на базе ESP8266 имеет не менее 2Мбайт FLASH-памяти!
Для модулей с 1Мб памяти обновление ПО возможно, как и ранее, только по UART.
Это небольшая проблема, так как сейчас трудно найти модуль даже менее, чем с 4МБ FLASH-памяти.
Как бы там ни было, начиная с версии v0.29 предусмотрена возможность обновить программное обеспечение через WEB-страницу. Это не совсем OTA в классическом понимании, так как нет единого хранилища образов. Но как же это удобно!
Обновление по сети выглядит для пользователя до смешного просто:
тыкаете кнопку Upgrade;
затем появится диалог выбора файлов, в котором необходимо выбрать файл с образом программного обеспечения, версии не менее v0.29;
после того, как файл выбран, он загружается и проверяется на корректность. Если файл признан корректным, то на экран выводится окно с предложением обновить прошивку. Если файл битый - то окно с сообщением об ошибке;
в окне с предложением обновить прошивку тыкаем кнопку Start Upgrade;
ждем пока прошивка загрузится и устройство перезапустится.
Схема-программа и настройки устройства - сохраняются. Поэтому после обновления прошивки устройство обычно продолжает работать как прежде.
Подробно процесс обновления описан в инструкции.
Часы реального времени
В версии v0.27 введён узел часов реального времени на базе микросхемы DS1307.
Это насущная необходимость, которая назрела в связи с тем, что данные, публикуемые по протоколу MQTT теперь возможно привязывать к метке времени.
Если часов реального времени нет, а NTP-сервер не доступен - то метка времени будет неверной.
Микросхема подключается DS1307 по шине I2C. По этой же шине могут быть подключены и другие устройства.
Обычно часы реального времени используются совместно с NTP-сервером. Когда NTP-сервер доступен - он используется для синхронизации времени. Иначе оно считывается из микросхемы DS1307.
Для того, чтобы синхронизировать время в системе с NTP-сервера и отсчитывать его вне зависимости от наличия связи с NTP-сервером и наличием основного питания ESP-модуля, рекомендуется использовать схему, показанную ниже.
Как обычно, подробности в инструкции.
Планы: хочу поддержать более современную микросхему часиков.
Датчики температуры DS18s20, DS18b20, DS1822 - много и разных
Начиная с версии v0.31 появилась возможность подключения до 16 датчиков на одну шину.
Для этого в узел DS182x было введено поле параметров N, в котором можно задать количество датчиков на шине - от 1 до 16.
Количество датчиков на шине должно быть строго равно указанному. Иначе на выходах узла DS182x будет установлено значение NaN (не-число).
Порядок привязки датчиков к выходам узла DS182x определяется автоматически по уникальному 64-битному идентификатору датчика. При замене одного датчика на другой — порядок привязки меняется непредсказуемым образом.
На странице «ShIoTiny Info» в разделе «Used GPIOs» будет отображаться информация о подключенных датчиках: номер выхода узла DS182x, к которому привязан данный датчик, значение считанной с этого датчика температуры и его уникальный 64-битный идентификатор.
Разумеется, гораздо более подробно всё описано в инструкции.
Планы: хочу ввести узлы поддержки этих же датчиков, но с жесткой привязкой к уникальному 64-битному идентификатору.
Датчик концентрации CO2 - SCD30
Датчик SCD30 - весьма недешевый - позволяет измерять концентрацию CO2, температуру и влажность воздуха. Поддержку этого датчика, начиная с v0.30, вызвала необходимость измерять именно концентрацию CO2.
Датчик SCD30 подключается по шине I2C.
Как обычно, подробности в инструкции.
Датчик угла поворота - энкодер (валкодер) - узел Encoder
Начиная с v0.32 добавлена поддержка весьма широко настраиваемого узла энкодера или валкодера.
Сам по себе энкодер позволяет определить угол поворота и направление вращение путем регистрации фазы и количества импульсов, генерируемых контактами (или оптопарой).
Типичный энкодер, предназначенный для работы в качестве переключателя с бесконечным количеством положений выглядит как на рисунке.
Он имеет две сигнальные линии, которые могут обозначаться по разному, но я обозначил их как Sa и Sb. Эти линии равноправны. Одна из них служит в качестве сигнала синхронизации, а вторая - в качестве сигнала-указателя направления вращения. Помимо сигнальных линий на энкодер подаётся питание и "земля".
Кроме того, многие энкодеры можно не только вращать, но и нажимать. Но на то, как работать с кнопкой - тут останавливаться не будем. Это обычный сухой контакт.
Узел энкодер имеет довольно много функций - подсчёт импульсов, ограничение минимального и максмального значения несколькими способами, управление путём установки начального значения и т.п.
На рисунке показан узел Encoder, сконфигурированный для работы с энкодером, подключенным к линия GPIO4 и GPIO5. В данной конфигурации узел на выходе будет считать значения от 0 до 99 (или от 99 до 0 при обратном направлении вращения). Начальное значение на выходе узла определяется полем Init и равно в нашем случае 0. При вращении в одну сторону, значение на выходе узла будет увеличиваться на 1 с каждым импульсом на входе, а при вращении в другую сторону - уменьшаться на 1.
Если мы установим значение параметра Step, например, в 0.1, то с каждым шагом значение на выходе узла будет увеличиваться или уменьшаться на 0.1.
Вообще, поля Step, Min, Max, Init могут иметь целое, дробное, положительное или отрицательное значения. Это удобно для пересчёта количества импульсов в нужную величину. Например, для изменения направления счета, достаточно изменить знак у параметра Step.
Ограничения также можно задавать различным образом, определяемым значением поля Mode. Способы ограничения значений выхода узла Encoder приведены ниже.
Mode: Rotate циклическое изменение. То есть если значение стало больше, чем Max, то оно устанавливается в Min, а если значение стало меньше, чем Min, то оно устанавливается в Max. (Прошли круг и начали сначала).
Mode: Fix фиксация минимума и максимума. Если значение стало больше, чем Max, то оно устанавливается в Max, а если значение стало меньше, чем Min, то оно устанавливается в Min. (Упираемся в ограничители слева и справа).
Mode: FixMin фиксация минимума. Если значение стало меньше, чем Min, то оно устанавливается в Min. Но если значение стало больше, чем Max, то оно устанавливается в Min. (Упираемся в ограничитель только слева).
Mode: FixMax фиксация максимума. Если значение стало меньше, чем Min, то оно устанавливается в Max. Но если значение стало меньше, чем Min, то оно устанавливается в Max. (Упираемся в ограничитель только справа).
Имеется возможность управлять узлом Encoder при помощи внешних входов узла. Режим внешних входов определяется параметром In, как показано ниже.
In: No Управляющих входов нет. Начальное значение задаётся полем Init.
In: Init Управляющий вход Init. Начальное значение задаётся входом Init.
In: Rst Управляющий вход Rst. При лог.1 на этом входе — значение выхода устанавливается в начальное, определяемое полем Init. При лог.0 на этом входе идёт счёт импульсов энкодера.
In: Init+Rst Управляющие вход Init и Rst одновременно. При лог.1 на входе Rst — значение выхода устанавливается в начальное, со входа Init. При лог.0 на входе Rst идёт счёт импульсов энкодера.
Чтобы было понятно как использовать энкодер на рисунке ниже приведён простой пример - термостат. С помощью энкодера задаётся желаемое значение температуры - от +10С до +35С с точностью 0.1С.
Аппаратная часть термостата состоит из:
модуля ESP8266 (например, NodeMCU), в который прошита система ShIoTiny5;
энкодера, задающего желаемое значение температуры в помещении (выводы GPIO4 и GPIO5 модуля ESP8266);
кнопки энкодера, подключённой к выводу GPIO0 модуля ESP8266;
датчика DS18b20, измеряющего температуру в помещении (вывод GPIO13 модуля ESP8266);
реле, управляемого выводом GPIO2 модуля ESP8266;
6-разрядного индикатора на базе микросхемы TM1637, отображающего желаемое (уставку) и реальное значения температуры в помещении (выводы GPIO12 и GPIO14 модуля ESP8266).
Из шести разрядов индикатора - три разряда (0-2) - это уставка температуры (то есть то, что задано энкодером) и три разряда (3-5) - это текущая температура в помещении, измеренная датчиком DS18b20.
Алгоритм работы термостата самый простой. Если значение, заданное энкодером меньше, чем температура в помещении, то нагреватель отключен. Если значение, заданное энкодером больше, чем температура в помещении, то нагреватель включается.
Узел Delay0/1 нужен лишь за тем, чтобы нагреватель не включался-выключался чаще, чем раз в 1 минуту.
При нажатии на кнопку энкодера значение уставки сбрасывается в начальное, заданное полем Init узла Encoder или 20С в нашем примере.
Разумеется, что с помощью такого устройства можно только нагревать помещение, но не охлаждать его. Но это сейчас не важно.
Вот и всё вкратце про подключение энкодера к ShIoTIny5. За подробностями - обратитесь к инструкции.
Исправлена ошибка соединения с MQTT-сервером
Это была крайне неприятная и очень редко возникающая ошибка.
Она состояла в том, что если определённым образом разорвать связь между ESP8266 и MQTT-брокером, то эта связь никогда не восстанавливалась.Это была ошибка библиотеки MQTT, которую я использовал. Наконец, эта ошибка выявлена и исправлена.
Поэтому рекомендую всем, кто использует ShIoTiny5, обновить программу до версии v0.32. Конечно, все ошибки исправить невозможно. Но этой ошибку тут точно нет. Радует только то, что из за редкости этой ошибки - мало кто на неё натыкался:)
Изменения в меню свойств связей
Редактор тоже усовершенствован. Появилась возможность автоматического перестроения линий связи между узлами. В процессе построения схемы, когда узлы и связи перемещаются много раз вручную, иногда возникают узлы, петли и прочие визуально неприятные связи.
Для устранения этого эффекта появилось подменю «Reroute» - автоматическое перестроение связей.Это подменю, показанное на рисунке, находится в «Меню свойств связи».
При выборе пункта «Line» перестраивается одна связь, которая выбрана. При выборе пункта «Group» перестраивается группа связей, в которую входит выбранная связь (то есть все связи, подключенные к одному выходу). При выборе пункта «All» перестраиваются все связи на схеме. Это, конечно, не устраняет всех проблем, но значительно облегчает жизнь.
Полностью все пункты меню свойств связей описаны в инструкции.
Ну вот и все новости
Конечно, можно писать ещё долго, подробно расписывая какие ошибки были найдены и исправлены. Расписать подробно планы будущих изменений.
Но я не стану этого делать. Потому что планы могут поменяться, а ошибки, о которых почти никто не знал - вряд ли кому-то интересны.
Полезные ссылки
Конечно, как всегда, я даю несколько полезных ссылок.
Почта. Сюда можно задавать вопросы. Не факт, что смогу ответить всем и быстро. Но я попробую. Честно-честно!
Предыдущие статьи о ShIoTiny5:
Предыдущие статьи о ShIoTiny (первая версия проекта, устарел):