Несколько лет назад я писал о системе визуального программирования ShIoTiny для модулей на базе микроконтроллера ESP8266. Поэтому, чтобы не повторяться, для тех, кто "не в теме" - сразу отсылаю к моей первой статье на Хабре: ShIoTiny: малая автоматизация, интернет вещей или «за полгода до отпуска».
Главным концептом системы ShIoTiny является то, что для её программирования не нужно применять ничего кроме стандартного браузера - всё ПО находится внутри микроконтроллера.
Второй базовый принцип - максимальное использование визуального представления алгоритмов в виде узлов и из связей.
Замечу, что система ShIoTiny родилась почти случайно, но выросла в целую концепцию визуального программирования микроконтроллеров. Собственно, с этого и начались мои публикации на Хабре. И развитие системы ShIoTiny во многом обязано именно тому, что люди с Хабра писали свои отзывы в комментариях и на мне почту.
Система ShIoTiny получилась довольно интересная, но, как и все новорожденные проекты, обладала массой недостатков - начиная от неудобства интерфейса и кончая ошибками используемых библиотек и моих кривых рук. Но, несмотря на всё это, люди проявляли к ней интерес и я завёл сайт https://shiotiny.ru/, где выкладывал и выкладываю информацию о проекте.
Так как всем, кому больше трёх лет известно, что жизнь - штука неожиданная и полная сюрпризов, то неудивительно, что проект на некоторое время забуксовал. Некоторые товарищи даже интересовались в почте - жив ли я ещё и не плюнул ли на свои забавы с микроконтроллерами.
Чтобы ответить на письма всем и разом, я решил написать эту короткую статью. Надеюсь, только первую, в серии статей о новом ShIoTiny5. Здесь я расскажу о том, что произошло в плане разработки системы ShIoTiny с момента последней публикации на Хабре о ней.
Отвечаю всем и сразу: я жив, относительно здоров, у меня пополнилось семейство ещё одним маленьким человеком, живу по-прежнему в Сибири (да, медведи в городе ходят, один в прошлом году точно по центру Томска бегал, видео есть). И интерес к микроконтроллерам я не потерял. Но, к сожалению, большая семья, работа и прочие дела требуют немало времени. Поэтому некоторое время мне было просто "не до того".
Кроме того, мерзкий хостинг "Hostinger", где находился сайт https://shiotiny.ru/, внезапно запретил туда доступ. Поэтому пришлось ждать пока домен благополучно умрёт и создать сайт https://shiotiny.ru/ на другом, более приятном хостинге "Sprinthost".
Но, как бы там ни было, приятные сюрпризы, равно как и неприятные, остались в прошлом и жизнь устаканилась в новой колее. Очень радует то, что люди не забыли мои потуги на ниве создания систем программирования микроконтроллеров и периодически писали в почту, указывая на недостатки моего ПО, на ошибки и высказывали пожелания по его улучшению.
Но нет худа без добра. Достаточно большой перерыв в написании кода помог посмотреть на проект по-новому. Помог выделить основные недостатки и кривые места в интерфейсе, пользователя и в самой концепции визуального программирования микроконтроллеров.
И вот, наконец, я засел за код и сбацал новую версию ПО, которую назвал ShIoTiny5. Это пока Alpha-версия! Поэтому упор сделан на переработке основных функций, а часть узлов, которые были ShIoTiny, пока отсутствует.
Итак, что нового?
Полностью переработано ядро системы, выполняемое на микроконтроллере. Использованы новые версии библиотек с прицелом на перенос системы в недалёком будущем на ESP32. Изменена событийная модель, введены приоритеты. Этого не видно "сверху", но стабильность работы устройства значительно возросла. Конечно, надо прогнать тест в течении хотя бы месяц без выключения. Это впереди.
Изменился принцип настройки устройства. На странице конфигурации остались только настройки подключения к WiFi-сети и безопасных режимов работы. Все остальные настройки (связь с сервером MQTT, настойки шин и т.д. и т.п) выполняются теперь в виде специальных узлов. То есть интерфейс избавлен от лишних элементов.
Появились "безопасные режимы", позволяющие автоматически менять режим доступа к устройству в случае пропадания связи с точкой доступа WiFi. Это очень удобно, так как позволяет обходиться во многих случаях без неудобной процедуры перевода устройства в режим конфигурации.
Исправлены ошибки редактора, приводившие к исчезновению связи между узлами на схеме. В своё оправдание скажу, что ошибка была не моя, а библиотеки. И исправилась буквально парой строчек. Но найти её было очень непросто.
Изменился внешний вид редактора. Если раньше "палитра узлов" была сплошной и очень длинной, то теперь узлы сгруппированы по тематике и выводятся на разворачивающихся вкладках. Это гораздо удобнее.
Появились узлы с переменным числом входов и выходов. Это очень удобно для таких узлов, например, как мультиплексор или "разбиение на биты". Правда, для этих узлов не очень корректно пока работает функция отмены :( Но это не очень страшно. Возможно, что удастся победить и этот недостаток.
Исчезли все диалоговые окна настройки узлов. Теперь все параметры узла находятся прямо в нём самом и там же редактируются. Это очень удобно, так как всё на виду и для просмотра параметров не надо делать лишних движений.
Появилась куча новых математических и битовых операций и функций: минимумы-максимумы, линейные функции и проч. и проч.
Появились узлы операций с константой. Этого очень не хватало.
Счетчики теперь умеют считать во все стороны и можно задать ограничения счёта.
Публикация и получение данных MQTT теперь возможна в нескольких режимах - просто данные или данные с привязкой к временной метке. Кроме того, можно публиковать полную информацию об устройстве, такую как его IP-адрес, название и псевдоним.
Появились узлы ШИМ.
Режимы работы входов и выходов GPIO теперь можно задать как "прямой" или "инверсный".
и ещё куча мелких изменений.
Чего пока нет?
Нет ряда узлов датчиков, которые я ещё не перенёс из ShIoTiny в ShIoTiny5.
Нет протокола RLink UDP.
Нет поддержки SSL для протокола MQTT. Но она запланирована и скоро появится.
Нет узлов сохранения данных во FLASH-память. Тоже скоро появится.
Несмотря, на то, что того и этого ещё нет, программным обеспечением ShIoTiny5 уже можно пользоваться, играться с ним, выявлять ошибки.
Немного о редакторе ElDraw5
Редактор ElDraw - это базовый элемент, вокруг которого вращается вся концепция визуального программирования в системе ShIoTiny5.
От удобства работы с ним зависит удобство работы с системой. посмотрим на новый редактор ElDraw5, входящий в состав ПО ShIoTiny5.
Как выглядит новый редактор ShIoTiny5 - ElDraw5 - показано на рисунке ниже.
![Новый редактор ElDraw5 со схемой управления вентилятором. Новый редактор ElDraw5 со схемой управления вентилятором.](https://habrastorage.org/getpro/habr/upload_files/f90/450/9fd/f904509fda0cf22a7d4f2e0de84b47d8.jpg)
Как видим, от бесконечно длинной палитры элементов редактора ShIoTiny не осталось и следа. Компактная группировка узлов по назначению сокращает время поиска нужного узла в разы.
Все параметры узлов теперь находятся внутри самого узла. Например узел ADC (АЦП). Все его параметры на виду: сразу видно, что измеренное значение умножается на 100 (пороговую влажность можно задать от 0% до 100%).
Все, что можно изменить в узлах - выделено синим цветом. Всё что изменить нельзя - черным.
Это очень удобно. Видишь синюю надпись - ткни мышкой. Или выпадет меню или выведется строка редактирования.
![Контекстное меню выбора функции узла Контекстное меню выбора функции узла](https://habrastorage.org/getpro/habr/upload_files/fce/6e4/07f/fce6e407fad7ce3ba1b3e8b4adf9ed01.png)
Ножки, привязанные к узлам по-прежнему выводятся над узлами красным цветом. Но выбор производится из контекстного меню.
![Контекстное меню привязки GPIO-ножки к узлу Контекстное меню привязки GPIO-ножки к узлу](https://habrastorage.org/getpro/habr/upload_files/d73/6a9/8ff/d736a98ff98e46a755f81cffb683a56a.png)
Если параметр задаётся как число или строка - то при клике мышкой на синий элемент узла выводится строка редактирования.
![](https://habrastorage.org/getpro/habr/upload_files/a8d/d6d/799/a8dd6d79927e0e6173bfd7c4d29a4904.png)
Узлы теперь зависимы друг от друга.
Например, если узел MQTT-клиента "Mqtt Config" не установлен в схему - то узлы "MqttPub" и "MqttDesc" установить невозможно.
![Нельзя выбрать зависимые узлы, пока не установлен тот узел, от которого они зависят Нельзя выбрать зависимые узлы, пока не установлен тот узел, от которого они зависят](https://habrastorage.org/getpro/habr/upload_files/a39/7e5/649/a397e5649925ae11b6c45ef48fd032f7.png)
Все эти удобства редактора реально облегчают жизнь.
Конечно, это далеко не всё, что нового появилось в редакторе ElDraw5 по сравнению с ElDraw. Но у меня нет цели переписывать тут всю инструкцию. Для понимания принципов работы этого достаточно.
О бессонных ночах или практическое применение
Что бы я не писал о том, как всё хорошо изменилось - без практического примера это пустые слова.
Практика наступила мне на хвост откуда я не ждал: потребовался ночник. Как я уже говорил - моя семья пополнилась ещё одним маленьким человеком. А маленькие люди - особенно до года - часто просыпаются по ночам, плачут, хотят есть, у них, бывает, болит животик.. В общем - ночью приходится вставать и кормить, ласкать, успокаивать своё любимое чадо. А это значит, что надо встать и спросонья нашарить что-то светящееся (фонарик, телефон), включить и дальше проделывать разные манипуляции по успокоению дитя. Общий свет в комнате включать нельзя, ибо это ещё больше расстраивает ребёнка и может разбудить других детей. А ночной хоровой концерт недовольных малышей - то ещё удовольствие. И оно нам ни к чему.
В общем, решил я сделать приятное жене, себе и, заодно, проверить - как на практике будет работать моя задумка.
Требования к ночнику вырисовались такие:
Теплый мягкий равномерный свет.
Плавное включение, т.к. резкое включение света разбудит ребёнка, если он спит. Детей больше одного и всех будить незачем.
Автоматическое включение. То есть когда взрослый поднялся с постели, ночник начинает сам, плавно наращивая яркость, загораться.
Автоматическое отключение. Если в течении некоторого времени нет активности - то также плавно ночник должен гаснуть.
Из того что под рукой
Поскольку дома есть много разного барахла, то порывшись в нём, я нашел несколько вещей из которых и изваял ночничок за один вечер:
В качестве источника света прекрасно подошла старая гирлянда из FixPrice.
Датчик движения - обычный модуль от ардуинки.
Модуль ESP-12.
Кусочек макетной платы для того, чтобы укрепить на нём транзистор, штытьки-разъём программирования, пару кнопок.
Модуль преобразователя 5->3.3В.
Пласмассовая ножка от шкафа, которую я использовал в качестве корпуса.
Источник питания - USB-зарядка.
-
Ну и конечно, болтики-винтики-изолента и прочие паяльники проводки.
Конечный результат получился таким.
![Ночник под управлением ShIoTiny5 (version v0.23) Ночник под управлением ShIoTiny5 (version v0.23)](https://habrastorage.org/getpro/habr/upload_files/b87/1b8/7d5/b871b87d528b05f02d7f2120911174c5.png)
Конечно, любители эстетика могут отвернуть нос... Но это сделано за один вечер из подручных средств. Да и управляющего модуля всё равно не видно ночью)))
Чтобы было понятно что там внутри - приведу схему ночника.
![Схема принципиальная ночника Схема принципиальная ночника](https://habrastorage.org/getpro/habr/upload_files/393/188/74f/39318874fd44fe27b623a1f022ce66a5.png)
Несколько слов о схеме.
Собственно собрал я её из двух готовых модулей - модуля питания, такого как на рисунке.
![](https://habrastorage.org/getpro/habr/upload_files/233/ff7/918/233ff7918fbe867558b3d70c176631c8.png)
И модуля ESP12, который распаял на такую вот белую платку.
![](https://habrastorage.org/getpro/habr/upload_files/f48/67a/713/f4867a713113c963454e86d151950e2f.png)
На ней уже установленып резисторы R2 и R4.
На отдельной макетной плате я распаял штыревые разъёмы для программирования XP1 и кнопки SB1 и SB2. Кнопок, кстати, под рукой не было, я поставил сдвоенный DIP-переключатель.
Датчик движения использовал обычный, от ардуинки, вроде hc-sr501. У меня он но-нэйм, но вроде бы такой же.
![](https://habrastorage.org/getpro/habr/upload_files/718/54c/efc/71854cefc4b02ac691865b3a9abef406.png)
Разъём питания, XS1 - это обычный USB-A разъём, который втыкается в стандартную зарядку для телефона. Красный провод обычно "+", а чёрный - "-". Но лучше проверить. Бывают сюрпризы.
Гирлянда была приобретена в магазине FixPrice в незапамятные времена. Она изначально питалась от USB.
![](https://habrastorage.org/getpro/habr/upload_files/8db/8c5/ffc/8db8c5ffc359a58b43bd6b1f47161d76.png)
Потребляемый ток гирлянды я выяснил прямым измерением. Он был около 50мА. Поэтому, в качестве силового транзистора я без всяких раздумий поставил BC547. Он держит до 100мА, так что обеспечивает двукратный запас по току.
И, наконец, корпус. Это было самое сложное. Но тут я нашел ножку от шкафа!
![](https://habrastorage.org/getpro/habr/upload_files/647/b21/ba2/647b21ba25f7797a2101691c87d373c9.png)
Это ж идеальный корпус! Эта ножка внутри полая. С одной стороны (нижней) там крышка. А верхняя сторона - закручивается. Примерка показала, что туда в несколько слоёв войдут - датчик движения, макетка с разъемами и кнопками, модуль питания и модуль ESP-12.
Все модули и макетка соединены проводами - классическим МГТФ. И, во избежание замыканий между платами - обёрнуты изолентой.
В нижней крышке ножки сделано отверстие для датчика движения, который и прикручен к этой крышке намертво. На первом фото он как раз виден - белый в цетре модуля управления.
По бокам сделаны два отверстия под провода питания и подключения гирлянды.
Подключая гидлянду - надо помнить, что она светодиодная и соблюдать полярность. Минус - к коллектору транзистора, плюс - к Vcс.
Вот, собственно, и всё по "аппаратной части".
Ах, да. Чтобы ножка выглядела не очень ужасно (в ней куча дырочек и царапинок) - крышку, где выведен датчик движения, я покрыл черной изолентой, а боковину обмотал синей. Без синей изоленты ни одно устройство нормально не работает! Аксиома!
Загружаем ПО
Вот, наконец, всё спаяно, смотано и подключено. Пробное включение показало, что напряжения все на месте и ничего не замыкает.
Настал черёд загрузки ShIoTiny5 в наше устройство. Точнее - в модуль ESP-12.
![](https://habrastorage.org/getpro/habr/upload_files/2b6/c6b/b3e/2b6c6bb3e14ee7e9d8d78d67110fc923.png)
Для этого я воспользовался USB-UART кабелем. Черный провод - общий. Белый и зелёный - RxD и TxD. Красный - плюс питания. Его подключать не надо. Подключается кабель к разъёму XP1, который в моём случае представляет просто три штырька. Чтобы перевести модуль ESP в режим программирования, надо выключить питание, нажать на кнопку SB1 "PROG" и, удерживая эту кнопку нажатой, включить питание. Конечно, вместо выключения питания можно было бы нажать кнопку "RESET". Но у меня было крайне мало места на макетке и поэтому я не стал делать такую кнопку. Всё равно она нужна крайне редко. Можно и вилку не полениться из розетки вынуть, а потом вставить.
Прошивка, которая сейчас загружена в модуль носит имя ShIoTiny5 v0.23 и находится по этой ссылке https://shiotiny.ru/?mod=shiotiny-soft5.
А вот тут https://github.com/shiotiny/ShIoTinyBin находится более-менее подробная инструкция - как прошить модули ESP с разным объёмом памяти.
После того, как образ прошит во флешку модуля ESP, надо его перезагрузить (то есть я опять выключил и включил питание).
Если всё сделано правильно, то модуль запустится и на смартфоне мы увидим, что у нас появилась поблизости открытая точка доступа WiFi с именем вроде esp_8266_b455fd или подобным. Последняя группа цифр будет другой. Она берётся из серийного номера модуля чипа ESP8266.
Так как точка доступа открытая - то можно смело к ней подключаться и заходить на неё браузером по адресу http://192.168.4.1 и попадаем на страницу "ShIoTiny Info".
На том, как настроить доступ устройства в вашу защищённую WiFi сеть останавливаться не буду. В конце статьи есть ссылки на инструкции. Хотя, для тех, кто настраивал доступ к WiFi-сетям, скорее всего почти всё будет понятно и без инструкции, если они нажмут на кнопку "Configure" на странице "ShIoTiny Info".
Перейдём к программированию ночника, чтобы он соответствовал моим требованиям. И для этого нам понадобиться другая кнопка на странице "ShIoTiny Info" - кнопка перехода в редактор схем-программ "ElDraw".
Программируем ночник
Программа самого простого ночника, который будет хоть как-то работать выглядит так.
![Программа 1 Программа 1](https://habrastorage.org/getpro/habr/upload_files/7d8/7ca/7d6/7d87ca7d6a94f077eea4a598e44a53dd.png)
Эта программа просто передаёт сигнал с входа GPIO2 на выход GPIO12.
Как только датчик движения срабатывает - на входе GPIO2 появляется лог.1., которая передаётся на выход GPIO12. Транзистор VT1 открывается и гирлянда начинает светится.
Через несколько секунд, если движения нет, датчик движения вновь выставляет на входе GPIO2 лог.0, который передаётся на выход GPIO12. Транзистор VT1 закрывается и гирлянда погасает.
Конечно, для реализации такого "алгоритма" нам не нужны никакие микроконтроллеры, системы программирования и прочее. Но эта программа позволяет за несколько секунд проверить нашу аппаратную часть на предмет её исправности.
ШИМ - плавное зажигание и гашение
Я хотел, чтобы включение и выключение света было плавным. И это нам позволит сделать ШИМ. Покумекав, я нарисовал такую программу.
![Программа 2 Программа 2](https://habrastorage.org/getpro/habr/upload_files/d1f/717/d4f/d1f717d4fb79eac09de84138e0ba873c.png)
Яркостью свечения гирлянды управляет ШИМ, который привязан к ноге GPIO12.
Алгоритм работы ночника представляет собой по сути конечный автомат с 4 режимами работы, которые последовательно сменяют друг друга. Номер режима выставляется на выходе счётчика режима, который циклически считает от 0 до 3.
Режим 0 - покой. Гирлянда выключена. Идёт ожидание сигнала от датчика движения. Как только пришёл этот сигнал - устройство переходит в режим 1.
Режим 1 - плавное включение гирлянды. При переходе из режима в режим, счетчик децисекунд (0.1сек) сбрасывается и начинает свой счёт от 0 до 100. Выходное значение этого счетчика, разделённое на 100, попадает на вход i1 "Мультиплексора яркости". Так как это режим 1, то значение, со входа i1 попадает на выход Q "Мультиплексора яркости" и далее - на ШИМ, управляющий яркостью гирлянды. Счетчик децисекунд увеличивает свое значение на 1 каждую 0.1 сек. Это значит, что за 10сек значение на ШИМ последовательно изменится от 0 до 1 с шагом 0.01. То есть за 10 сеунд гирлянда плавно включится до полной яркости. Как только счётчик децисекунд досчитает до 100, сработает компаратор режима и произойдёт переключение в следующий режим 2.
Режим 1 - постоянное свечение. В этом режиме поступление сигнала с датчика движения на "Счетчик режима" блокируется в течении одной минуты узлом "Delay 0". То есть, чтобы на выходе узла "Delay 0" появился лог.0, необходимо, чтобы в течении одной минуты с датчика движения (GPIO2) ни разу не приходило значение лог.1. Или, по простому - пока ктото ходит рядом с датчиком, режим не переключится и гирлянда будет светится. Но вот все улеглись спать и целую минуту никто не ходил. Датчик движения целую минуту непрерывно показывал нуль. Этот нуль наконец-то проникает на выход узла "Delay 0" и, инвертируясь, превращается в единицу на входе i2 мультиплексора режима. Со входа i2, эта единица попадает на выход Q мультиплексора режима и происходит переключение в режим 3.
Режим 3 - плавное выключение гирлянды. В принципе тут всё полностью аналогично режиму 1. Только значение на выход Q "Мультиплексора яркости" попадает со входа i4, а не i1. Поэтому за 10сек значение на ШИМ последовательно изменится от 1 до 0 с шагом 0.01. То есть произойдёт плавное выключение гирлянды. Как только счётчик децисекунд досчитает до 100, сработает компаратор режима, счётчик режима обнулится и произойдёт переключение в следующий режим - режим 0. Круг режимов замкнулся.
О нашем зрении или не всё так просто
Опробовав "Программу 2", я с одной стороны обрадовался - всё работало хорошо и стабильно и как я задумал. НО! Яркость изменялась очень неравномерно. По визуальному ощущению - где после первых трёх секунд от начала включения гирлянда достигала полной яркости и остальные 7 секунд яркость практически не менялась на глаз. Осциллограф показал, что ШИМ работатет правильно. В чём же дело?
А оказалось, что я забыл об одной особенности человека - его логарифмической шкале ощущений. По-простому говоря, чтобы увидеть визуальное увеличение яркости в 2 раза, необходимо повысить яркость источника в 4 раза. Это прекрасное свойства глаз человека позволяет ему вмещать огромный динамический диапазон видимой яркости - от ночного сумрака до яркого солнечного дня. И это же свойство помешало мне сделать ночник простым.
Логарифм, как известно, компенсируется экспонентой. Поэтому, поэкспериментировав, я нашел приемлемую функцию, компенсирующую физиологию нашего глаза в ночнике.
![При значениях х в диапазоне 0..1 эта функция даёт значения приблизительно от -0.01 до 1.009. И на вид она вполне красивая экспонента. При значениях х в диапазоне 0..1 эта функция даёт значения приблизительно от -0.01 до 1.009. И на вид она вполне красивая экспонента.](https://habrastorage.org/getpro/habr/upload_files/166/c40/fa6/166c40fa6646d06f956eca36c92f9f06.png)
Осталось лишь прописать эту функцию перед выводом значения в ШИМ. И вот что у меня получилось.
![](https://habrastorage.org/getpro/habr/upload_files/b84/a20/a25/b84a20a2505ec382a4a8bb8b85a246e0.png)
Вот теперь, по ощущениям, все 10 секунд идёт плавное повышение или понижение яркости гирлянды. Ночник удался!
Можно ещё приделать управление через интернет. Но это уже совсем другая история.
Заключение
Тем, кому интересна тема визуального программирования микроконтроллеров - предлагаю загрузить ShIoTiny5 в модуль ESP8266 и попробовать сделать что-то самому.
Несколько полезных ссылок:
Страница проекта: https://shiotiny.ru/
Страница документации ShIoTiny5 - там же ссылки на образы прошивок и инструкцию (изменяются по мере разработки).
Кому интересно, вот старый репозитарий прошивок ShIoTiny (НЕ ShIoTiny5!!!): https://github.com/shiotiny/ShIoTinyBin/ - там же расположена инструкция по прошивке модуля ESP8266. Прошивка ПО ShIoTiny5 полностью аналогична прошивке ПО ShIoTiny.
Вопросы, пожелания и предложения можно писать на почту: shiotiny@yandex.ru - она указана так же на сайте.
И, как говорится, простите автору его ошибки!
Всё-таки это ещё Alpha-версия ShIoTiny5.