钥匙要点
- 培训DMD库用于将线,形状和文本绘制到点矩阵LED显示器上。可以从freetronics github存储库中下载此库,然后复制到/arduino/libraries/folder。
> > Node.js中的png.decode()函数在png映像文件中读取,并返回0到255的值数组,代表每个像素的红色,绿色,蓝色,蓝色和alpha值。然后,这些值用于确定是否应在点矩阵LED显示器上显示每个像素为黑色或白色。 - >可以通过多种方式扩展和自定义点矩阵LED显示。例如,它可以连接到API以显示通过它的图像,也可以根据一天中的时间,与Internet连接的设备的状态,天气等显示不同的图像。
DOT矩阵LED显示器很有趣。哪些开发人员不喜欢灯光灯可以玩?我最近与Node.js配对了32 x 16点矩阵显示器,并将其显示为黑白PNG图像。在本文中,我将解释一切的工作原理。- >一个点矩阵LED显示器(也称为DOT矩阵显示或DMD)是带有LED灯网格的显示屏,您可以打开和关闭,以显示文本和形状。其中一些具有多种颜色,而另一些则只是一种颜色。我们将在此演示中使用的一种只有一种颜色,因此我们仅限于黑白图像。重要的是要注意 - LED显示屏与LCD显示器完全不同。 LCD使用精美的光晶体,用于在VCR,时钟,计算器等上显示。几周前,我写了一篇文章,内容涉及使用Node.js上的Arduino LCD上显示Web API。如果您想比较两者,请看一下。
- 这个特定的演示需要一个露天率32×16点矩阵显示器,因为它依赖于freetronics dmd库。
>- 演示代码
训练dmd库
>
通过训练DMD库完成了我们的LED点矩阵显示器上的绘图线,形状和文本。要使用它,请完成以下步骤:- >从他们的github存储库下载DMD库。
- >以其自己的文件夹名称将这些文件复制到您的/arduino/libraries/文件夹中。对于我在Mac上的我,我将其放在/用户/用户名/文档/arduino/libraries/dmd-master的文件夹中。 >
- >下载TemerOne库,并将其放入您的/arduino/libraries/文件夹中。例如对于Mac用户,/用户/用户名/文档/arduino/libraries/timerone-r11。 >
我们的arduino素描
在我们的Arduino素描代码中,将发生在DMD上显示元素的大多数功能。草图代码将留意串行端口上的消息,并根据这些消息更改显示的显示。草图始于我们的包含和常数。我们包括SoftWareserial.H,允许我们访问串行端口并定义DMD的宽度和高度(在我们的情况下为32×16)。 Buflength存储了我们拥有的灯数,因为这是我们要发送Arduino的消息的最大大小。在我们的情况下,它乘以32乘以16,即512。
>接下来,我们将包括特定于自由式DMD的特定内容。这些都应从我们复制到Arduino Libraries文件夹中的文件中可用。
<span><span>#include <softwareserial.h></softwareserial.h></span> </span> <span><span>#define SCREEN_WIDTH <span>32</span></span> </span> <span><span>#define SCREEN_HEIGHT <span>16</span></span> </span> <span><span>#define BUFLENGTH <span>512</span></span></span>>
然后,我们有两个常数displays_across和displays_down,用于定义我们加入了多少个LED显示。我假设您与我处于同一情况,并且只有一个显示,因此这两个都等于一个。然后,我们将其传递到DMD库中,使用DMD DMD()。
DMD样本中包含下一个代码。这是我们称为DMD库以设置间隔刷新显示的功能。我们将间隔定义得更远。<span><span>#include <spi.h></spi.h></span> </span> <span><span>#include <dmd.h></dmd.h></span> </span> <span><span>#include <timerone.h></timerone.h></span></span>>
然后,我们定义了最后两个变量。这两个与通过串行端口接收消息有关。首先,BUF [BUFLENGTH]存储串行端口消息的缓冲区,其中LED应打开和关闭。其次,bufcount将用于存储此缓冲区中的多少个字节以读取。
<span><span>#define DISPLAYS_ACROSS <span>1</span></span> </span> <span><span>#define DISPLAYS_DOWN <span>1</span></span> </span> DMD <span>dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);</span>>我们的setup()函数使用常数和定义的库开始整个过程。它首先是在端口57600上聆听串行端口消息。
>
然后,我们使用我们之前包含的TimerOne库初始化计时器。我们告诉它是四毫秒的倒计时。在Freetronics的示例中,他们建议不要将其设置为超过五毫秒以避免在我们的展示中闪烁。<span>void ScanDMD() { </span> dmd<span>.scanDisplayBySPI(); </span> <span>}</span>>
然后,当我们的计时器到期时,我们将其设置为运行ScandMD()函数,从而刷新显示器。
<span>char buf[BUFLENGTH]; </span> <span>int bufCount;</span>>最后,在我们的setup()函数中,我们通过忠于dmd.clearscreen()函数来清除显示屏上的所有像素。如果您将虚假传递到此功能,则每个像素都会打开!
>
<span><span>#include <softwareserial.h></softwareserial.h></span> </span> <span><span>#define SCREEN_WIDTH <span>32</span></span> </span> <span><span>#define SCREEN_HEIGHT <span>16</span></span> </span> <span><span>#define BUFLENGTH <span>512</span></span></span>在我们的Arduino loop()函数中,我们会注意串行端口上的任何消息。我们观察以查看有多少个字节可从串行端口阅读。如果有可用的字节,那么我们会通过一个消息流进行流,然后运行serialParse()函数。
>
<span><span>#include <spi.h></spi.h></span> </span> <span><span>#include <dmd.h></dmd.h></span> </span> <span><span>#include <timerone.h></timerone.h></span></span>>在serialparse()内,我们将bufcount设置为-1以重置计数值。然后,我们使用serial.ReadBytesuntil()中读取该数组(我们的buflength)的512个元素。如果有n个字符,它也将停止阅读数组。这里的主要目的是将串行信息保持在我们的LED光网格的长度内。
如果我们确实在缓冲区中有消息,则将其发送到Parsebuffer(),该parsebuffer()将解析并将其显示在我们的屏幕上。
<span><span>#define DISPLAYS_ACROSS <span>1</span></span> </span> <span><span>#define DISPLAYS_DOWN <span>1</span></span> </span> DMD <span>dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);</span>
在ParseBuffer()函数中,我们首先清除屏幕,以便我们用新图纸点亮它。然后,我们创建一个i的整数,以跟踪我们正在阅读的数组中的哪个位置。
> 然后,我们通过x通过x循环到屏幕_Width,然后通过y循环向下循环直至screen_height,然后通过x循环循环循环,然后从x循环循环,然后从左到右迭代。这将我们的一维数组读取到DMD的二维显示中。对于每个角色,我们检查是否是“ 1”。如果是这样,那么我们在x和y处的显示屏上画出了该LED。这将用于黑色图像的各个部分。如果不是“ 1”,那么我们将继续到下一个位置,依此类推。最终,绘制我们的整个图像。<span>void ScanDMD() { </span> dmd<span>.scanDisplayBySPI(); </span> <span>}</span>
涵盖了我们的Arduino的工作原理 - 如果我们现在在附加的LED上运行该代码,那么它根本没有显示。要在DOT矩阵显示器上显示任何显示的内容,我们需要我们的节点代码将其发送到串行端口的消息。
我们的节点代码
<span>char buf[BUFLENGTH]; </span> <span>int bufCount;</span>
我们的JavaScript首先需要两个重要的NPM模块。 SerialPort将使我们能够通过串行端口向我们的Arduino和PNG-JS发送消息,这是我们的PNG图像中读取的内容。
>然后,我们设置了串行端口消息。我们在变量序列上设置了一个串行对象,并使用我们的Arduino连接到哪个端口,以及我们将在上面聆听的串行端口消息。
如果您不确定您的arduino连接到哪个端口(例如,我有'/dev/tty.usbmodem1431'),请将其连接到您的PC,打开Arduino IDE,请转到工具>端口,然后查看哪个端口选择。
<span>void setup() { </span> Serial<span>.begin(57600);</span>
>波特率可以是个人喜好,如果您不太担心它使用的是哪种波特率,请随时坚持我们在示例中已经获得的。 然后,我们初始化一个称为serialMessage的字符串变量,该变量将存储我们将通过串行端口发送的完整字符串和零字符串。
<span><span>#include <softwareserial.h></softwareserial.h></span> </span> <span><span>#define SCREEN_WIDTH <span>32</span></span> </span> <span><span>#define SCREEN_HEIGHT <span>16</span></span> </span> <span><span>#define BUFLENGTH <span>512</span></span></span>
>我们的Serialport对象具有“打开”的事件侦听器,当定义串行端口打开并准备从我们的JavaScript访问时,它会响应。在这种情况下,我们运行console.log,因此我们可以确定我们的串行端口消息都很好。
><span><span>#include <spi.h></spi.h></span> </span> <span><span>#include <dmd.h></dmd.h></span> </span> <span><span>#include <timerone.h></timerone.h></span></span>
>一旦我们知道我们的串行端口已准备就绪消息,我们将运行png.decode()函数以读取我们的png映像文件。在我们的演示中,我们在与名为sitePointLogo-withsmile.png的节点文件的同一文件夹中有一个PNG映像,因此我们传递了该文件名。然后,我们拥有回调函数,该功能通过数据变量为我们提供了PNG文件的数据。
<span><span>#define DISPLAYS_ACROSS <span>1</span></span> </span> <span><span>#define DISPLAYS_DOWN <span>1</span></span> </span> DMD <span>dmd(DISPLAYS_ACROSS, DISPLAYS_DOWN);</span>
上面的阵列代表一个白色像素,其255,255,255,255和一个黑色像素为0,0,0,255。每个像素都一遍又一遍地继续,直到我们代表整个图像为止。
<span>void ScanDMD() { </span> dmd<span>.scanDisplayBySPI(); </span> <span>}</span>在我们的回调函数中,我们将序列序列重置为空白字符串,然后以四个集合的数据阵列开始迭代。我们设置了一个红色,绿色和蓝色的局部变量,以匹配每个像素的各自值。
>
为了能够处理并非完全黑色或白色的灰度值,我们还进行了亮度检查。下面的功能确定了像素的颜色的深色或光线:
<span>char buf[BUFLENGTH]; </span> <span>int bufCount;</span>如果该值大于150,那么我们假设它是一种漂亮的浅色,并将其设置为0(白色)。否则,我们将其设置为1并将其变成黑色。我们将任何一个值都附加到序列的字符串。
>
<span>void setup() { </span> Serial<span>.begin(57600);</span>>一旦我们遍历了每个像素并分配了零或一个代表它,我们就会使用serialport.write()通过串行端口发送该消息。在图像中阅读和迭代的整个过程实际上比显示器准备接收它所需的时间更快,因此我将其放入SettieMout中,以使其在运行之前等待两秒钟。
Timer1<span>.initialize(4000);</span>>运行我们的演示
>如果上传草图,请将显示器连接到您的arduino,然后通过Node SeriaLdMd.js运行节点服务器代码(请记住,请首先安装所有内容),您应该看到它用PNG文件点亮,例如:

结论
>您可以通过多种方法进行扩展。它是一个节点服务器,因此您可以将其连接到API并显示通过它的图像。您可以根据一天中的时间(您的家中的Internet连接设备,天气或其他许多东西)显示出不同的图像!
>如果您将这个想法扩展到真正整洁的事物中,请在评论中知道或在Twitter上与我联系(@thatpatrickguy),我想看看!
>经常询问的问题(常见问题解答)有关在点矩阵LED显示上显示带有node.js> node.js在DOT矩阵LED显示器上显示图像的作用是什么?>>如何将我的点矩阵LED显示器连接到我的计算机?将点矩阵LED显示器连接到计算机通常涉及使用微控制器,例如Arduino或Raspberry Pi。微控制器充当计算机和LED显示屏之间的中介。然后,您可以使用node.js将数据从计算机发送到微控制器,然后将数据发送到LED显示器。
我可以使用Node.js以外的其他编程语言来控制点矩阵LED显示器是的,是的,您可以使用其他编程语言来控制点矩阵LED显示。虽然本文由于易于使用和多功能性而着重于使用Node.js,但也可以使用其他语言,例如Python,C和Java。编程语言的选择在很大程度上取决于您的舒适度和项目的特定要求。
>使用DOT矩阵LED显示器的优点是什么? 。它们用途广泛,可以显示文本,数字和图像。它们也具有节能,耐用,寿命很长。此外,它们提供了高亮度和可见性,使其适合各种应用程序,从广告板到信息显示。
如何在我的点矩阵LED显示器上显示自定义图像?
点矩阵LED显示屏上的图像涉及将图像转换为显示器可以理解的格式。这通常涉及将图像转换为二进制格式,其中每个像素由0(OFF)或1(ON)表示。然后,您可以使用node.js将此二进制数据发送到LED显示。>>我可以将DOT矩阵LED显示用于大型应用程序吗?它们可以合并以创建较大的显示器,使其非常适合数字广告牌,公共信息显示和大规模广告。
>
> dot矩阵LED显示的寿命是多少? > DOT矩阵LED显示屏的寿命可能会因所使用的LED质量以及使用显示的条件而有所不同。但是,LED显示器通常以其寿命而闻名,可以持续数万小时的使用。
>>我如何解决我的点矩阵LED显示问题的问题?点矩阵LED显示器可以检查显示显示器和微控制器之间的连接,以确保将正确的数据发送到显示器并检查电源。如果您使用node.js,也可以使用调试工具来帮助识别代码的任何问题。
我可以在户外使用dot矩阵LED显示吗?
是的,点矩阵LED显示器可以在户外使用。但是,重要的是要确保显示屏受到元素的适当保护。这可能涉及使用防风雨套管或将显示器安装在庇护所的位置。
>我如何优化点矩阵LED显示器的亮度?
> dot矩阵LED显示器的亮度可以使用脉冲宽度调制(PWM)控制。这涉及改变每个LED打开的时间的量,这又控制了显示屏的亮度。您可以使用node.js控制发送到LED显示屏的PWM信号,从而使您可以根据需要调整亮度。
>如何将我的点矩阵LED显示器连接到我的计算机?将点矩阵LED显示器连接到计算机通常涉及使用微控制器,例如Arduino或Raspberry Pi。微控制器充当计算机和LED显示屏之间的中介。然后,您可以使用node.js将数据从计算机发送到微控制器,然后将数据发送到LED显示器。
我可以使用Node.js以外的其他编程语言来控制点矩阵LED显示器是的,是的,您可以使用其他编程语言来控制点矩阵LED显示。虽然本文由于易于使用和多功能性而着重于使用Node.js,但也可以使用其他语言,例如Python,C和Java。编程语言的选择在很大程度上取决于您的舒适度和项目的特定要求。
>使用DOT矩阵LED显示器的优点是什么? 。它们用途广泛,可以显示文本,数字和图像。它们也具有节能,耐用,寿命很长。此外,它们提供了高亮度和可见性,使其适合各种应用程序,从广告板到信息显示。
如何在我的点矩阵LED显示器上显示自定义图像?
>>我可以将DOT矩阵LED显示用于大型应用程序吗?它们可以合并以创建较大的显示器,使其非常适合数字广告牌,公共信息显示和大规模广告。
>
> dot矩阵LED显示的寿命是多少? > DOT矩阵LED显示屏的寿命可能会因所使用的LED质量以及使用显示的条件而有所不同。但是,LED显示器通常以其寿命而闻名,可以持续数万小时的使用。
>>我如何解决我的点矩阵LED显示问题的问题?点矩阵LED显示器可以检查显示显示器和微控制器之间的连接,以确保将正确的数据发送到显示器并检查电源。如果您使用node.js,也可以使用调试工具来帮助识别代码的任何问题。
我可以在户外使用dot矩阵LED显示吗?
是的,点矩阵LED显示器可以在户外使用。但是,重要的是要确保显示屏受到元素的适当保护。这可能涉及使用防风雨套管或将显示器安装在庇护所的位置。
>我如何优化点矩阵LED显示器的亮度?
以上是用node.js显示在点矩阵LED显示器上显示图像的详细内容。更多信息请关注PHP中文网其他相关文章!

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript在现实世界中的应用包括服务器端编程、移动应用开发和物联网控制:1.通过Node.js实现服务器端编程,适用于高并发请求处理。2.通过ReactNative进行移动应用开发,支持跨平台部署。3.通过Johnny-Five库用于物联网设备控制,适用于硬件交互。

我使用您的日常技术工具构建了功能性的多租户SaaS应用程序(一个Edtech应用程序),您可以做同样的事情。 首先,什么是多租户SaaS应用程序? 多租户SaaS应用程序可让您从唱歌中为多个客户提供服务

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。 1.Python以简洁语法和丰富库生态着称,适用于数据分析和Web开发。 2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

WebStorm Mac版
好用的JavaScript开发工具