電子記分牌是任何人在任何體育比賽中都可以擁有的最重要的小工具之一。使用傳統方法的舊手動記分牌非常耗時且容易出錯,因此在需要實時更改顯示單元的情況下,必須使用計算機記分牌。這就是為什么在這個項目中,我們將構建一個藍牙控制的無線記分牌,我們可以通過使用一個安卓應用程序來更改板上的分數。這個項目的大腦是一個 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);
計時 = 毫秒();
}
}
}
-
LED顯示
+關注
關注
0文章
361瀏覽量
38045 -
Arduino
+關注
關注
188文章
6470瀏覽量
187166 -
藍牙控制
+關注
關注
0文章
12瀏覽量
2687
發布評論請先 登錄
相關推薦
評論