данная тема достаточна обширна, и сложно будет её за раз выложить в готовом виде. Подготовка и исправление материалов занимает очень много времени (которого свободного у меня нет в должном количестве), и поэтому прошу модераторов дать мне отсрочку, хотя бы в неделю, для последовательного пополнения. Желательно закрепить еще 2 первых поста для дополнительной сопутствующей информации. Спасибо.
В прошлом я был создателем одной из прошивок Лампы Гайвера и материалы выкладывал на страницах этого форума. В какой-то момент проект был полностью переработан и адаптирован для новых задач, о которых я хотел бы писать на этих страницах. Месяца 2 назад мне потребовалось сделать прошивку для управления светодиодной лентой. Используя старые наработки и желание сделать общий алгоритм работы и управления, полностью переделал код. На данный момент разработка представляет собой управление ёлочной гирляндой (как ни странно Новый Год на носу) - это была моя самая давняя мечта, и я планирую осуществить ее до конца этого года. А так как программа была "поломана", то восстановление функционала Лампы Гайвера на новом "движке" это уже следующий этап. Итак...
В прошлом я был создателем одной из прошивок Лампы Гайвера и материалы выкладывал на страницах этого форума. В какой-то момент проект был полностью переработан и адаптирован для новых задач, о которых я хотел бы писать на этих страницах. Месяца 2 назад мне потребовалось сделать прошивку для управления светодиодной лентой. Используя старые наработки и желание сделать общий алгоритм работы и управления, полностью переделал код. На данный момент разработка представляет собой управление ёлочной гирляндой (как ни странно Новый Год на носу) - это была моя самая давняя мечта, и я планирую осуществить ее до конца этого года. А так как программа была "поломана", то восстановление функционала Лампы Гайвера на новом "движке" это уже следующий этап. Итак...
LEDraw Project: платформа для светодиодной графики / расширение возможностей FastLED
LEDraw Project - это платформа для светодиодной графики базирующаяся на популярной библиотеке управления адресными светодиодными лентами FastLED. Основное назначение этой платформы, как ни странно, это экономия ресурсов контроллера при повышении качества выводимой "картинки". На данный момент включает в себя набор объектов с оптимизированной структурой для иерархичного доступа к ресурсам котроллера, а также ряд высокопроизводительных графических функций для рисования эффектов. В дополнении, имеется еще ряд полезных и совместимых модулей расширяющих функционал этой платформы, таких как управление кнопкой, полноцветные индикаторы (адресные светодиоды находящиеся в цепочке, но не участвующие в прорисовке основного эффекта, служащие, например, для индикации режима, уровня сигнала и пр.), управление питанием и яркостью...
Примеры реализации проекта LEDraw:
LEDraw stripe - 144LEDs, 1D-graphix, faders, 1D-OSD
LEDraw garland (гирдянда) - 249LEDs, 1D-graphix, faders, 1 inLED-indicator
Схема подключения:
Замечено, что такая схема выдерживает подключение 100-150 стандартных адресных светодиодов без проблем от стандартной USB зарядки на 2А (при условии выставления соответствующего тока в конфигурации)! Резистор 150 Ом желателен, но не обязателен в случае если лента не работает.
Схема подключения дополнительного исполнительного устройства (моторчик, или бэкграунд подсветка):
Рабочие конфигурации:
№9 - полоска из светодиодов ws2012b
№10 - дисколампа на ws2012b
№11 - гирлянда на ws2011
При работе над эффектами было замечено, что многие из них начинали вести себя совершенно другим образом, когда менялось, например, количество светодиодов. Либо появлялась дискретность изображения, либо эффект замедлялся(ускорялся) до нежелательных скоростей, а иногда картинка переворачивалась, и приходилось лезть в код, чтобы разобраться с неведомыми параметрами, чтобы привести все в норму. А иногда эффект сильно тормозил весь процесс, пересчитывая "тяжелые" или излишние кадры. В данной платформе появился некий интерфейс между процедурой отрисовки эффекта и программой управления (менеджером), что позволило сократить количество ресурсов занимаемых у контролера без потери качества самой отрисовки. Более того, повысилась плавность и четкость отрисовки благодаря использованию легких и понятных графических функций (словно как в Бэйсике - Draw, Line, Plot...)
Объекты LEDraw - функционально законченные и оптимизированные модули, позволяющие удобно их использовать в своих разработках. Написаны в виде структур, а не классов, что позволяет более рационально использовать ресурсы контроллеров. В частности, все методы в структурах единожды описываются в памяти при компиляции (являются общими), а не дублируются как в классах без усложнения кода.
Статический объект effect описывает все для необходимого для отображения эффекта.
- Переменные и свойства:
- *current - указатель на свойства текущего эффекта
- uint8_t speed - полное значение регулятора скорости
- uint8_t scale - полное значение регулятора скорости
- timer - объект внутреннего счетчика времени. Используется для отсчета скорости смены кадров, или таймер смены эффектов
- *leds - указатель на массив памяти (светодиоды), с которым работает данный эффект
- int8_t/int16_t i - универсальная переменная, индекс используемый текущим эффектом для внутренних целей
- int8_t/int16_t indexes[ ] - универсальная масштабируемая переменная используемая текущим эффектом для внутренних целей
- CRGB colors[ ] - универсальная масштабируемая переменная используемая текущим эффектом для внутренних целей
- A, B, C, D - универсальные переменные используемые текущим эффектом для внутренних целей. Каждая занимает всего лишь 4 байта, но может использоваться как 4 однобайтные переменные, 2 - двухбайтные, как 1 четырехбайтная, или быть представлена как RGB цвет
- rgb16_palette/g_palette - универсальная переменная для описания текущей палитры
- Методы:
- bool hasChangedEffect() - возвращает сбрасываемый признак смененного эффекта
- bool hasChangedParams() - возвращает сбрасываемый признак изменённых параметров Speed, Scale, Bright
- bool hasChangedSpeed() - возвращает сбрасываемый признак изменённого параметра Speed (Скорость)
- bool hasChangedScale() - возвращает сбрасываемый признак изменённого параметра Scale (Масштаб)
- bool set(effect)- устанавливает эффект текущим. Возвращает признак успешного выполнения операции
- effect - индекс (uint8_t) эффекта из списка effects_array[ ]
- void setPalette(&palette)- установка текущей (рабочей) палитры эффекта
- &palette - адрес обычной RGB16(TProgmemRGBPalette16Ptr), или градиентной палитры (TProgmemRGBGradientPalettePtr)
- bool tick() - прорисовка "кадра" эффекта. Возвращает true, если кадр изменился
- CRGB ColorFromPalette(index, brightness, blendType) - локальная реализация функции для работы с текущей палитрой
- void fill_palette(N, startIndex, incIndex, brightness, blendType) - локальная реализация функции для работы с текущей палитрой
- Переменные и свойства описания эффекта:
- uint8_t id - индекс текущего эффекта
- bool *action(&effect)- указатель на процедуру прорисовки кадра. Возвращает признак непустого кадра
- &effect - ссылка на параметры передаваемые в процедуру эффекта
LEDraw позволяет с легкостью конфигурировать несколько родственных проектов со своими настройками. Осные настройки находятся в файле config.h. Дополнительные кастомные настройки в своем конфигурационном файле находящимся в корне проекта. Смысл заключается в том, что кастомный конфигурационный файл переписывает необходимые установки define под конкретную реализацию проекта.
Первоначально эффекты работали с 8 палитрами, но в процессе адаптации появилась возможность работать с градиентными(!) палитрами, коих в коллекции насчитывается уже 34 шт.
- Кнопка - Да
- Демо-режим - Да (в минимальной конфигурации)
- Индикаторы - Частично
- Регуляторы (интеллектуальное управление кнопкой + визуализация) - Частично
- AuxDrive (моторчик, одноцветная LED лента...) - Да
- Дизеринг - Да
- Фаворитные списки - Нет
- Пульт - не отлажен
- Фэйдеры эффектов - Да
- Анимационные фэйдеры - Да
- WiFi - не отлажен
Button: --- v.2.0.01γ (01.12.2020)
Алгоритм управления кнопкой
Действие по умолчению (если не выполнено другое):
- / удержание - регулировка глобальной яркости
*- / 1 + удержание - ... скорости эффекта
**- / 2 + удержание - ... масштаба эффекта
***- / 3 + удержание - регулировка яркости эффекта (для проектов с моторчиком - скоростьего вращения)
Из профиля OFF/SLEEP:
* / 1 кратное нажатие - показ часов (если установлена соответствующая настройка, и при работе в режиме клиента). Повторное нажатие во время показа - переход в режим ON
** / 2 кратное нажатие - переход в режим LAMP
*** / 3 кратное нажатие - смена бэкграунда режима OFF
**** / 4 кратное нажатие - переход в режим DEMO
***** / 5 кратное нажатие - вывод интернет имени лампы и текущего IP (если поддерживается)
****** x2 / 6 кратное нажатие - прошивка по OTA (после 2-кратного входа в этот режим. Переключится на эффект Матрица) (если поддерживается)
******* / 7 кратное нажатие - смена режима ESP - точка доступа/клиент (если поддерживается)
******** / 8 кратное нажатие - сброс настроек эффектов
Из профиля ON:
* / 1 кратное нажатие - показ часов (при работе в режиме клиента). Повторное нажатие во время показа - переход в режим OFF
** / 2 кратное нажатие - смена эффекта вперед
*** / 3 кратное нажатие - смена эффекта назад
**** / 4 кратное нажатие - переход в режим PAINT >> ON >> PAINT... (если поддерживается)
***** / 5 кратное нажатие - вывод FPS - количества кадров в секунду (если поддерживается)
******** / 8 кратное нажатие - сброс настроек текущего эффекта
Из профиля LAMP:
* / 1 кратное нажатие - выключение лампы
** / 2 кратное нажатие - переход в режим ON
*** / 3 кратное нажатие - смена эффекта лампы
Из профиля DEMO:
* / 1 кратное нажатие - переход в режим OFF
** / 2 кратное нажатие - переход в режим ON
*** / 3 кратное нажатие - смена режима демо (Последовательное/Случайное/просмотр градиентов)
***** / 5 кратное нажатие - вывод текущего периода смены эффектов (в секундах)
*- / 1 + удержание - ... периода смены эффектов (10сек - 2 минуты)
Режим удержания работает по такому принципу:
Для регулировки соответствующего параметра нужно удерживать кнопку на определенное время, пока не отобразится соответствующий индикатор.
Когда регулируемое значение дойдет до своего минимального значения, то при дальнейшем удерживании кнопки через 1,5с оно будет изменяться в обратную сторону. Если при отпускании кнопки быстро нажать ее повторно, то произойдет вход в предыдущий режим установки.
Если в течении 0,75с произойдет повторное нажатие, то "разворота" приращения регулировки не произойдет, тем самым можно будет легко сделать точную подстройку регулируемого параметра.
Алгоритм управления кнопкой
Действие по умолчению (если не выполнено другое):
- / удержание - регулировка глобальной яркости
*- / 1 + удержание - ... скорости эффекта
**- / 2 + удержание - ... масштаба эффекта
***- / 3 + удержание - регулировка яркости эффекта (для проектов с моторчиком - скоростьего вращения)
Из профиля OFF/SLEEP:
* / 1 кратное нажатие - показ часов (если установлена соответствующая настройка, и при работе в режиме клиента). Повторное нажатие во время показа - переход в режим ON
** / 2 кратное нажатие - переход в режим LAMP
*** / 3 кратное нажатие - смена бэкграунда режима OFF
**** / 4 кратное нажатие - переход в режим DEMO
***** / 5 кратное нажатие - вывод интернет имени лампы и текущего IP (если поддерживается)
****** x2 / 6 кратное нажатие - прошивка по OTA (после 2-кратного входа в этот режим. Переключится на эффект Матрица) (если поддерживается)
******* / 7 кратное нажатие - смена режима ESP - точка доступа/клиент (если поддерживается)
******** / 8 кратное нажатие - сброс настроек эффектов
Из профиля ON:
* / 1 кратное нажатие - показ часов (при работе в режиме клиента). Повторное нажатие во время показа - переход в режим OFF
** / 2 кратное нажатие - смена эффекта вперед
*** / 3 кратное нажатие - смена эффекта назад
**** / 4 кратное нажатие - переход в режим PAINT >> ON >> PAINT... (если поддерживается)
***** / 5 кратное нажатие - вывод FPS - количества кадров в секунду (если поддерживается)
******** / 8 кратное нажатие - сброс настроек текущего эффекта
Из профиля LAMP:
* / 1 кратное нажатие - выключение лампы
** / 2 кратное нажатие - переход в режим ON
*** / 3 кратное нажатие - смена эффекта лампы
Из профиля DEMO:
* / 1 кратное нажатие - переход в режим OFF
** / 2 кратное нажатие - переход в режим ON
*** / 3 кратное нажатие - смена режима демо (Последовательное/Случайное/просмотр градиентов)
***** / 5 кратное нажатие - вывод текущего периода смены эффектов (в секундах)
*- / 1 + удержание - ... периода смены эффектов (10сек - 2 минуты)
Режим удержания работает по такому принципу:
Для регулировки соответствующего параметра нужно удерживать кнопку на определенное время, пока не отобразится соответствующий индикатор.
Когда регулируемое значение дойдет до своего минимального значения, то при дальнейшем удерживании кнопки через 1,5с оно будет изменяться в обратную сторону. Если при отпускании кнопки быстро нажать ее повторно, то произойдет вход в предыдущий режим установки.
Если в течении 0,75с произойдет повторное нажатие, то "разворота" приращения регулировки не произойдет, тем самым можно будет легко сделать точную подстройку регулируемого параметра.
Код проекта: (на данный момент доступен как готовое решение для платформы Wemos D1 mini)
LEDraw2.2.08b.rar
drive.google.com
= перелопачен принцип управления графикой. Введен новый модель graphix, который объединяет параметры вывода на ленту и быстрые функции прорисовки графики.
Теперь можно определить отдельные пространства на ленте, и с каждым независимо работать не прибегая к чрезмерному описанию параметров.
Доступны такие функции одномерной графики:
- inRange(*) - проверка адреса пикселя на нахождения в своих границах
- wrap(*) - функции "оборачивания" координаты относительно границ
- crop(*) - функции "обрезания" координаты относительно границ
- mirror(*) - функции "отражения" координаты относительно границ
- getPixelValue(*) - функция получения цвета пикселя по его номеру
- getPixelBright(*) - функция получения яркости пикселя по его номеру
- getColor(*) - получение цвета пикселя по его номеру
- blurAll(*) - размытие всего диапазона пикселей
- blend_fast(*) - получение промежуточного цвета относительно двух заданных
- drawPixel() / drawPixel_safe() - прорисовка пикселя (+безопасная)
- dimRange() / dimRange_safe() - затемнение отрезка (+безопасная)
- fillRange() / fillRange_safe() - прорисовка отрезка (+безопасная)
- fillSegment() / fillSegment_safe() - прорисовка отрезка простым градиентом
- noiseAll(*) - заполнение дискретным шумом всего диапазона
- fillAll(*) - заполнить цветом весь диапазон
- dimAll(*) - затемнить весь диапазон
- clearAll(*) - очистить всё
прорисовка графических примитивов (1d):
- drawSparkler(*) - прорисовка "бенгальского огня"
- drawComet(*) - прорисовка кометы
Теперь можно определить отдельные пространства на ленте, и с каждым независимо работать не прибегая к чрезмерному описанию параметров.
Доступны такие функции одномерной графики:
- inRange(*) - проверка адреса пикселя на нахождения в своих границах
- wrap(*) - функции "оборачивания" координаты относительно границ
- crop(*) - функции "обрезания" координаты относительно границ
- mirror(*) - функции "отражения" координаты относительно границ
- getPixelValue(*) - функция получения цвета пикселя по его номеру
- getPixelBright(*) - функция получения яркости пикселя по его номеру
- getColor(*) - получение цвета пикселя по его номеру
- blurAll(*) - размытие всего диапазона пикселей
- blend_fast(*) - получение промежуточного цвета относительно двух заданных
- drawPixel() / drawPixel_safe() - прорисовка пикселя (+безопасная)
- dimRange() / dimRange_safe() - затемнение отрезка (+безопасная)
- fillRange() / fillRange_safe() - прорисовка отрезка (+безопасная)
- fillSegment() / fillSegment_safe() - прорисовка отрезка простым градиентом
- noiseAll(*) - заполнение дискретным шумом всего диапазона
- fillAll(*) - заполнить цветом весь диапазон
- dimAll(*) - затемнить весь диапазон
- clearAll(*) - очистить всё
прорисовка графических примитивов (1d):
- drawSparkler(*) - прорисовка "бенгальского огня"
- drawComet(*) - прорисовка кометы
v2.2.15β (30.12.2022) Скачать/Download
Установка:
- PlatformIO, все как обычно - распаковываем архив в новую папку, открываем, компилируем...
- Arduino IDE: требуется перенести библиотеки из /lib в C:\Users\*******\Documents\Arduino\libraries. По крайней мере папочку /LEDraw если там уже есть последние GButton и FastLED. Для установки - кликаем файл src\src.ino и только на этой вкладке запускаем сборку.
Изменено: