Новогодняя звезда с Wi-Fi на базе ESP8266



Я уже много лет пытался сделать необычную звезду на новогоднюю ёлку. Первым вариантом была звезда с UV-светодиодами. Они просто светили без каких-либо фишек. Вторая версия звезды была со светодиодной лентой. Опять же ничего интересного — просто статическое свечение. Были задумки доделать режимы, но никак не хватало времени.

К празднованию 2015 года я решил подготовиться заранее, начав разработку новой звезды за месяц до нового года. Мне как раз пришла первая партия новых копеечных (3$) SoC ESP8266. Если интересно, что из этого получилось, прошу под кат.

ESP8266 — платформа достаточно новая, но на Хабре и Гиктаймс уже есть несколько статей по этой теме, например: «ESP8266: Революция в мире интернета вещей» и «Работа с ESP8266: Собираем компилятор и пишем первую прошивку».

Последняя ссылка — это небольшой how-to по настройке окружения для создания прошивок под ESP8266.

Сначала я определился с тем, что хочу получить от девайса.
Основными требованиями были:
1. Возможность включать\выключать ёлку целиком через HTTP протокол;
2. Возможность установки цвета каждого луча звезды через HTTP протокол;
3. Наличие различных «готовых» режимов для работы звезды.

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

У меня было два варианта создания девайса.

Первый вариант — использовать связку ESP8266 с прошивкой AT и Arduino Pro Mini. В этом случае мне требовалось бы только прописать логику работы: все библиотеки под Arduino уже есть. Да и регуляторы напряжения на борту Arduino Pro Mini уже имеются. Но это же неинтересно…

Поэтому я пошёл по второму пути — использование только ESP8266 без Arduino.
У меня была в наличии ESP8266 модификации 01 (самая популярная). Вот такая:



Эта модификация имеет два выведенных GPIO порта, плюс порты UART_RX и UART_TX можно перевести в режим GPIO. Для моей поделки требуется три GPIO порта: DATA и CLK для LPD6803 и порт для управления релюшкой включения\выключения всей ёлки.

Для программирования ESP8266 я решил использовать USB-UART конвертер на чипе PL2303 (который легко купить на ebay или aliexpress за пару долларов). Данный конвертер имеет четыре пина: +5В, GND, RX, TX. Проблема в том, что ESP8266 работает на 3.3В и к 5В не толерантен. По этой причине (и просто для удобства) я решил сделать что-то похожее на development board для ESP8266:



Эта плата понижает напряжение до 3.3В с помощью регулятора LM317, имеет пины для вывода GPIO, UART, GND, 3.3В, 5В и DIP-переключатели для перевода ESP8266 в режим прошивки (GPIO0 на GND, GPIO2 на 3.3В).

Теперь немного о реализации. Основная часть всего проекта это драйвер для LPD6803. Его я портировал из Arduino библиотеки AdaFruit. Рассказывать о принципах работы LPD6803 в рамках этой статьи я не буду, т.к. материал тянет ещё на одну статью.

Для интересующихся дам несколько полезных ссылок:

Даташит
Мой код под ESP8266 на github.com

В моей реализации GPIO0 используется для подключения к DATA LPD6803, а GPIO2 к CLK. Для релюшки мне потребовалось получить ещё один GPIO вывод. Грязные хаки применять желания не было, поэтому я просто переназначил UART_RX в GPIO (всё равно никакого ввода от пользователя моя прошивка не поддерживает). Вот эта строчка кода переводит UART_RX в GPIO3:

PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_GPIO3);

В качестве веб-сервера я использовал код от товарища Sprite_tm. Этот веб-сервер, насколько я знаю, используется практически во всех любительских проектах на ESP8266. В этот веб-сервер уже включена функциональность подключения девайса к домашней сети. По-умолчанию, девайс работает в режиме точки доступа. После подключения к этой точке доступа пользователь может зайти браузером по адресу 10.10.10.1/wifi. На этой страничке он сможет выбрать нужную сеть для подключения (при необходимости можно выбрать скрытую сеть и указать пароль). Все ответы веб-сервера можно получить в JSON формате, что очень удобно для интеграции в различные системы и приложения.

По софтовой части рассказать мне больше нечего, код прошивки доступен на github.com.

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



Мне повезло, т.к. RGB-светодиоды с чипами LPD6803 идеально встали в фиксаторы для ламп накаливания:



Модуль ESP8266 я решил разместить непосредственно в звезде, т.к. качество Wi-Fi сигнала на верхушке ёлки будет лучше, чем под ней.

Под ёлкой же я установил блок питания 12В и самодельную плату такого вида:



Как видно, на ней два регулятора напряжения, которые выдают 5В и 3.3В. 5 вольт используется LPD6803, а 3.3 вольта, как уже писалось выше, кушает ESP8266. Кроме регуляторов на плате размещена 12В релюшка. Дёргается через транзистор. От коробочки под ёлкой к звезде идёт 4-жильный кабель: 3.3В, 5В, GND и канал управления реле.

На данный момент в работе этой звезды существует проблема, связанная с багой в обёртке TCP\IP стека ESP8266.
Чтобы решить эту проблему, нужно перейти на прямое использование lwip без обёртки.

В планах развития проекта есть две вещи:
1. Реализовать работу через протокол MQTT;
2. Подружить звезду с OpenHab.

Ну и напоследок, видео работы. Для управления используется Android приложение (сырое, поэтому исходники не выкладываю). Озвучивает жена:

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 29

    +1
    Пятерка за идеи, реализацию и описание!

    Несколько таких игрушек можно закрепить на городской елке. Среди жителей распространить приложение для управления и посмотреть, что получится. Детям должно быть интересно.
      0
        +1
        Если все произойдет так, как на картинке, значит это успех и все великолепно!
        +1
        Дети были довольны, дочь (2.5 года) быстро освоила управление ёлкой с телефона и развлекалась.
        +2
        А можно схему понижения до 3.3? У меня есть две платы, сейчас жду конвертер на PL2303, так что скоро тоже буду пробовать. Не хотелось бы спалить плату, у которой смог расширить количество GPIO с помощью хака.
          +1
          Напряжения питания? LM1117-33 плюс два конденсатора как по даташиту
          Или согласования уровней? Выходы согласовывать не нужно 5В логика принимает 3.3В логические уровни как родные, а входы согласовать простым делителем на резисторах в соотношении 2:3 т.е. 200Ом/300Ом или 2кОм/3кОм и т.д.
            +1
            Для UART согласование уровней не нужно, работает с PL2303 напрямую.
            Для питания я использовал LM317, вот калькулятор для расчёта резисторов:
            cxem.net/calc/lm317_calc.php
            А вообще есть готовые кренки для понижения напряжения до 3.3В (просто у меня их не было в загашнике).
              +3
              Под андроид есть здоровский калькулятор ElectroDroid для делителей, стабилизаторов и т.д. подбирает близкие номиналы резисторов из заданного ряда и выдаёт погрешность по сравнению с «чистым расчётом». Не хватает только возможности подобрать схему параллельного/последовательного соединения резисторов по перечню имеющихся номиналов для достижения расчётного.
                0
                Калькулятор на cxem.net тоже учитывает стандартные ряды :)
                  0
                  Я к тому что приложение на смартфоне и не завязано на интернет, всегда с собой. Даже когда компьютера нет под рукой.
                0
                То есть 5 вольт TX пойдет на вход ESP8266, который запитан от 3.3 и ему ничего не будет?
                  +1
                  Мой USB-UART адаптер на PL2303 выдёт около 3В на TX (мерял мультиметром).
                  ESP8266 не толерантен к 5В на UART, так что лучше сначала проверить напряжение на TX.
                  0
                  На конвертерах как правило есть переключатель выходного напряжения. По крайней мере на некоторых платках переходников есть такой переключатель.
              0
              Странно что всё работает… 3.3В я бы расположил непосредственно возле модуля, импульсный ток там может достигать 300мА — а это падение напряжения на проводах, излучение помех в эфир и самое плохое — просадка напряжения на конце провода во время наибольшей нагрузки.
              Можно было использовать регулятор вроде LM1117-33 SMD корпус TO-223.
                0
                Я пока начинающий радиолюбитель, так что ошибки возможны :-)
                От блока под ёлкой до звезды около 2 метров, используется полёвка в качестве соединительного кабеля.
                  0
                  Считай, повезло. Может, модуль просто еще не использовал максимальную мощность передатчика и не просаживал себе же питание поэтому и работает.
                  Главное, на ошибках учится а не повторять.
                0
                Надеюсь, ровно в 12 ночи она выдала какую-нибудь волшебную анимацию?
                  0
                  Системы правил в текущей реализации нет. Такие вещи отлично делаются при интеграции с OpenHab.
                    0
                    Ровно в 12 ночи волшебную анимацию показывает график давления холодной воды от водоканала. О причинах подумайте сами.

                      +1
                      Вообще никто не моется, не сидит в туалете, не моет посуду и т.д., т.к. все за праздничным столом? Правильная причина?
                        0
                        Все верно! И в этот момент давление достигает своего максимального значения. А потом, довольно быстро все начинают заниматься привычными делами и давление вновь падает. Еще один интересный момент, это 7 часов утра 1 января, когда все спят и давление вновь поднимается, но уже не так резко, как в новогодний момент.
                    0
                    Ёлка со звездой на китайский Новый Год? Ну вы и извращенец!
                      0
                      На данный момент в работе этой звезды существует проблема, связанная с багой в обёртке TCP\IP стека ESP8266.


                      А что за проблема, как она проявляется?
                        +1
                        Суть баги описана здесь:
                        esp8266.ru/forum/threads/podderzhka-mqtt-v-nodemcu.72/#post-985

                        Там в контексте MQTT клиента NodeMCU, но он использует ту же обёртку, что и моя прошивка.
                          0
                          То есть получается, что для серьезных устройств этот модуль на данном этапе развития своего ПО не подходит? Это же не дело, если в результате внешних факторов модуль зависает или типа того.
                            0
                            Есть прошивка на FreeRTOS. Там этой баги быть не должно, т.к. она специфична для ESP SDK.
                            Ну, и никто не мешает реализовать свою обёртку для lwip стека, а не использовать китайские.
                              +2
                              Во FreeRTOS SDK от Espressif используется тот же набор кривых библиотек что и в ESP SDK, так что все баги из классической Espressif SDK благополучно перекочевали во FreeRTOS SDK.

                              Обёртку для lwip стека довольно сложно реализовать, т.к. нужно очень глубоко знать не только сам стек LwIP, но и протокол TCP/IP чтобы не состряпать таких же багов как состряпала Espressif, поэтому самое простое — это использовать нативный стек LwIP и не мучиться с глючным espconn (обертка от Espressif)
                            0
                            Да, хотя баг такой имеется у ESP, но вполне реально уже писать работающие прошивки. Просто надо не допускать одновременный запуск нескольких TCP сессий… У меня, по крайней мере, получился вполне рабочий проект беспроводного датчика, а точнее уже вполне IoT контроллер. Конечно если Espressif недопилит это, то придется вникать в LwIP и переходить на его. Но пока, судя по форумам Espressif не особо собирается исправлять этот косяк — для этого надо переписать половину SDK…

                        Only users with full accounts can post comments. Log in, please.