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

用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></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>
从我们的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
JavaScript应用程序:从前端到后端JavaScript应用程序:从前端到后端May 04, 2025 am 12:12 AM

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

Python vs. JavaScript:您应该学到哪种语言?Python vs. JavaScript:您应该学到哪种语言?May 03, 2025 am 12:10 AM

选择Python还是JavaScript应基于职业发展、学习曲线和生态系统:1)职业发展:Python适合数据科学和后端开发,JavaScript适合前端和全栈开发。2)学习曲线:Python语法简洁,适合初学者;JavaScript语法灵活。3)生态系统:Python有丰富的科学计算库,JavaScript有强大的前端框架。

JavaScript框架:为现代网络开发提供动力JavaScript框架:为现代网络开发提供动力May 02, 2025 am 12:04 AM

JavaScript框架的强大之处在于简化开发、提升用户体验和应用性能。选择框架时应考虑:1.项目规模和复杂度,2.团队经验,3.生态系统和社区支持。

JavaScript,C和浏览器之间的关系JavaScript,C和浏览器之间的关系May 01, 2025 am 12:06 AM

引言我知道你可能会觉得奇怪,JavaScript、C 和浏览器之间到底有什么关系?它们之间看似毫无关联,但实际上,它们在现代网络开发中扮演着非常重要的角色。今天我们就来深入探讨一下这三者之间的紧密联系。通过这篇文章,你将了解到JavaScript如何在浏览器中运行,C 在浏览器引擎中的作用,以及它们如何共同推动网页的渲染和交互。JavaScript与浏览器的关系我们都知道,JavaScript是前端开发的核心语言,它直接在浏览器中运行,让网页变得生动有趣。你是否曾经想过,为什么JavaScr

node.js流带打字稿node.js流带打字稿Apr 30, 2025 am 08:22 AM

Node.js擅长于高效I/O,这在很大程度上要归功于流。 流媒体汇总处理数据,避免内存过载 - 大型文件,网络任务和实时应用程序的理想。将流与打字稿的类型安全结合起来创建POWE

Python vs. JavaScript:性能和效率注意事项Python vs. JavaScript:性能和效率注意事项Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差异主要体现在:1)Python作为解释型语言,运行速度较慢,但开发效率高,适合快速原型开发;2)JavaScript在浏览器中受限于单线程,但在Node.js中可利用多线程和异步I/O提升性能,两者在实际项目中各有优势。

JavaScript的起源:探索其实施语言JavaScript的起源:探索其实施语言Apr 29, 2025 am 12:51 AM

JavaScript起源于1995年,由布兰登·艾克创造,实现语言为C语言。1.C语言为JavaScript提供了高性能和系统级编程能力。2.JavaScript的内存管理和性能优化依赖于C语言。3.C语言的跨平台特性帮助JavaScript在不同操作系统上高效运行。

幕后:什么语言能力JavaScript?幕后:什么语言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在浏览器和Node.js环境中运行,依赖JavaScript引擎解析和执行代码。1)解析阶段生成抽象语法树(AST);2)编译阶段将AST转换为字节码或机器码;3)执行阶段执行编译后的代码。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能