首页 >web前端 >js教程 >用node.js显示在点矩阵LED显示器上显示图像

用node.js显示在点矩阵LED显示器上显示图像

William Shakespeare
William Shakespeare原创
2025-02-19 10:59:09744浏览

用node.js显示在点矩阵LED显示器上显示图像

钥匙要点

  • 培训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库。
  • >
  • 演示代码
如果您渴望抓住代码并尝试一下,可以在GitHub上找到它。

训练dmd库

>

通过训练DMD库完成了我们的LED点矩阵显示器上的绘图线,形状和文本。要使用它,请完成以下步骤:

  1. >从他们的github存储库下载DMD库。
  2. >以其自己的文件夹名称将这些文件复制到您的/arduino/libraries/文件夹中。对于我在Mac上的我,我将其放在/用户/用户名/文档/arduino/libraries/dmd-master的文件夹中。
  3. >
  4. >下载TemerOne库,并将其放入您的/arduino/libraries/文件夹中。例如对于Mac用户,/用户/用户名/文档/arduino/libraries/timerone-r11。
  5. >

我们的arduino素描

在我们的Arduino素描代码中,将发生在DMD上显示元素的大多数功能。草图代码将留意串行端口上的消息,并根据这些消息更改显示的显示。

草图始于我们的包含和常数。我们包括SoftWareserial.H,允许我们访问串行端口并定义DMD的宽度和高度(在我们的情况下为32×16)。 Buflength存储了我们拥有的灯数,因为这是我们要发送Arduino的消息的最大大小。在我们的情况下,它乘以32乘以16,即512。

>

接下来,我们将包括特定于自由式DMD的特定内容。这些都应从我们复制到Arduino Libraries文件夹中的文件中可用。
<span><span>#include <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></span>
</span>  <span><span>#include <DMD.h></span>
</span>  <span><span>#include <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></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></span>
</span>  <span><span>#include <DMD.h></span>
</span>  <span><span>#include <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></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></span>
</span>  <span><span>#include <DMD.h></span>
</span>  <span><span>#include <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>
从我们的png.decode()函数返回的数据将是0到255的值。它们通过每个像素迭代每个像素,每个像素都有一系列四个项目 - 红色,绿色,蓝色和alpha价值。我们不会在演示中使用Alpha值,因为我们只是处理黑白图像,但理论上您可以使用。样本阵列看起来像:

上面的阵列代表一个白色像素,其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文件点亮,例如:用node.js显示在点矩阵LED显示器上显示图像

结论

>您可以通过多种方法进行扩展。它是一个节点服务器,因此您可以将其连接到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信号,从而使您可以根据需要调整亮度。

以上是用node.js显示在点矩阵LED显示器上显示图像的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn