Разработчики хотели! Мы ищем талантливых разработчиков React и C ++, чтобы помочь в этом проекте. Проверьте код, и если вам интересно, свяжитесь с [email protected].

Дэйвпл, 19.09.2021
NightDriverStrip - это пакет исходного кода для создания программы флэш -программы, которую вы загружаете в микроконтроллер ESP32. Он может поддерживать до 8 каналов светодиодов в стиле WS2812B, подключенных к штифтам чипсов, и отображать на них причудливые цвета, узоры и дизайны. В светодиодной полосе можно настроить многочисленные эффекты, которые можно настроить на светодиодную полосу, включая эффекты аудио/музыка/бит-реактивные эффекты для модулей, оснащенных микрофоном. Он также может при желании получать данные о цвете для светодиодов в простом формате LZ-сжатых (или не сжатых) над TCP/IP-сокетом, который открывается по умолчанию на порту 49152. ESP32 сохраняет свои часы в синхронизации с помощью NTP.
NightDriver может управлять как полосками стиля WS2812B, так и матрицы стиля Hub75.
Совсем недавно в проект был добавлен веб -установщик, с помощью которого на поддерживаемых устройствах можно вспыхнуть большинство проектов NightDriver, используя только веб -браузер. Пожалуйста, обратитесь к следующему разделу, если вы хотите начать.
Было предоставлено веб -приложение, которое можно использовать для установки большинства проектов NightDriver на поддерживаемых устройствах. Это позволит вам быстро прошить проект на вашем устройстве ESP32, подключиться к Wi -Fi и начать его без необходимости работать с исходным кодом.
Обратите внимание, что установщику требуется браузер, который поддерживает веб -сериал. На момент письма браузеры, которые включают такую поддержку, являются недавними версиями Chrome, Edge и Opera.
Пожалуйста, следуйте этим шагам, чтобы вспыхивать и, если он поддерживается, настройте Wi -Fi на вашем устройстве:
Подключите устройство к компьютеру с помощью USB -кабеля.
Перейдите к следующему URL в вашем браузере: https://plummerssoftwarellc.github.io/nightdriversripp. Затем он должен показать экран, который выглядит так: 
Выберите свое устройство (например, «M5Stickc Plus») из раскрывающегося списка. Затем появится второе раскрытие с поддерживаемыми проектами на этом устройстве.
Выберите проект, который вы хотите мигать во втором раскрытии. Когда вы это сделаете, под ней появится кнопка подключения. Обратите внимание, что этикетка каждого проекта включает в себя указание ключевых функций, включенных в рассматриваемой сборке. Легенда для каждой из функциональных букв показана ниже раскрывающегося проекта.
Нажмите кнопку подключения. Диалог будет просить вас выбрать последовательный порт. В зависимости от вашей системы, она может показать только один или список из них. В случае, если показано несколько, это обычно будет просто называется «USB -серийный порт (COMN)». Выберите правильный порт и нажмите Connect.
Новый диалог покажет. Один из вариантов, которые он предлагает, - «Установить <Project> для <dinform>». Нажмите на эту опцию.
Диалог покажет, спрашивая вас, хотите ли вы стереть устройство. Установите флажок, если это первый раз, когда вы перемещаете Nightdriversip на своем устройстве, или вы хотите пропустить чистую установку. Это сбросит все настройки к их значениям по умолчанию. Обратите внимание, что конфигурация Wi -Fi будет очищена, независимо от того, выбираете ли вы стереть или нет. Нажмите Далее.
Теперь вас попросят подтвердить, что вы хотите прошить устройство. Нажмите «Установить».
Появится диалог, показывающий вам прогресс установки. Обычно это займет около 2 минут. После завершения мигания нажмите Далее.
На данный момент может произойти четыре вещи:
Если ваше устройство не поддерживает Wi -Fi, вы можете пропустить в пункт 12.
В диалоговом окне «Информация об подключении Wi -Fi» выберите или введите свой SSID и пароль. Нажмите Connect. В некоторых случаях диалоговое окно подключения Wi -Fi появляется снова после того, как на самом деле было сделано успешное соединение. В этом случае нажмите Skip. Также возможно, что время-аут сообщается, в то время как Wi-Fi действительно успешно связан. В этом случае нажмите назад.
Теперь появится диалог, который покажет детали проекта, который вы мелькнули. Он также предоставит параметры для снова вспыхивать и покажет журналы и консоли устройства. Кроме того, если ваше устройство поддерживает Wi-Fi, то параметры будут доступны для посещения веб-приложения устройства (при условии также включено веб-сервер On-Device) или изменить настройки WiFi. Обратите внимание, что если вы прошивали изображение устройства, которое включает в себя веб -сервер/веб -приложение, может потребоваться около минуты или около того, чтобы появиться после того, как подключение к сети Wi -Fi.
Если вы хотите изменить конфигурацию WiFi на уже прошившем устройстве, используйте следующие шаги:
Подключите устройство к компьютеру с помощью USB -кабеля.
Перейдите к следующему URL в вашем браузере: https://plummerssoftwarellc.github.io/nightdriversripp.
Выберите свое устройство (например, «M5Stickc Plus») из раскрывающегося списка. Затем появится второе раскрытие с поддерживаемыми проектами на этом устройстве.
Выберите проект, который вы вспыхнули ранее, во втором раскрытии. Когда вы это сделаете, под ней появится кнопка подключения.
Нажмите кнопку подключения. Диалог будет просить вас выбрать последовательный порт. В зависимости от вашей системы, она может показать только один или список из них. В случае, если показано несколько, это обычно будет просто называется «USB -серийный порт (COMN)». Выберите правильный порт и нажмите Connect.
Новый диалог покажет. Если он еще не показывает параметры «Подключиться к Wi-Fi» или «изменить Wi-Fi», откройте окно «Журналы и консоль» и подождите, пока не появятся строки журналов. Затем закройте окно, нажав назад. Когда отображается опция «Подключиться к Wi-Fi» или «Изменить Wi-Fi», нажмите.
В диалоговом окне «Информация об подключении Wi -Fi» выберите или введите свой SSID и пароль. Нажмите Connect. В некоторых случаях диалоговое окно подключения Wi -Fi появляется снова после того, как на самом деле было сделано успешное соединение. В этом случае нажмите Skip. Также возможно, что время-аут сообщается, в то время как Wi-Fi действительно успешно связан. В этом случае нажмите назад.
Изображения, включенные в установщик, создаются с использованием текущего состояния исходного кода в этом репозитории. Если есть что -то, что вы хотели бы изменить (конфигурацию) проекта, который вы хотите использовать, то пришло время перейти на следующий этап.
Поскольку следующий этап довольно быстро потребует некоторых знаний о структуре приложения, которое является ночной стороны, это может быть хорошим временем для прочтения введения в кодовую базу NightDriversprip.
На устройствах с Wi -Fi Nightdriversipp может запустить веб -сервер, который размещает веб -пользовательский интерфейс, который является частью проекта. Его можно использовать для просмотра и изменения того, какой эффект работает, и получить статистику производительности в реальном времени.
Когда устройство запускается с включенного WebServer, доступ к веб -интерфейсу можно получить, открыв веб -браузер и набрав IP -адрес вашего устройства в адресной строке. После загрузки значки слева от экрана могут использоваться для включения и выключения видов в пользовательском интерфейсе.
Более подробную информацию о веб -интерфейсе можно найти в собственном readme.md.
Помимо веб-интерфейса, веб-сервер также публикует API, похожий на REST. Среди других, диапазон настроек конфигурации может быть прочитана и изменена с помощью ее. Более подробная информация об API доступна в REST_API.MD.
Я рекомендую вам сделать следующее:
DEMO конфигурацию. Некоторые указатели на то, что нужно для этого, можно найти ниже.globals.h или Platformio.ini, например Wi -Fi и Webserver. См. Функция Определяет ниже. Убедитесь, что ваш Wi -Fi SSID и пароль включены включены/secrets.h, которые могут быть созданы, создав копию include/secrets.example.h.
Пожалуйста, убедитесь, что вы установите их include/secrets.h, не в том числе/secrets.example.h!
Включите Wi -Fi, установив определение enable_wifi на 1 в глобальных веществах.
# define ENABLE_WIFI 1Это также можно настроить в файле Platformio.ini, как описано в разделе «Определяет».
Они определяют, что обеспечивает основные особенности ночных призраков. Определите их в платформе. Примечание. Некоторые определяют, специфичные для платы, это отмечено ниже.
| Функция определяет | Описание |
|---|---|
| Enable_wifi | Подключиться к Wi -Fi |
| Outment_wifi_enabled | Принятие входящих цветовых данных и команд |
| Enable_webserver | Включите внутренний веб -сервер |
| Time_before_local | Сколько секунд до начала лампы и показывает локальный контент |
| Enable_ntp | Установите часы из Интернета |
| Enable_ota | Принять обновления Air Flash |
| Аппаратное специфичное | Описание | Поддерживаемые доски |
|---|---|---|
| Use_m5display | Включить статистическую дисплей на встроенном ЖК -дисплее | M5stick-C и M5stick-C Plus |
| Use_oled | Включить статистику отображения на встроенном OLED | Heltec Wi -Fi Kit 32 |
| Use_lcd | Включить статистику отображения на внешнем ILI9341 LCD | Wrover32 |
| Use_tftspi | Включить статистику отображения на внешнем ЖК -дисплеев TTGO | ESP32Dev |
| ENABLE_AUDIO | Слушайте звук из микрофона и обработайте его | M5stick-C и M5stick-C Plus |
| Enable_Remote | ИК -пульт дистанционного управления | Требуется ИК -оборудование |
Пример в Platerio.ini (префикс флага с -D , например, ENABLE_WIFI=1 становится -DENABLE_WIFI=1 )
build_flags = - DENABLE_WIFI =1Пример в Globals.h:
# define ENABLE_WIFI 1 Чтобы добавить новые эффекты, вы:
LEDStripEffect (или существующего класса эффекта), и хороший материал происходит в единственной важной функции, Draw() . Посмотрите, что делают встроенные эффекты, но вкратце вы в основном превращаете в массив объектов CRGB, каждый из которых представляет 24-разрядную цветную триплет. Как только вы закончите, массив CRGB отправляется в светодиоды, и вас сразу просят следующий кадр. Ваш метод рисования должен занять где -то около 30 мс, в идеале, и должен delay() , чтобы заснуть для баланса, если он будет быстрее. Вы можете неоднократно рисовать в основном в оживленном цикле, но это не нужно.#define для вашего класса effects.h . Каждый класс эффектов нуждается только в одном номере эффекта, и, пожалуйста, убедитесь, что выбранный вами номер еще не используется другим классом эффекта! Более подробную информацию о связи между классом эффекта и связанным с ним номером эффекта можно найти в effects.h .LoadEffectFactories() DEMO effects.cpp . Макро ADD_EFFECT() ожидает, что номер эффекта и название типа вашего нового эффекта в качестве параметров. Любые дополнительные параметры передаются в конструктор эффекта при его создании. Существует глобальный экземпляр EffectManager , который сначала создает таблицу эффектов из файла JSON на Spiffs, если присутствует. Затем он добавляет любые другие эффекты, которые зарегистрированы в LoadEffectFactories() , но не включены в файл JSON. Затем он вращается между этими эффектами со скоростью, управляемой по DEFAULT_EFFECT_INTERVAL . Эффекты не уведомляются, когда они становятся активными или нет, их просто просят рисовать, когда это необходимо.
Каждый канал светодиодов имеет связанный с ним экземпляр LEDStripGfx . _GFX[0] является LEDStripGfx связанным с LED_PIN0 , и так далее. Вы можете получить светодиодный буфер pin0, вызывая _GFX[0]->leds() , и он будет содержать _GFX[0]->GetLEDCount . Вы можете привлечь в буфер, не касаясь сырых байтов, вызывая fill_solid , fill_rainbow , setPixel и другие функции чертежа.
Самая простая конфигурация, DEMO , предполагает, что у вас есть одна метра из 144 светодиодов и источник питания, подключенный к вашему ESP32. Он загружается, находит один RainbowFillEffect в функции LoadEffectFactories() и неоднократно вызывает свой метод Draw() для обновления массива CRGB перед отправкой его в светодиоды. Если работать правильно, она должна нарисовать прокручивающую радужную палитру на вашей светодиодной полосе.
Эта самая простая конфигурация, называемая здесь просто «демонстрация», предоставляется в среде специальной сборки. Список таких среда можно увидеть путем запуска «Python3 Tools/show_envs.py», который сообщит читателю, что на момент написания этой статьи варианты «Демо -демонстрация» включают в себя: включают в себя:
Эти типы сборки могут быть выбраны аргументом «-e» в PIO или в опции меню внутри кода Platformio IDE/VS.
Таблица эффектов сохраняется в файле JSON на Speffs через регулярные промежутки времени, чтобы сохранить состояние эффектов (и на самом деле весь список эффектов) через перезагрузки. Это в значительной степени подготовка к будущим обновлениям NightDriversip, где состав конфигурации списка эффектов может быть изменена с использованием веб -приложения устройства. Конечные точки API для облегчения этого уже доступны и готовы к использованию (см. Device Web UI и API ниже.)
Это позволяет переопределить SerializeToJSON() и соответствующий десериализующий конструктор должен быть предусмотрен для эффектов, которые необходимо (или хотят) сохранять больше, чем свойства, которые (de) сериализируются из/до JSON по LEDStripEffect по умолчанию.
На протяжении всего проекта библиотека, используемая для обработки JSON, и (DE) сериализации - Arduinojson. Среди прочего, это означает, что:
В соответствии с соглашением в Arduinojson функции SerializeToJSON() должны возвращать true за исключением случаев, когда функция Arduinojson (например JsonObject::set() ) возвращает false чтобы указать, что у нее заканчивается буферная память. Любая функция SerializeToJSON() возвращающая false , вызовет увеличение общего буфера сериализации и перезапуск процесса сериализации.
Память, необходимая для операции сериализации отдельного экземпляра (DE), должна быть зарезервирована заранее , создав любое:
StaticJsonDocument< размер буфера >() , который оставляет память в стеке. Это можно использовать только для небольших размеров буфера (меньше 1024 байтов).AllocatedJsonDocument( размер буфера ) , который оставляет память на куче.Сколько памяти на самом деле требуется, зависит от числа, типа и содержимого (DE) сериализованных свойств, и это фактически небольшая игра по догадке, что означает, что значения, которые вы увидите на протяжении всей кодовой базы, также являются образованными предположениями. Когда свойства, которые сериализованы в последний раз, не появляются в сгенерированном JSON, разумно предположить, что процесс сериализации исчерпана из буферной памяти, и что буферная память, таким образом, необходимо увеличить.
Чтобы лучше понять специфику, связанную с сериализацией JSON (DE), вы можете рассмотреть вопрос о том, чтобы взглянуть на соответствующие учебные пособия в разделе «Первый контакт» документации Arduinojson.
Например, во время разработки (JSON-Persisted) список эффектов на вашей доске может выйти из синхронизации с эффектами LoadEffectFactories() которые вы добавляете в эффектах. Если это произойдет, вы можете сбросить список эффектов на плате до дефолта через сеть. Чтобы это работало, доска должна быть подключена к Wi -Fi, и WebServer должен работать.
Сброс может быть выполнен, выполнив форму http -формы по адресу http: // <dinfore_ip>/сброс со следующими наборами полей: EffectConfig = 1 и плата = 1. В системах с «обычным» скручиванием, следующая команда должна сделать трюк:
curl -d " effectsConfig=1&board=1 " -X POST http:// < device_IP > /resetВозможно, что возможность выполнить этот сброс добавляется в будущем обновлении в веб -интерфейс.
Кроме того, также возможно «игнорировать» список постоянных эффектов и всегда загружать стандартный список эффектов при запуске. Документация о том, как это сделать, доступна на вершине вышеупомянутой функции LoadEffectFactories() .
Если вы разрабатываете эффект, который требует получения данных из Интернета, вы можете зарегистрировать функцию считывателя Network с помощью класса NetworkReader , который доступен через глобальную ссылку g_ptrSystem->NetworkReader() . Вы можете использовать эффекты PatternSubscribers или PatternWeather в качестве источников вдохновения. Patternstocks тянет вживую (15-минутную задержку) котировки с частным сервером.
Проект может быть построен с помощью Platformio. Существует доступная платформа, которая построена на вершине кода Visual Studio. В него включены основные инструменты командной строки. Они также могут быть установлены самостоятельно, если вы предпочитаете не использовать IDE.
Для составления фронтального приложения (которое является частью каждой сборки платформы), требуется недавняя версия Nodejs с NPM. Их можно скачать с сайта Nodejs. Инструкции для поддерживаемых способов установки Nodejs также доступны. Пожалуйста, прочитайте и следуйте за ними.
Обратите внимание , что установка Nodejs с использованием менеджера пакетов пакетов вашей операционной системы/дистрибуции, вероятно, оставит вам гораздо более старую версию Nodejs, чем вам нужно.
Приложение было протестировано на версии Node 16.15.1 и 18.17.1 с NPM -версией 8.13.2; Новые версии также должны работать в принципе.
Для получения подробной информации о работе с приложением Frontend см. Site/readme.md.
Когда установлен IDE или Core, NightDriverStrip может быть построена из командной оболочки, введя в каталог проекта/репозитория и выпустив следующую команду:
pio run -e demo
Это создаст demo конфигурацию.
Если вы получите ошибку, что
pioне найден, вам может потребоваться добавить ее на свой путь.
Чтобы создать все доступные конфигурации, используйте следующую команду (это может занять некоторое время):
pio run
Чтобы создать и загрузить файловую систему, которая может использоваться эффектами (хотя в настоящее время нет), вам нужно будет создать и загрузить изображение Spiffs на вспышку вашей платы с помощью Platformio. Вы можете сделать это с помощью пользовательского интерфейса Platformio или с помощью инструмента командной строки pio :
pio run --target buildfs --environment <project name>
pio run --target uploadfs --environment <project name>
Этот репозиторий включает в себя ряд подписчиков для выполнения различных задач во время или после строительных проектов. Они включены в каталог tools . Обратите внимание, что сценарии ожидают, что будут начаты из основного каталога проекта. Итак, используя:
tools/buddybuild.shВместо:
cd tools
./buddybuild.shНапишите что -нибудь простое, чтобы отправить цветные данные в розетку. Формат очень простой: какой канал, сколько светодиодов вы рисуете, когда нарисовать его, и сами данные цвета. Вы можете отправлять несжатые данные с нулевой временной меткой, если вы отправляете правильный заголовок перед вашими данными, что очень просто. Данные с нулевой временной меткой будут просто нарисованы без буферизации.
| Байты | Функция | |
|---|---|---|
| 0, 1 | Командование | (Установите его на 3, который является WIFI_COMMAND_PIXELDATA64 ) |
| 2, 3 | Канал | (Установите его на 1 для одного канала, хотя 0 работает тоже по историческим причинам) |
| 4 - 7 | Длина | (Количество установленных 24-битных PIXELS ) |
| 8 - 15 | Секунды | (Установите на 0) |
| 16 - 24 | Микрос | (Установите на 0) |
| 25+ | RGB | (24-битные данные о цвете RGB, по одному на PIXEL указанный по длине выше) |
Если построить с помощью ENABLE_WIFI и INCOMING_WIFI_ENABLED , если чип способен получить соединение WiFi и адрес DHCP, он откроет разъем на порту 49152 и ждал пакетов, образованных, как описано выше.
Создайте серию из 24 кадров в секунду (или 30, если до 500 светодиодов) и установите TimeStamp на «Теперь» плюс 1/2 в секунду. Отправьте их в чип через Wi -Fi, и они будут нарисованы через 1/2 секунды в устойчивом потоке, поскольку временные метки, которые вы давали каждому пакету.
Полное раскрытие: как партнер Amazon, Plummerssoftwarellc получает комиссию от квалификационных покупок. Это не добавляется к цене покупки и вообще не увеличивает вашу стоимость. Кроме того, вся прибыль 2021 года от гаражного канала Дейва, который включает в себя эти продажи, пойдут в центр аутизма UW.
Вместо того, чтобы создавать сложный набор руководящих принципов, вот что я надеюсь, что сотрудничество с открытым исходным кодом приведет к проекту: что люди добавят важные функции и исправления дефектов и недостатков в коде. Когда они добавляют функции, они будут делать это в соответствии с тем, как все делается в существующем коде. Они сопротивляются стремлению Raightectite и переписывают все на своем собственном изображении и вместо этого ставят свои усилия по максимизации функционального улучшения при одновременном сокращении исходного кода и изменения.
Давайте рассмотрим непоследовательное именование, которое должно быть исправлено. Некоторые из них являются Camelcase, некоторые - Pszhungarian, и так далее, в зависимости от источника. Я бы предпочел, чтобы все были обновлены до одного стандартного TBD. Пока TBD не будет определен, я склоняюсь к стандарту Win32.
При работе в функции работайте в стиле функции. Работая над классом, работайте в стиле класса. Работая над файлом, работайте в стиле файла. Если они противоречивы, делайте все, что минимизирует изменения. Стилистические изменения должны быть введены только после обсуждения в группе, и, как правило, должны удивиться владения этим стилем изменений по всему проекту.
Далее давайте рассмотрим #define S для управления сборкой. Там могут быть лучшие и более элегантные способы ведения дел. Там могут быть целые платформы конфигурации. Но я бы предпочел, чтобы это было просто. И я определяю простейшим, чтобы быть «наименьшим, что опытный программист C ++ должен учиться, прежде чем быть конструктивным с рассматриваемым кодом». Я не хочу изучать новую библиотеку классов, если я могу ее избежать!
Время жизни кодирования научило меня ошибаться на стороне простоты, поэтому, пожалуйста, не вводите варидные шаблонные конструкции, если они явно не сокращают исходный код. Все, что увеличивает сложность и длину кода, должно быть подозрительным.
Добавьте все, что хотите, и/или вам нужно воплотить в жизнь ваши светодиодные мечты. Исправьте мои ошибки. Заполните очевидные пробелы в моих знаниях. Все, что больше всего имеет мигание за наименьшее количество битов, получает мой голос. Вы получаете только столько дополнительного прохладного мигания для каждого байта кода и программы. Эта доходность измеряется в Blinkenperbit, количество мигающей удивительности, которое добавляет код, разделенный на воздействие на источник (и бинарный).
Чтобы повторить, создайте проект Mesmerizer. Затем удалите pio/build_cache и постройте снова, потратив время на вторую сборку.
ASUS 7995WX [96-Core, 192-thread]-> [Davepl, 02/11/2024] 20,73 секунды
HP Z6 G5A, 7995WX, 128GB [96-Core, 192-thread]-> [Davepl 29.11.2023] 25,270 секунды
3970x, 128GB [32-ядер, 64-поточная] Windows11+WSL2/Ubuntu02.04lts-> [Davepl 29.11.2023] 34,292 секунды
Mac M1 Ultra Studio [10-ядерный, 20-х
Время для создания конфигурации спектра ( pio run -e spectrum ). Предполагает чистую сборку после того, как все было установлено и загружено.
AMD 3970 32 -ядер, 128 ГБ, RAID SSD -> [Davepl 19.09.2021] 12,93 секунды (работая под WSL)
AMD 5950x 16 -ядер, 64 ГБ, SSD -> [Davepl 19.09.2021] 16,90 секунд
Apple MacBook Pro M1 Max, 8+2 ядра, 64 ГБ, 4 ТБ SSD -> [Davepl 15.12.2021] 20,90 секунд
Apple MacBook Air M2, 16 ГБ, 256 ГБ SSD -> [Vaaski 28/28/2023] 56.17 секунд
MacBook Pro 2020, 8 ядер 2,4 ГГц I9, 64 ГБ, 4 ТБ SSD -> [Davepl 19.09.2021] 34,09 секунды
Mac Mini, 4 Perf -ядер, 16 ГБ -> [Davepl 19.09.2021] 39,06 секунд
Mac Pro, 6 ядер, 3,5 ГГц, 64 ГБ, 1 ТБ SSD -> [Davepl 19.09.2021] 48,42 секунды
Xeon Silver, 20 ядер, 2,1 ГГц, 16 ГБ VM -> [Davepl 10/10/2022] 53,11 секунд
Raspberry Pi 4, 64 -битный Ubuntu LTS, 4 ядра, 4 ГБ -> [Davepl 23.09.2021] 6 мин 25 секунд
Jetson Nano 2G, 4 Core Arm A57 -> [Davepl 10/04/2021] 2 мин 56 секунд