开发人员想要!我们正在寻找有才华的React和C ++开发人员,以帮助该项目。查看代码,如果您有兴趣,请联系[email protected]。

Davepl,9/19/2021
NightDriverStrip是用于构建Flash程序的源代码包,您可以上传到ESP32微控制器。它最多可以驱动8个通道的WS2812B样式LED,并连接到芯片引脚,并在其上显示精美的颜色,图案和设计。内置有许多效果,可以配置为在LED带上显示,包括配备麦克风的模块的音频/音乐/节拍反应效果。它还可以选择以简单的LZ压缩(或非压缩)格式接收LED的颜色数据,该格式默认在端口49152上打开的TCP/IP插座。ESP32使用NTP将其时钟保持在同步。
夜总会可以驱动WS2812B样式条和HUB75样式矩阵。
最近,已将Web安装程序添加到该项目中,大多数夜班项目都可以在受支持的设备上闪烁,只使用Web浏览器。如果您想开始的话,请参考下一节。
已经提供了Web应用程序,可用于在受支持的设备上安装大多数夜总会项目。这将使您能够快速在ESP32设备上刷新一个项目,将其连接到WiFi并开始使用它,而无需立即使用源代码。
请注意,安装程序需要一个支持Web串行的浏览器。在写作时,包括此类支持的浏览器是Chrome,Edge和Opera的最新版本。
请按照以下步骤进行闪存,如果得到支持,请在您的设备上设置WiFi:
使用USB电缆将设备连接到计算机。
导航到您的浏览器中的以下URL:https://plummerssoftwarellc.github.io/night driversstrip。然后,它应该显示一个看起来像这样的屏幕: 
从下拉列表中选择您的设备(例如“ M5Stickc Plus”)。然后将出现第二个带有支持项目的下拉菜单。
选择要在第二个下拉列表中闪烁的项目。当您这样做时,连接按钮将出现在其下方。请注意,每个项目的标签都包含有关构建中启用的密钥功能的指示。每个功能信件的传说都显示在项目下拉下。
单击“连接”按钮。对话框将要求您选择一个串行端口。根据您的系统,它可能仅显示其中一个或一个列表。如果显示多个,通常将其称为“ USB串行端口(COMN)”。选择正确的端口,然后单击“连接”。
将显示一个新的对话框。它提供的选项之一是“安装<project> for <device>”。单击该选项。
对话框将显示您是否要删除设备。检查框,如果这是您第一次将Nightriversstrip刷到设备上,或者您想刷新安装。这将把所有设置重置为默认设置。请注意,无论您是否选择擦除,将清除WiFi配置。单击下一步。
现在,您将被要求确认要刷新设备。单击安装。
将显示一个对话框,显示安装的进度。通常,这大约需要2分钟。闪烁完成后,单击下一步。
在这一点上,可能会发生四件事:
如果您的设备不支持WiFi,则可以跳过点12点。
在WiFi连接信息对话框中,选择或输入您的SSID和密码。单击连接。在某些情况下,实际建立了连接后,WiFi连接对话框再次出现。在这种情况下,单击跳过。在WiFi实际上已经成功连接时,也可能会报告超时。在这种情况下,单击返回。
现在,将出现一个对话框,以显示您闪烁的项目的详细信息。它还将提供再次闪烁并显示设备的日志和控制台的选项。此外,如果您的设备支持WiFi,则可以使用选项访问设备的Web应用程序(前提是还启用了设备的Web服务器)或更改WiFi设置。请注意,如果您刷新了包括Web服务器/Web应用程序的设备映像,则可能需要一分钟左右的时间才能在与WiFi网络的连接之后出现。
如果要更改已经闪烁的设备上的WiFi配置,请使用以下步骤:
使用USB电缆将设备连接到计算机。
导航到您的浏览器中的以下URL:https://plummerssoftwarellc.github.io/night driversstrip。
从下拉列表中选择您的设备(例如“ M5Stickc Plus”)。然后将出现第二个带有支持项目的下拉菜单。
在第二个下拉下方选择您之前闪烁的项目。当您这样做时,连接按钮将出现在其下方。
单击“连接”按钮。对话框将要求您选择一个串行端口。根据您的系统,它可能仅显示其中一个或一个列表。如果显示多个,通常将其称为“ USB串行端口(COMN)”。选择正确的端口,然后单击“连接”。
将显示一个新的对话框。如果尚未显示“连接到Wi-Fi”或“ Change Wi-Fi”选项,请打开“ Logs&Console”窗口,然后等到日志线出现。然后单击回去关闭窗口。显示“连接到Wi-Fi”或“更改Wi-Fi”选项时,请单击它。
在WiFi连接信息对话框中,选择或输入您的SSID和密码。单击连接。在某些情况下,实际建立了连接后,WiFi连接对话框再次出现。在这种情况下,单击跳过。在WiFi实际上已经成功连接时,也可能会报告超时。在这种情况下,单击返回。
安装程序中包含的图像是使用此存储库中源代码的当前状态构建的。如果您想更改(配置)您要使用的项目的任何内容,那么是时候搬到下一阶段了。
由于下一个阶段将很快需要一些有关夜驱动程序的应用程序结构的了解,因此这可能是阅读《夜间驱动器》代码库的介绍的好时机。
在带有WiFi的设备上,NightDriverStrip可以启动一个网络服务器,该网络服务器托管项目的一部分。它可用于查看和更改正在运行的效果,并获取设备的实时性能统计信息。
启用Web服务器的设备启动后,可以通过打开Web浏览器并在地址栏中键入设备的IP地址来访问Web UI。加载后,屏幕左侧的图标可用于在UI中切换视图。
有关Web UI的更多信息可以在其自己的readme.md中找到。
除Web UI外,Web服务器还发布了类似REST的API。除其他外,还可以使用它读取和更改一系列配置设置。有关API的更多信息可在REST_API.MD中获得。
我建议您执行以下操作:
DEMO配置。可以在下面找到一些关于要做的事情的指示。globals.h或platform.ini文件中启用功能,例如wifi和web服务器。请参阅以下功能定义。确保将您的wifi ssid和密码设置在include/secrets.h中,可以通过include/secrets.example.h的副本创建。
请确保您将它们设置在incluce/secrets.h中,而不是include/secrets.example.h!
通过将enable_wifi定义为Globals.h启用WiFi。
# define ENABLE_WIFI 1这也可以在Platform.Ini文件中配置,如以下功能定义部分所述。
这些定义了启用Nightriversstrip的主要功能。在Platform.ini的build_flags或Globals.h中定义它们。注意:有些定义是特定于董事会的,这在下面指出。
| 功能定义 | 描述 |
|---|---|
| enable_wifi | 连接到WiFi |
| incoming_wifi_enabled | 接受传入的颜色数据和命令 |
| enable_weberver | 打开内部网络服务器 |
| time_before_local | 灯段之前有多少秒钟,并显示本地内容 |
| enable_ntp | 从网络设置时钟 |
| enable_ota | 接受空气闪光灯更新 |
| 特定于硬件 | 描述 | 支持的董事会 |
|---|---|---|
| USE_M5DISPLAY | 在内置的LCD上启用统计显示 | M5Stick-C和M5Stick-C Plus |
| use_oled | 启用内置OLED显示的统计信息显示 | Heltec WiFi套件32 |
| use_lcd | 在外部ILI9341 LCD上显示启用统计信息 | Wrover32 |
| USE_TFTSPI | 在外部TTGO LCD上启用统计信息显示 | ESP32DEV |
| enable_audio | 聆听麦克风的音频并进行处理 | M5Stick-C和M5Stick-C Plus |
| enable_remote | 红外遥控器 | 需要红外硬件 |
platform.ini中的示例(前缀为-D ,例如ENABLE_WIFI=1升入-DENABLE_WIFI=1 )
build_flags = - DENABLE_WIFI =1globals.h:
# define ENABLE_WIFI 1 要添加新的效果,您:
LEDStripEffect (或现有效应类),而好东西发生在唯一重要的功能Draw()中。查看内置效果的作用,但简而言之,您基本上是在一个CRGB对象中,每个CRGB对象代表一个24位色三重态。完成后,将CRGB数组发送到LED,并立即要求您进行下一个帧。理想情况下,您的抽奖方法应以30ms的范围约为30ms,并且应delay()以保持平衡,如果更快。您可以在繁忙的循环中反复绘制,但不需要。#define effects.h 。每个效果类仅需要一个效果号,请确保您选择的数字尚未由其他效果类使用!有关效应类及其相关效应数量之间链接的更多信息,请参见effects.h 。DEMO LoadEffectFactories() effects.cpp中创建的效果列表中的效果列表。 ADD_EFFECT()宏预计您的新效果的效果编号和类型名称作为参数。创建效果的构造函数时,任何其他参数都将传递给效果的构造函数。有一个全局EffectManager实例,该实例首先从json文件上创建效果表(如果存在)。然后,它添加了在LoadEffectFactories()中注册的其他效果(),但未包含在JSON文件中。然后,它以DEFAULT_EFFECT_INTERVAL控制的速率在这些效果之间旋转。效果在活动中或不活动时不会通知效果,他们只是在需要时被要求绘制。
LED的每个通道都有一个与之关联的LEDStripGfx实例。 _GFX[0]是与LED_PIN0相关的LEDStripGfx ,依此类推。您可以通过调用_GFX[0]->leds()来获得PIN0的LED缓冲区,并且它将包含_GFX[0]->GetLEDCount像素。您可以通过调用fill_solid , fill_rainbow , setPixel和其他绘图功能来绘制缓冲区,而无需触摸原始字节。
最简单的配置DEMO假设您有一个144个LED的单仪条和连接到ESP32的电源。它启动,在LoadEffectFactories()函数中找到一个RainbowFillEffect ,并反复调用其Draw()方法以更新CRGB阵列,然后再将其发送给LED。如果正常工作,则应在LED带上绘制滚动彩虹调色板。
最简单的配置在此称为“演示”,由板特定的构建环境提供。可以通过运行“ Python3 Tools/show_envs.py”来看到此类环境的列表,这将告诉读者,在撰写本文时,“演示”的硬件特定变化包括:
这些构建类型可以由“ -e”参数转换为PIO或在Platformio IDE/VS代码中的菜单选项中选择。
效果表持续到定期在Spifts上的JSON文件中,以保留重新启动的效果状态(实际上是整个效果列表)。这在很大程度上是为了准备将来更新到Nightriversstrip,其中效果列表的组成可以使用设备Web应用程序更改单个效果的配置。可用的API端点已经可以使用并可以使用(请参阅下面的设备Web UI和API。)
这使得必须为需要(或想要)持久的效果提供SerializeToJSON()和相应的供应构造函数的覆盖,而不是(de) LEDStripEffect情况下从/到JSON的属性。
在整个项目中,用于JSON处理和(DE)序列化的库是Arduinojson。除其他外,这意味着:
与Arduinojson中的约定相一致, SerializeToJSON()函数必须返回true ,除非Arduinojson函数(例如JsonObject::set() )返回false以表明其耗尽了缓冲器内存。返回false任何SerializeToJSON()函数都会触发整体序列化缓冲区的增加和序列化过程的重新启动。
单个类实例(DE)序列化操作所需的内存需要事先保留,以创建两者:
StaticJsonDocument< buffer size >() ,可保留堆栈上的内存。这只能用于小型缓冲尺寸(小于1024个字节)。AllocatedJsonDocument(缓冲区大小) ,可保留内存在堆上。实际需要多少内存取决于(de)序列化属性的数量,类型和内容,并且实际上是一个猜测游戏 - 这意味着您在整个代码库中都会看到的值也受过教育。当序列化的最后一个属性未能显示在生成的JSON中时,可以合理地假设序列化过程无需缓冲存储器,因此需要增加缓冲区的存储器。
为了更好地了解与JSON(DE)序列化有关的细节,您可以考虑查看Arduinojson文档的“第一个联系”部分中的各个教程。
例如,在开发过程LoadEffectFactories() ,板上的(JSON掌握的)效果列表可能会与您添加的效果相关。如果发生这种情况,您可以通过网络将板上的效果列表重置为默认值。为此,董事会必须连接到WiFi,并且网络服务器必须运行。
可以通过执行http表单帖子到http:// <device_ip>/重置以下字段设置:feffectsconfig = 1 and board = 1来完成重置。在可用“常规”卷发的系统上,以下命令应解决一个问题:
curl -d " effectsConfig=1&board=1 " -X POST http:// < device_IP > /reset在Web UI的将来更新中,可以添加执行此重置的能力。
此外,还可以完全“忽略”持久效应列表,并始终在启动时加载标准效应列表。有关如何执行此操作的文档可用于上述LoadEffectFactories()函数的顶部。
如果您开发了需要从Internet中获取数据的效果,则可以通过g_ptrSystem->NetworkReader() Global Reference注册网络读取NetworkReader函数。您可以将PatternSubscribers或PatternWeather效应作为灵感来源。 PatternStocks从专用服务器中提取Live(15分钟延迟)股票报价。
该项目可以使用Platformio构建。有一个Platformio IDE可用,该平台位于Visual Studio代码之上。其中包括命令行平台核心工具。如果您不想使用IDE,也可以自己安装它们。
要编译前端应用程序(这是每个Platformio构建的一部分),需要使用NPM的NODEJS的最新版本。它们可以从Nodejs网站下载。支持安装nodejs的支持方法的说明也可以在其中提供。请阅读并关注他们。
请注意,使用操作系统/Distribut的默认软件包管理器安装nodejs可能会使您拥有的nodejs版本要比所需的较大。
该应用程序已在节点版本16.15.1和18.17.1上进行了测试,并使用NPM版本8.13.2进行了测试。较新的版本也应原则上起作用。
有关使用前端应用程序工作的详细信息,请参见站点/readme.md。
当安装IDE或CORE时,可以通过输入项目/存储库目录并发出以下命令来从命令外壳构建Nightriversstrip:
pio run -e demo
这将构建demo配置。
如果您发现找不到
pio的错误,则可能需要将其添加到您的路径中。
要构建所有可用的配置,请使用以下命令(这可能需要一段时间):
pio run
为了构建和上传效果可以使用的文件系统(尽管目前没有),您将需要使用Platformio构建和上传Spiffs Image到板的闪光灯。您可以使用Platformio用户界面或使用pio命令行工具来执行此操作:
pio run --target buildfs --environment <project name>
pio run --target uploadfs --environment <project name>
该存储库包含许多在构建项目期间或之后执行各种任务的脚本。它们包括在tools目录中。请注意,脚本期望从项目的主要目录开始。因此,使用:
tools/buddybuild.sh而不是:
cd tools
./buddybuild.sh写一些简单的东西,将颜色数据发送到插座。格式非常基本:哪个频道,您绘制了多少个LED,何时绘制它以及颜色数据本身。只要您在数据之前发送正确的标头,就可以将未压缩的数据发送未压缩的数据,这很简单。具有零时间戳的数据将立即绘制,没有缓冲。
| 字节 | 功能 | |
|---|---|---|
| 0,1 | Cresminid | (将其设置为3,是WIFI_COMMAND_PIXELDATA64 ) |
| 2,3 | ChannelID | (将其设置为单个频道的1,尽管出于历史原因0也可以工作) |
| 4-7 | 长度 | (设置24位PIXELS的数量) |
| 8-15 | 秒 | (将其设置为0) |
| 16-24 | micros | (将其设置为0) |
| 25+ | RGB | (24位RGB颜色数据,每个PIXEL的长度在上面的长度中指定) |
如果使用ENABLE_WIFI和INCOMING_WIFI_ENABLED构建,则芯片能够获得WiFi连接,并且DHCP地址将在端口49152上打开插座,并等待如上所述形成的数据包。
每秒生成一系列24帧(或30帧(如果低于500 LED)),并将时间戳设置为“现在”加上1/2秒。将它们发送到WiFi上的芯片上,从现在开始将它们从稳定的流中绘制为1/2秒,因为您给每个数据包的时间戳到了。
全面披露:作为亚马逊同事,Plummerssoftwarellc从合格的购买中赚取了佣金。它没有添加到购买价格中,也不会增加您的成本。另外,包括这些销售在内的Dave车库频道的所有2021利润都将转到UW自闭症中心。
我希望开源协作不会为项目带来一套复杂的准则:人们将在代码中添加重要功能并修复缺陷和缺点。当他们添加功能时,他们将以与现有代码中的工作方式相一致的方式进行操作。他们抵制了以自己的形象进行改进和重写所有内容的冲动,而是将努力努力最大化功能改进,同时减少源代码thrash和变化。
让我们考虑不一致的命名,应固定。有些是骆驼,有些是pszhungarian,等等,取决于来源。我更喜欢将其更新为单个标准TBD。在确定TBD之前,我倾向于Win32标准。
在功能中工作时,以功能的方式工作。在课堂上工作时,会以班级的方式工作。在文件上工作时,以文件的样式工作。如果这些不一致,请尽量减少变化。仅在小组讨论之后才能引入风格上的更改,并且通常应该在整个项目中拥有该风格的变化。
接下来,让我们考虑#define s来控制构建。可能有更好,更优雅的做事方式。可能有整个配置平台。但是我宁愿保持简单。我定义了最简单的“至少有经验的C ++程序员在使用有关代码的建设性之前需要学习”。如果我可以避免,我不想学习新的班级库!
一生的编码教会教会我在简单性的一边犯错,因此,除非它们明显地收缩源代码,否则请不要引入variadic模板构造。任何增长代码的复杂性和长度的东西都应怀疑。
添加任何您想要的东西和/或需要使您的LED梦想成真。修复我的失误。在我所知中填补明显的空白。最少的最眨眼的东西都会得到我的投票。对于每个代码和程序的每个字节,您只会得到太多的额外眨眼。该回报以Blinkenperbit测量,闪烁的令人敬畏的量增加了代码对源的影响(和二进制)的影响。
要复制,请构建Esmerizer项目。然后删除pio/build_cache并再次构建,花时间进行第二构建。
ASUS 7995WX [96核,192-thread] - > [Davepl,02/11/2024] 20.73秒
HP Z6 G5A,7995WX,128GB [96-CORE,192-THEAREXREAD] - > [DAVEPL 11/29/2023] 25.270秒
3970X,128GB [32核,64-Theard] Windows11+WSL2/ubuntu02.04lts-> [Davepl 11/29/2023] 34.292秒
Mac M1 Ultra Studio [10-core,20-thinead] - > [Davepl 11/29/2023] 48.368秒
是时候构建频谱配置( pio run -e spectrum )了。在安装和下载所有内容后,都假设一个干净的构建。
AMD 3970 32核,128GB,RAID SSD-> [Davepl 09/19/2021] 12.93秒(在WSL下运行)
AMD 5950x 16核,64GB,SSD-> [Davepl 09/19/2021] 16.90秒
Apple Macbook Pro M1 Max,8+2核,64GB,4TB SSD-> [Davepl 12/15/2021] 20.90秒
Apple MacBook Air M2,16GB,256GB SSD-> [Vaaski 02/28/2023] 56.17秒
MacBook Pro 2020,8核2.4GHz i9,64GB,4TB SSD-> [Davepl 09/19/2021] 34.09秒
Mac mini,4个perf核,16GB-> [davepl 09/19/2021] 39.06秒
Mac Pro,6核,3.5 GHz,64GB,1TB SSD-> [Davepl 09/19/2021] 48.42秒
Xeon Silver,20核,2.1GHz,16GB VM-> [Davepl 10/10/2022] 53.11秒
Raspberry Pi 4,64位Ubuntu LTS,4核,4GB-> [Davepl 09/23/2021] 6分钟25秒
Jetson Nano 2G,4个核心臂A57-> [davepl 10/04/2021] 2分钟56秒