Я уже много лет пытался сделать необычную звезду на новогоднюю ёлку. Первым вариантом была звезда с 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 и канал управления реле.
На данный момент в работе этой звезды существует проблема, связанная с багой в обёртке TCPIP стека ESP8266.
Чтобы решить эту проблему, нужно перейти на прямое использование lwip без обёртки.
В планах развития проекта есть две вещи:
1. Реализовать работу через протокол MQTT;
2. Подружить звезду с OpenHab.
Ну и напоследок, видео работы. Для управления используется Android приложение (сырое, поэтому исходники не выкладываю). Озвучивает жена:
Автор: popsodav