Дисклеймер: Специально для тех 3х людей, что подписались, пишу серию постов про работу с микроконтроллерами. В частности мы будем рассматривать микроконтроллер ESP8266 на примере платы ESP12F. Прошу сразу заметить, я не супер специалист в программировании микроконтроллеров, но за последние пару лет немного в этом поднаторел и считаю что знаю достаточно, чтобы помочь въехать в тему и дальше в ней самостоятельно развиваться. Все ссылки в посте приведены как пример, чтобы понимать цену и как выглядит товар, вы можете найти все это самостоятельно если есть желание на любой другой площадке или другого продавца.
Начнем с вопроса - Сколько стоит, где купить и что необходимо чтобы начать вливаться.
1) Сама по себе платка ESP12F, я знаю что есть Wemos и он основан на этой же платке, только с ногами, но я специально буду рассматривать платку в отрыве от внешней обвязки. Хотя бы потому что так она занимает меньше места. Для меня это плюс. Ссылка на саму платку.
2) Макетная платка для программирования ESP12F. Без макетки тут "никак", на самом деле можно без нее, но тогда нужен будет UART конвертер и будут сложности чисто по части удобства. Ссылка на макетку. По ссылке есть так же макетки для платок на основе ESP32, но мы их рассматривать не будем.
3) Кабель microUSB-USB для подключения макетки к компьютеру, тут я думаю проблем не возникнет.
4) Модуль реле для Ардуины, нам он будет нужен только для примера работы (спойлер: сделаем свое умное реле с управлением через телеграм бот). Ссылка.
5) Блок питания на 5V DC(вольт постоянного тока), вольтаж такой же как в любом заряднике. Можете взять например старую USB зарядку от ненужного телефона, либо взять что то вроде того что по ссылке ниже. Питание самого микроконтроллера у нас 3.3V DC, но мы возьмем 5V DC, потому что нам нужно запитать модуль реле, а он 5 вольт. Ссылка.
6) AMS1117. Эта замечательная микрушка позволяет нам сделать из 5 вольт 3.3 вольта. Ссылка.
Так же мы можем добавить сюда батарею и модуль зарядки, но это уже как нибудь потом разберем.
Так же на компьютере нам нужно установить Arduino IDE. Да, я в курсе что есть PlatformIO, но для новичка Arduino IDE выглядит менее нагруженым и более понятным. Сама по себе программа бесплатна и качается с официального сайта. Ссылка
С установкой Arduino IDE проблем возникнуть не должно, она проста как 2 копейки. Перейдем сразу к настройкам. Первое что нам необходимо, это сделать доступными профили плат ESP. Переходим в настройки
В поле поиска "ESP8266", устанавливаем. В моем случае уже все готово, потому кнопки Install нет.
Закрываем это окно и теперь у нас доступны платы на базе ESP8266. В нашем случае нужно выбрать Generic ESP8266 Module
Из настроек нас интересует 2, Flash Size и Erase Flash. Выставляем как на скриншоте.
Далее перейдем к подключению. Сама по себе ESP12F вставляется в макетку с щелчком от подпружиненых ножек и должна в ней держаться, но у меня бывали случаи самовольного выщелкивания, потому стоит использовать "крабик". Лимит поста:(
Мне давно приглянулись накальные индикаторы ИВ-9 и ИВ-16 (то же, только чуть короче за счёт отсутствия десятичной точки), но в интернете крайне мало проектов на них, поэтому когда появилась возможность, я решил сделать свой. Вот что получилось:
Прежде чем заняться разработкой собственного проекта, я наткнулся на этот, показавшийся мне интересным: https://cxem.net/mc/mc490.php. Заказал 5 плат (немного изменив их под себя - проект частично открытый), собрал одну с индикаторами ИВ-16:
Получилось неплохо, но некоторые моменты мне не понравились. Во-первых, несмотря на наличие нескольких режимов (анимаций, эффектов) смены цифр, среди них не было моего любимого - плавной смены цифр с наложением их друг на друга. Во-вторых, мне не очень понравилось управление двумя кнопками, я предпочитаю делать три: "ок" для входа в меню и подтверждения, "+" и "-" для установки показаний. В-третьих, часы работают от 5В, а 3В для питания индикаторов микроконтроллер формирует методом ШИМ - это позволяет сэкономить на отдельном преобразователе, но есть мнение, что в случае какого-то сбоя, на лампы может пойти 5В, что выведет их из строя. Часто такое пишут в комментариях к часам nixie clock, где микроконтроллер формирует примерно +180В для них. Кроме того (и это уже не предположение, а факт, обнаруженный после сборки) , при подключении к сети на долю секунды на лампы идут эти самые 5 Вольт (видимо, пока микроконтроллер не дошёл до выполнения функции формирования ШИМ сигнала).
С учётом всего этого я решил разрабатывать собственную схему. За основу была взята схема из представленного выше проекта: Atmega328 в корпусе TQFP32 (в дальнейшем возможно применение микроконтроллеров с меньшим объёмом памяти, без загрузчика для отладки), DS3231M, 74HC595 и ULN2003. Я даже не стал рисовать собственную схему, а изменил имеющуюся в графическом редакторе:
Для питания индикаторов нужно 3 Вольта, для всего остального - пять. Я решил использовать блок питания на 5В, а напряжение для индикаторов получать с помощью отдельного импульсного понижающего преобразователя:
Схемы рисовал уже после сборки часов, так что в них могут быть какие-то мелкие ошибки. Преобразователь настроен на напряжение питания индикаторов, плюс падение напряжения на сдвиговых регистрах и транзисторных сборках. В случае, если в микроконтроллере произойдёт программный сбой, на лампы никак не попадут 5 Вольт. Да, возможен и выход из строя NCP1529, но его я считаю крайне маловероятным.
Платы получились вот такие:
На них предусмотрен разъём для подключения USB-Serial TTL конвертера для прошивки и возможности отладки, который позже можно убрать. Также предусмотрена возможность установки RTC в двух разных корпусах.
После пайки всех деталей и ламп получилось следующее:
Микроконтроллер и кварц я выпаял с платы Ардуино, так что загрузчик там уже был - не пришлось прошивать его отдельно через ISP. Подключил адаптер с СН340 и начал писать прошивку как для обычной платы Arduino nano. У меня на неё ушло несколько дней, результат очень порадовал:
В этом экземпляре лампы были установлены какие попало: первая - с другим углом наклона спиралей, четвёртая - тусклая. Позже был собран второй, дальше на фото и видео будет он.
Для корпуса была заказана вот такая заготовка из древесины бубинго:
Её хватило на 3 корпуса:
Получились они вот такими:
Оставалось только сделать отверстия для кнопок и шнура питания, а также для крепления платы и нижней крышки. Позже он был покрыт тунговым маслом:
И всё готово:
То ли из-за особенностей индикаторов, то ли из-за плохой камеры, я не смог сделать хорошие фотографии и видео. В реальности спирали светятся красивее.
При другом освещении:
И ещё. А также сравнение с часами на ИН-16:
И пара видео. Обычная смены цифр:
И плавная:
Календарь, будильник, термометр и прочее я посчитал лишним. Есть лишь два режима смены цифр (в первом - три уровня яркости).
Недавно я изготовил на заказ очередную партию вот таких часов:
Несколько экземпляров отправил заказчику, один остался у меня. И пользуясь случаем я решил попробовать найти ответ на вопрос, который задают многие из покупателей этой модели: как долго они работают от одного заряда.
В описании к оригинальному проекту автор сделал следующий вывод: с аккумулятором размерами 5*12*40 мм и заявленной ёмкостью 250 мАч, с прошивкой без анимации перед показом часов и минут в непрерывном тесте аккумулятор разрядится до 3,5 за 7800 секунд. На показ времени требуется 2 секунды, из чего автор прогнозирует 3900 включений.
В своих же часах я использую другую прошивку, в которой перед показом часов и минут в обеих лампах быстро перебираются все цифры, поэтому я предполагаю, что на один показ времени они расходуют чуть больше энергии. Также я использую токоограничительные анодные резисторы меньшего номинала, чтобы цифры светились лучше, а вместо светодиодов для индикации часов и минут использую точки в лампах.
Исходные данные: аккумулятор размерами 5*12*40 мм с заявленной ёмкостью 200 мАч, полностью заряжен. Я сделал следующее: к ножкам кнопки в часах подпаял плату Ардуино, которая имитировала нажатие на кнопку раз в 3 секунды, вела счёт нажатий и выводила счётчик на экран ноутбука. Дополнительная секунда здесь - чтобы после окончания показа времени часы вернулись в режим покоя, а высоковольтный конденсатор - разрядился. Этот интервал правильнее было бы ещё увеличить, но тогда тест занял бы ещё больше времени. Также к ноутбуку я подключил USB-эндоскоп, который снимал часы и выводил изображение на экран. А специальное приложение занималось съёмкой экрана. Таким образом я хотел получить видео, которое было бы неоспоримым подтверждением количества включений часов. Выглядело это всё вот так:
А дальше всё пошло не по плану. Автономность часов оказалась на очень высоком уровне, весь процесс занял у меня два часа. И занял бы больше, если бы не следующее: я недостаточно зарядил ноутбук, а порт для зарядки оказался занят эндоскопом, так что тест пришлось прервать на красивом числе - 2222.
После этого выяснилось, что я неправильно настроил программу для записи экрана: два часа видео объёмом более 1 гигабайта она записала, вот только это получилась скорее склейка из скриншотов экрана с интервалом в полсекунды - смотреть невозможно.
Я хотел оставить примерно по минуте в начале и в конце, а всё остальное сильно ускорить, чтобы получить короткий ролик, но не смог этого сделать, так что от этой затеи отказался.
И вот почему: тем, кто поверит в достоверность данных, видео не нужно, а тех, кто не поверит, видео не убедит. К тому же, в таком виде его очень просто можно назвать подделкой.
Итак, вернёмся к результатам теста. После 2222 включений часы показали уровень заряда 26%. Напряжение на аккумуляторе я при этом измерить забыл. В данной схеме стабильность работы повышающего преобразователя (в том числе "качество" свечения цифр) во многом зависит от применяемых электронных компонентов, поэтому вполне возможно, что лампы перестали бы нормально светиться при уровне заряда 25/10/5 процентов. А в другом экземпляре на этих же компонентах, но с другими лампами - при 2%. Это всё можно определять только более корректными тестами каждого экземпляра, чего никто скорее всего делать не будет. Это я всё к следующему: в режиме ожидания часы потребляют очень малый ток, но ведь есть ещё и саморазряд аккумулятора, благодаря чему я могу с уверенность сказать, что при включении часов раз в час они не смогут показать результат в 2000 включений от одного заряда.
Вместо вывода: данный тест, даже неоконченный, - и бессмысленный и полезный одновременно. Не стоит рассчитывать на полученный здесь результат (за исключением случая, где владелец будет зачем-то два часа подряд нажимать на кнопку), но и беспокоиться о том, что часы нужно будет заряжать каждый день - тоже. Вне зависимости от частоты использования одного заряда будет хватать надолго.
Как известно, к Новому году всегда надо готовиться заранее. Вот и мне подумалось, что надо расчехлять паяльник и начинать делать праздничную иллюминацию в квартире. На данный момент готовы два устройства из трёх, для последней гирлянды едут адресные светодиоды. Но идея обкатана и показала себя вполне рабочей.
Этап первый. Теоретический.
Любое мало-мальски инженерное устройство должно начинаться с 1) Составления ТЗ 2) Подбора железа 3) Подбора ПО Второй третий пункт взаимосвязаны, что логично.
Итак, техническое задание.
У меня работали две гирлянды, собранные на WS2812b под управлением маленькой платки Arduino Nano (родом из Китая) с микроконтроллером ATmega328p. Как это водится в Китае - маркировка чипа была почти нечитаемой, прошивка заливалась раза с третьего-четвёртого. Но система работала, и даже не тормозила.
Гирлянд было две: одна висела на ёлке и состояла из 126 последовательно соединённых светодиода, оконная гирлянда состояла из 74 светодиодов и представляла собой 9 линий светодиодов переменной длины, соединённых последовательно.
В старой гирлянде было крайне неудобно включать/выключать подсветку и переключать режимы. Это же необходимо встать с дивана, подойти к устройству, нажать кнопку. Соответственно, в новой системе необходимо реализовать управление через мобильный телефон. Так же, стоит учесть, что в моём доме ёлка стоит около окна, и будет видно сразу две гирлянды. Соответственно, стоит предусмотреть возможность обмена данными между этими гирляндами для возможности синхронизации режимов. Причём, синхронизация должна быть не "приколоченной намертво", а вполне себе опциональной.
Подбор железа
Исходя из ТЗ становится очевидно, что достаточно просто поменять контроллер с старой-доброй атмеги на что-то из семейства ESP. Эта система на кристалле (да, именно так её называет производитель, SoC) из коробки имеет на борту достаточно шустрое ядро, WiFi и приличный объём памяти. Но, имеет место быть небольшой конфликт: рабочее напряжение пинов ESP 3.3В. А напряжение питания WS2812b составляет от 3.5 до 5.3В, исходя из даташита. Причём, "протокол" передачи данных для светодиодов подразумевает формирование прямоугольных испульсов, кодирующих 24 бита цвета для каждого светодиода. Уровень "0" в этой последовательности должен быть <0.3VDD (напряжение питания), уровень "1" >0.7VDD.
Я покопался в своих закромах и обнаружил две платы Wemos D1 mini (на базе ESP8266) и одну плату LOLIN S2 mini (на базе ESP32-S2). Обе платы имеют всю необходимую обвязку для подключения внешнего питания 5В и подтягивающие резисторы для запуска МК. Там же, в закромах родины нашёл весьма удобные макетные платы под форм-фактор этих устройств.
Макетная плата для Wemos D1. К LOLIN S2 mini тоже подходит, но маркировака пинов не совпадёт
Это снимает проблему согласования напряжения питания ESP и WS2812b. Но возникает опасение, что уровень логической "1" от контроллера будет недостаточным для формирования управляющего сигнала. Ведь, согласно даташиту, уровень "1" >0.7VDD. А питание светодиодов у нас 5В, соответственно, требуемый уровень логической единицы равен 0,7 * 5 = 3,5В. Тут я пошёл по пути экспериментов, быстренько набросал схемку на бредборде и проверил, а как оно, заведётся, или нет. Ведь, исходя из моего опыта общения с контроллерами семейства STM32, уровня 3.3В должно быть вполне достаточно. И оно завелось!
Подбор ПО
Очевидно, что прошивка будет самописная. Надеяться, что вот сейчас я зайду в гугл, забью "прошивка ESP8266 с моими требованиями" и все найдётся и заработает достаточно наивно. Да и неспортивно это. В случае с ESP есть два основных фреймворка для написания прошивки. Профессиональный ESP-IDF с его ориентированностью на чистый С и Arduino IDE с ядром ESP. Причём второе - это, по сути своей, обёртка вокруг ESP-IDF. Так как у меня была хоть и ущёрбная, но рабочая прошивка для Arduino Nano, написанная в Arduino IDE, я остановился на втором варианте.
Этап второй. Практическая реализация в железе.
Схема в общем виде выглядит так:
Ничего сложного и интересного. Единственное, для одной из систем одна из кнопок была заменена на устройство bme280, работающее по протоколу I2C. Интересно отслеживать влажность в помещении и уровень давления. Показания температуры врут безбожно: датчик находится слишком близко к ESP, которая имеет привычку сильно нагреваться. Спаять устройство по этой схеме не представляет ничего сложного. Но ведь хочется сделать всё красиво. А значит нужен корпус для устройства и система крепления гирлянды. С корпусом всё довольно просто. Минут 30 в Компас3D, час работы 3D принтера и в руках корпус, подогнанный под конкретное спаянное устройство. Магия термоклея, и на выходе получается вполне себе симпатичный прибор:
Безусловным плюсом будет возможность заменить плату в случае необходимости
С системой крепления всё чуточку интереснее. Если на ёлку крепить гирлянду не требуется (просто берём и обматываем гирлянду вокруг дерева), то на окно требуется крепёж. Тут возможно реализовать два варианта: установить гирлянду непосредственно перед окном, но за шторой. Тогда праздничное настроение будет создано людям, гуляющим на улице и смотрящим на мой седьмой этаж. Либо размещать гирлянду перед шторой. Тогда праздничное настроение будет у всех, находящихся в комнате. Я пошёл по второму пути. Штора крепится на гардину с Т-образными пазами. И вновь на помощь приходит компас и 3D-принтер. В каждой точке, из которой спускается светодиодная гирлянда была изготовлена вот такая сборка из двух деталей:
Бонусом, такая конструкция хорошо фиксирует сборки проводов, и конструкция получается довольно добротной. Следующей "железной" проблемой стало то, что провод со светодиодами достаточно лёгкий, и гирлянда отказывалась висеть вертикально. И вновь 3D принтер спасает положение. Я напечатал несколько тематических грузиков, и привязал их на тоненькие верёвочки. Получилось весьма достойно:
Этап третий. Программное обеспечение aka прошивка
А вот прошивку не скину в чистом виде. Только если кто-то хочет повторить - могу ему слить данное поделие. Ибо в коде есть ряд проблем, которые пока не решены.
Принцип работы системы прост до ужаса. Намертво зашиты константы с SSID/PASS моей локальной WiFi сети и IP адреса всех гирлянд, участвующих во взаимодействии. Arduino IDE хорош, в первую очередь, невероятным количеством библиотек. Итак, что есть сейчас, и для чего используется.
Разумеется, WiFi, для подключения к локальной сети. SSID и пароль забиты в дефайны, что есть хардкод, и вообще моветон
FastLED для управления WS2812b. Реализован простейший алгоритм отслеживания потребляемого гирляндой тока и ограничение оного к возможностям источника питания. Работает, на мой взгляд, лучше встроенного в библиотеку.
WebServer для поднятия странички управления гирляндой, если сильно лень подходить и нажимать кнопку. Я не сильно дизайнер, но страничка получилась довольно простой и информативной.
UDP для общения между гирляндами. Да, я знаю, что есть ненулевой шанс потери данных, поэтому пришлось реализовать достаточно простой алгоритм проверки корректности пришедших данных. Битые пакеты отбрасываются. Вроде бы это не очень хорошо, но я тут не космический корабль запускаю, и не ядерным реактором управляю. Если синхронизация произойдёт на 100мс позже, то ничего страшного. Хардкод в данном случае - IP-адреса гирлянд, участвующих в обмене информацией, жестко прописанные в роутере.
ArduinoOTA. Лень каждый раз подключать ESP напрямую к компу, когда хочется что-то поменять в прошивке. А так всё выходит просто: обновились по воздуху, и радуемся.
Web-страничка для управления гирляндой
В качестве гирлянды-мастера выбрана ёлочная. На её страничке можно поставить галочку с требованиями синхронизации остальных гирлянд, и её режим будет транслироваться всем остальным.
Примеры гирлянды, которую мне лень снимать сейчас :)
Примеры гирлянды, которую мне лень снимать сейчас :)
Примеры гирлянды, которую мне лень снимать сейчас :)
В сухом остатке получилось несколько устройств, на которые не стыдно посмотреть, которые не стыдно показать и которые работают и радуют глаз. Возможно, когда разберусь с текущими проектами - вернусь к доработке гирлянд. Избавиться от хардкода, что не очень сложно и чуть улучшить синхронизацию (заставить гирлянду-мастера передавать не только свой текущий режим, но и конкретный тик из millis() для более эффектного внешнего вида) и всё, пожалуй. Сделать полноценное Android-приложение, управляющее гирляндами. Возможно, имеет смысл сделать отдельный сервер на полновесной ESP32, который собирал бы данные с гирлянд, и синхронизировал их при необходимости. Но это уже вопрос полноценного самописного умного дома, т.к. к такому серверу можно подключить любое устройство на базе ESP. Для работы с MQTT так же есть полноценные библиотеки. В общем, проект получился достаточно простым, но интересным с точки зрения возможности масштабирования.
На этом всё, спасибо, что дочитали. Ссылок на телегу не будет, это всё от лукавого :)
Прошло уже более полугода с момента начала работы над часами на ИВ-9 или ИВ-16 (Часы на ИВ-9 - видео работы), и вот наконец они закончены.
Получилось как-то так:
Есть и режим, при котором цифры меняются не плавно, а резко:
К сожалению, моя камера плохо передаёт реальный цвет нитей, поэтому пришлось приглушить свет, чтобы на картинке цифры выглядели более похожими на реальные.
В скором времени постараюсь написать пост об их сборке, в котором будет чуть больше подробностей. Для вопросов, на которые я не могу ответить здесь, почта - matvey6191@gmail.com
Взять с собой побольше вкусняшек, запасное колесо и знак аварийной остановки. А что сделать еще — посмотрите в нашем чек-листе. Бонусом — маршруты для отдыха, которые можно проехать даже в плохую погоду.