数码之家

标题: 使用LED点阵显示模块P10制作Arduino计分牌 [打印本页]

作者: confessor    时间: 2022-2-11 19:06
标题: 使用LED点阵显示模块P10制作Arduino计分牌
本帖最后由 confessor 于 2022-2-12 13:52 编辑

电子记分牌是体育比赛中最重要的小工具之一。使用手动计分牌非常耗时且容易出错,因此在需要实时更新显示内容时,必须使用计算机化的计分牌。因此,在本篇文章中,我们将制作一个蓝牙控制的无线计分牌,我们可以使用android应用程序来更改分数。该项目的主要部分采用的是Arduino Nano开发板,显示部分,我们将使用P10 LED点阵模块实时远程显示得分。


LED点阵模块P10

LED点阵显示模块P10制作户外或室内LED广告板的最佳方法。该面板在塑料外壳上安装了总共512个高亮度LED,以实现最佳显示效果。它还具有IP65防水等级,非常适合户外使用。这样,您可以通过以任意行和列结构组合任意数量的此类面板来制作大型LED标牌。

我们使用的模块尺寸为32 * 16,这意味着每行有32个LED,每列有16个LED。因此,每个LED广告牌中 共有512个LED。除此之外,它还具有IP65防水等级,可以由单个5V电源供电,具有非常宽的视角,亮度可以达到4500尼特。因此,您将可以在阳光下清晰地看到它。


LED点阵的引脚说明

该LED显示板使用10针插头进行输入和输出连接,在本节中,我们介绍了该模块的所有必需针脚。另外,您可以看到模块中间有一个外部5V连接器,用于将外部电源连接到电路板。

[attach]1404703[/attach]

●    Enable:此引脚用于通过向其提供PWM脉冲来控制LED面板的亮度。

●    A,B:这些称为复用选择引脚。他们采用数字输入来选择任何多路复用行。

●    移位时钟(CLK)、存储时钟(SCLK)和数据:这些是常规移位寄存器控制引脚。这里使用了移位寄存器74HC595。


将LED显示模块P10连接到Arduino

将P10点阵显示模块连接到Arduino是一个非常简单的过程,在我们的电路中,我们将Arduino的引脚9配置为Enable引脚,将引脚6配置为引脚A,将引脚7配置为引脚B,引脚13是CLK,引脚8是SCLK,引脚11是数据,最后模块的引脚GND连接到Arduino的GND引脚。

注意:将P10模块的电源端子连接到外部5V电源,因为512个LED会消耗大量电流。建议将5V、3 Amp直流电源连接到单个P10 LED模块。


Arduino计分牌所需的组件

由于这是一个非常简单的项目,因此组件要求非常简单,下面显示了所需组件的列表。

●    Arduino Nano开发板

●    P10 LED点阵显示器

●    面包板

●    5V、3A SMPS电源

●    HC-05蓝牙模块

●    连接线


Arduino记分牌电路图

Arduino LED计分牌的原理图如下所示,因为该项目非常简单,我使用了软件fritzing来开发原理图。


[attach]1404704[/attach]

电路的工作非常简单,我们有一个Android应用程序和一个蓝牙模块,要与蓝牙模块成功通信,您必须将HC-05模块与android应用程序配对。连接后,我们可以发送要显示的字符串,发送完字符串后,Arduino将处理该字符串,并将其转换为内部74HC595移位器可以理解的信号,然后再将数据发送至移位电阻,就可以准备显示。


Arduino记分牌代码说明

成功完成硬件设置后,现在该对Arduino Nano进行编程了。该代码的分步说明如下。


首先,我们需要包括所有库。我们使用DMD.h库来控制P10 led显示屏。您可以从给定的GitHub链接下载。之后,您需要包括TimerOne.h库,该库将在我们的代码中用于中断编程。


这个库有很多可用的字体,我们在这个项目中使用了“ Arial_black_16”。

  1. #include
  2. #include
  3. #include
  4. #include "SystemFont5x7.h"
  5. #include "Arial_black_16.h"
复制代码

下一步,为我们的LED点阵板定义行数和列数。我们在此项目中仅使用了一个模块,因此ROW值和COLUMN值都可以定义为1。



  1. #define ROW 1
  2. #define COLUMN 1
  3. #define FONT Arial_Black_16
  4. DMD led_module (ROW, COLUMN);
复制代码

之后,定义代码中使用的所有变量。字符型变量用于从Android App接收串行数据,两个整型值用于存储分数,并且定义了一个数组,该数组存储要在矩阵上显示的最终数据。

  1. char input;
  2. int a = 0, b = 0;
  3. int flag = 0;
  4. char cstr1[50];
复制代码

定义了一个函数scan_module(),该函数连续检查通过SPI从Arduino Nano传入的任何数据。如果有数据,则它将触发中断,以执行程序中用户定义的某些事件。

  1. void scan_module()
  2. {
  3.   led_module.scanDisplayBySPI();
  4. }
复制代码

setup()函数中,初始化了定时器,并将中断附加到函数scan_module上。首先,使用clear screen(true)函数擦除了屏幕,这意味着所有像素都定义为“关闭”。


在setup函数中,还使用函数Serial.begin(9600)启用了串口通信,其中9600是蓝牙通信的波特率。

  1. void setup()
  2. {
  3.   Serial.begin(9600);
  4.   Timer1.initialize(2000);
  5.   Timer1.attachInterrupt(scan_module);
  6.   led_module.clearScreen( true );
  7. }
复制代码

在loop函数中,检查串口是否有来自Arduino的有效数据。从应用程序接收的数据存储在变量中。

  1. if(Serial.available() > 0)
  2.   {
  3.     flag = 0;
  4.     input = Serial.read();
复制代码

然后,将接收到的值与预定义变量进行比较。在这里,在Android应用程序中,采用了两个按钮来选择两个团队的得分。当按下按钮1时,字符“ a”被传输到Arduino,而当按下按钮2时,字符“ b”被传输到Arduino。因此,在此部分中,检查数据是否匹配,如果匹配,则各个得分值将按代码所示递增。

  1. if (input == 'a' && flag == 0)
  2.   {
  3.     flag = 1;
  4.     a++;
  5.   }
  6.   else if (input == 'b' && flag == 0)
  7.   {
  8.     flag = 1;
  9.     b++;
  10.   }
  11.   else;
复制代码

然后,将接收到的数据转换为字符数组,因为P10点阵函数只能显示字符数据类型。

  1. (String("HOME:")+String(a) + String(" - ") + String("AWAY:")+String(b)).toCharArray(cstr1, 50);
复制代码

然后,要在模块中显示信息,请使用selection()函数选择字体。然后使用drawMarquee()函数在P10模块上显示所需的信息。

  1. led_module.selectFont(FONT);
  2. led_module.drawMarquee(cstr1,50, (32 * ROW), 0);
复制代码

最后,由于需要滚动显示消息,因此我编写了一段代码,以在一定时间段内将整个消息从右向左移动。

  1. long start = millis();
  2.     long timming = start;
  3.     boolean flag = false;
  4.     while (!flag)
  5.     {
  6.       if ((timming + 30) < millis())
  7.       {
  8.         flag = led_module.stepMarquee(-1, 0);
  9.         timming = millis();
  10.       }
  11.     }
复制代码
原帖出处!

最后附上已经调通的代码供大家研究


  1. #include <SPI.h>
  2. #include <DMD.h>
  3. #include <TimerOne.h>
  4. #include "SystemFont5x7.h"
  5. #include "Arial_black_16.h"

  6. #define ROW 1
  7. #define COLUMN 1
  8. #define FONT Arial_Black_16
  9. DMD led_module (ROW, COLUMN);

  10. char input;
  11. int a = 8888, b = 8888;
  12. int flag = 0;
  13. char cstr1[50];

  14. void scan_module()
  15. {
  16.   led_module.scanDisplayBySPI();
  17. }






  18. void setup() {
  19.   Serial.begin(9600);
  20.   Timer1.initialize(2000);
  21.   Timer1.attachInterrupt(scan_module);
  22.   led_module.clearScreen( true );

  23. }

  24. void loop() {
  25. if(Serial.available() > 0)
  26.   {
  27.     flag = 0;
  28.     input = Serial.read();
  29.     if (input == 'a' && flag == 0)
  30.   {
  31.     flag = 1;
  32.     a++;
  33.   }
  34.   else if (input == 'b' && flag == 0)
  35.   {
  36.     flag = 1;
  37.     b++;
  38.   }
  39.   else;
  40.   (String("XAG P100   6")+String(a) + String(" - ") +  String("XAG V50   4")+String(b)).toCharArray(cstr1, 50);
  41. led_module.selectFont(FONT);
  42. led_module.drawMarquee(cstr1,50, (32 * ROW), 1);
  43. long start = millis();
  44.     long timming = start;
  45.     boolean flag = false;
  46.     while (!flag)
  47.     {
  48.       if ((timming + 43) < millis())
  49.       {
  50.         flag = led_module.stepMarquee(-1, 0);
  51.         timming = millis();
  52.       }
  53.     }

  54. }
  55. }
复制代码















欢迎光临 数码之家 (https://www.mydigit.cn/) Powered by Discuz! X3.4