电子记分牌是任何人在任何体育比赛中都可以拥有的最重要的小工具之一。使用传统方法的旧手动记分牌非常耗时且容易出错,因此在需要实时更改显示单元的情况下,必须使用计算机记分牌。这就是为什么在这个项目中,我们将构建一个蓝牙控制的无线记分牌,我们可以通过使用一个安卓应用程序来更改板上的分数。这个项目的大脑是一个 Arduino Nano,对于显示部分,我们将使用 P10 LED 矩阵来实时远程显示分数。
P10 LED显示矩阵
P10 LED 矩阵显示器是制作户外或室内LED 广告板的最佳方式。该面板共有 512 个高亮度 LED,安装在塑料外壳上,旨在实现最佳显示效果。它还具有 IP65 防水等级,非常适合户外使用。有了这个,您可以通过在任何行和列结构中组合任意数量的此类面板来制作大型LED 招牌。
我们的模组尺寸为32*16,也就是说每行32个LED,每列16个LED。因此,每个 LED 招牌中共有 512 个 LED。除此之外,它的防水等级为IP65,可以由单个5V电源供电,具有非常宽的视角,亮度可以达到4500尼特。因此,您将能够在日光下清楚地看到它。之前我们也使用这个P10 显示器和 Arduino来构建一个简单的 LED 板。
P10 LED 矩阵管脚说明:
该LED 显示板使用 10 针邮件头进行输入和输出连接,在本节中,我们已经描述了该模块的所有必要针脚。此外,您可以看到模块中间有一个外部 5V 连接器,用于将外部电源连接到电路板。
启用:此引脚用于控制 LED 面板的亮度,通过给它一个 PWM 脉冲。
A、B:这些称为多路复用选择引脚。它们采用数字输入来选择任何多路复用行。
移位时钟 (CLK)、存储时钟 (SCLK) 和数据:这些是正常的移位寄存器控制引脚。这里使用了移位寄存器 74HC595。
将 P10 LED 显示模块连接到 Arduino:
将P10矩阵显示 模块连接到 Arduino 是一个非常简单的过程,在我们的电路中,我们将 Arduino 的引脚 9 配置为使能引脚,引脚 6 为引脚 A,引脚 7 为引脚 B,引脚 13 为 CLK,引脚 8 为SCLK,引脚11是DATA,最后引脚GND是模块和Arduino的GND引脚,下面的完整表格清楚地解释了引脚配置。
P10 LED模组Arduino UNO
注意:将P10模块的电源端接外接5V电源,因为512个LED会消耗很多功率。建议将 5V、3 Amp 直流电源连接到单个 P10 LED 模块。如果您计划连接更多号码模块,请相应增加您的 SMPS 容量。
Arduino 记分板所需的组件
由于这是一个非常简单的项目,组件要求非常通用,所需组件列表如下所示,您应该可以在当地的爱好商店中找到所有列出的材料。
Arduino纳米
P10 LED矩阵显示
面包板
5V、3 安培开关电源
HC-05 蓝牙模块
连接电线
Arduino记分牌电路图
Arduino LED Scoreboard的原理图如下所示,因为这个项目非常简单,我使用了流行的软件 fritzing 来开发原理图。
电路的工作很简单,我们有一个安卓应用程序和一个蓝牙模块,要成功与蓝牙模块通信,你必须将HC-05模块与安卓应用程序配对。连接好后就可以发送我们想要显示的字符串了,一旦发送了字符串,Arduino会处理这个字符串,并将其转换为内部74HC595移位电阻可以理解的信号,数据发送到移位后电阻,它准备显示。
Arduino记分牌代码说明
成功完成硬件设置后,现在是 Arduino Nano 编程的时候了。下面给出代码的逐步描述。此外,您可以在本教程的底部获取完整的Arduino 记分板代码。
首先,我们需要包含所有的库。我们使用DMD.h库 来控制 P10 LED 显示屏。您可以从给定的 GitHub 链接下载并包含它。之后,您需要包含 TimerOne.h库,它将用于在我们的代码中进行中断编程。
这个库中有很多可用的前端,我们在这个项目中使用了“ Arial_black_16 ”。
#include#include #include #include "SystemFont5x7.h" #include "Arial_black_16.h"
在下一步中,为我们的 LED 矩阵板定义行数和列数。我们在这个项目中只使用了一个模块,所以 ROW 值和 COLUMN 值都可以定义为 1。
#define ROW 1 #define COLUMN 1 #define FONT Arial_Black_16 DMD led_module (ROW, COLUMN);
之后,定义了代码中使用的所有变量。一个字符变量用于接收来自 Android App 的串行数据,两个整数值用于存储分数,并定义了一个数组来存储最终要显示在 Matrix 上的数据。
字符输入; 整数a = 0,b = 0; 整数标志 = 0; 字符 cstr1[50];
定义了一个函数scan_module(),它通过SPI持续检查来自 Arduino Nano 的任何传入数据。如果是,那么它将触发中断以执行用户在程序中定义的某些事件。
无效 scan_module() { led_module.scanDisplayBySPI(); }
在setup()内部,定时器被初始化,中断被附加到函数scan_module,这在前面已经讨论过了。最初,使用函数clear screen(true) 清除屏幕,这意味着所有像素都定义为 OFF。
在设置中,还使用函数Serial.begin(9600)启用了串行通信,其中 9600 是蓝牙通信的波特率。
无效设置() { 序列.开始(9600); Timer1.initialize(2000); Timer1.attachInterrupt(scan_module); led_module.clearScreen(真); }
在这里,检查串行数据的可用性,是否有来自 Arduino 的有效数据。从 App 接收到的数据存储在一个变量中。
if(Serial.available() > 0) { flag = 0; 输入 = Serial.read();
然后,将接收到的值与预定义的变量进行比较。在这里,在 Android 应用程序中,使用两个按钮来选择两支球队的分数。当按下按钮 1 时,字符“a”被传输到 Arduino,当按下按钮 2 时,字符“b”被传输到 Arduino。因此,在本节中,此数据是匹配的,如果匹配,则相应的分数值会增加,如代码所示。
if (input == 'a' && flag == 0) { flag = 1; 一个++; } else if (input == 'b' && flag == 0) { flag = 1; b++; } 其他;
然后,将接收到的数据转换为字符数组,因为 P10 矩阵函数只能显示字符数据类型。这就是为什么所有变量都被转换并连接成一个字符数组的原因。
(String("HOME:")+String(a) + String(" - ") + String("AWAY:")+String(b)).toCharArray(cstr1, 50);
然后,为了在模块中显示信息,使用selection()函数选择字体。然后drawMarquee()函数用于在 P10 板上显示所需的信息。
led_module.selectFont(字体); led_module.drawMarquee(cstr1,50, (32 * ROW), 0);
最后,由于我们需要滚动消息显示,我编写了一个代码,使用特定周期将整个消息从右向左移动。
长开始 = 毫秒(); 长时间的计时=开始; 布尔标志 = 假; while (!flag) { if ((timming + 30) < millis()) { flag = led_module.stepMarquee(-1, 0); 计时 = 毫秒(); } }
这标志着我们编码过程的结束。现在可以上传了。
智能手机控制的记分牌 - 测试
将代码上传到 Arduino 后,就该测试项目了。在此之前,需要在我们的智能手机上安装 android 应用程序。您可以从给定的链接下载 P10 Score Board 应用程序。安装后,打开应用程序,主屏幕应如下图所示。
点击SCAN按钮,添加带有 App 的蓝牙模块。这将显示手机的配对蓝牙设备列表。如果您之前没有配对过HC-05 蓝牙模块,请使用手机的蓝牙设置配对模块,然后执行此步骤。屏幕将如下所示:
然后,从列表中单击“HC-05”,因为这是我们此处使用的蓝牙模块的名称。单击它后,它将在屏幕上显示已连接。然后我们可以继续使用记分牌。
单击“主页”和“离开”之间的任何按钮,如应用程序所示。如果选择 Home 按钮,则 Home 的分数将在 P10 显示中递增。同样,如果选择了离开按钮,离开的分数将增加。下图显示了最终屏幕的外观。
#include
#include
#include
#include "SystemFont5x7.h"
#include "Arial_black_16.h"
#定义第 1 行
#define 第 1 列
#define 字体 Arial_Black_16
字符输入;
整数a = 0,b = 0;
整数标志 = 0;
字符 cstr1[50];
DMD led_module(行,列);
无效扫描模块()
{
led_module.scanDisplayBySPI();
}
无效设置()
{
序列号.开始(9600);
Timer1.initialize(2000);
Timer1.attachInterrupt(scan_module);
led_module.clearScreen(真);
}
无效循环()
{
如果(串行。可用()> 0)
{
标志 = 0;
输入 = Serial.read();
如果(输入 == 'a' && 标志 == 0)
{
标志 = 1;
一个++;
}
else if (input == 'b' && flag == 0)
{
标志 = 1;
b++;
}
别的;
}
(String("HOME:")+String(a) + String(" - ") + String("AWAY:")+String(b)).toCharArray(cstr1, 50);
led_module.selectFont(字体);
led_module.drawMarquee(cstr1,50, (32 * ROW), 0);
长开始 = 毫秒();
长时间的计时=开始;
布尔标志 = 假;
而(!标志)
{
if ((timming + 30) < 毫秒())
{
flag = led_module.stepMarquee(-1, 0);
计时 = 毫秒();
}
}
}
全部0条评论
快来发表一下你的评论吧 !