今天我們將使用 NodeMCU 和 P10 顯示模塊構(gòu)建一個(gè)基于 IoT 和 Arduino 的 IPL 記分板,它足夠大,可以顯示實(shí)時(shí)比分,而且制作起來(lái)非常簡(jiǎn)單。
構(gòu)建物聯(lián)網(wǎng)計(jì)分板所需的組件
項(xiàng)目比較簡(jiǎn)單,需要的組件也不多。只需收集下面列出的物品。
Arduino納米
ESP8266 NodeMCU
性能板
男性和女性標(biāo)題
9V 直流,2 安培電源
5 安培、3 安培 SMPS
連接線
基于節(jié)點(diǎn) MCU 和 Arduino 的物聯(lián)網(wǎng)記分板工作
該項(xiàng)目的完整工作如上面的框圖所示。在這里,“ CRICAPI ”API 服務(wù)用于獲取實(shí)時(shí) IPL 分?jǐn)?shù),然后由 ESP8266 nodeMCU 解碼并再次發(fā)送到控制顯示的Arduino Nano 。在這里,串行通信用于將信息從NodeMCU發(fā)送到 Arduino Uno。然后Arduino將需要顯示的所需信息發(fā)送到p10顯示器。
P10 LED 顯示模塊是一種非常流行的矩陣顯示器,用于宣傳戶外或室內(nèi)條件。每個(gè) p10 顯示模塊共有 512 個(gè)高亮度 LED,安裝在塑料外殼上,旨在實(shí)現(xiàn)最佳顯示效果。任何數(shù)量的此類面板可以組合成任何行和列結(jié)構(gòu),以設(shè)計(jì) LED 通知/廣告板。32*16 模塊尺寸意味著每行有 32 個(gè) LED,每列有 16 個(gè) LED。因此,每個(gè)模塊單元中有 512 個(gè) LED。
這個(gè)模塊有很多特點(diǎn),比如它總共有512個(gè)LED,這使得制作廣告牌非常酷,并且在我們需要展示的地方都需要它。它的總亮度為 3500-4500 尼特,因此您可以在光天化日之下非常清楚地看到它。它有一個(gè)最大值。功耗為 20W,因此可以由小型開(kāi)關(guān)電源模塊供電。它還需要一個(gè)單獨(dú)的 5V 電源為邏輯部分供電。它具有 IP65 防水等級(jí),因此可以在潮濕和雨天的戶外輕松使用。
P10顯示模塊引腳說(shuō)明:
Enable:此引腳用于通過(guò)向 LED 面板提供 PWM 脈沖來(lái)控制 LED 面板的亮度。
A、B:這些稱為多路復(fù)用選擇引腳。它們采用數(shù)字輸入來(lái)選擇任何多路復(fù)用行。
移位時(shí)鐘 (CLK)、存儲(chǔ)時(shí)鐘 (SCLK) 和數(shù)據(jù):這些是正常的移位寄存器控制引腳。這里使用移位寄存器74HC595。
P10顯示模塊接線圖:
Arduino UNO 和 P10 顯示模塊按照如下所示的引腳映射互連:
重要的提示:
將 P10 模塊的電源端子單獨(dú)連接到 5V DC SMPS。建議將 5V、3 Amp 直流電源連接到單個(gè) P10 LED 模塊。如果您計(jì)劃連接更多模塊,請(qǐng)相應(yīng)提高您的 SMPS 額定值。
基于 NodeMCU 和 IoT 的實(shí)時(shí)計(jì)分板 - 示意圖
基于物聯(lián)網(wǎng)的實(shí)時(shí)計(jì)分板的完整示意圖如上所示。如電路圖所示,首先將一個(gè) 9V 直流電源連接到 Arduino Nano,然后將來(lái)自 Arduino 的穩(wěn)壓 5V 直流電源提供給 NodeMCU。對(duì)于 Arduino 和 NodeMCU 之間的通信,使用 TX 和 RX 引腳,如圖所示連接。最后,按照上圖所示的電路圖,將 P10 顯示器連接到 Arduino。
在這個(gè)項(xiàng)目中,所有的連接都按照上圖進(jìn)行并焊接在穿孔板上。完成電路圖后,電路板如下圖所示:
連接成功后,我已將板子連接到 p10 顯示器并將電路封裝在外殼中,如下圖所示:
基于物聯(lián)網(wǎng)的記分板的軟件設(shè)置
在成功設(shè)置硬件之后,現(xiàn)在是時(shí)候在編寫代碼之前設(shè)置軟件部分了。首先,需要完成 API 設(shè)置。為此,請(qǐng)?jiān)L問(wèn) URL:https ://www.cricapi.com/并注冊(cè)以創(chuàng)建一個(gè)新帳戶。我們也可以使用我們的 Google 帳戶登錄。
登錄您的 CricAPI 帳戶,每天最多可免費(fèi)獲得 100 次點(diǎn)擊。儀表板如下所示:
單擊“ Test CricAPI ”選項(xiàng)并轉(zhuǎn)到“ Cricket score ”選項(xiàng)。將出現(xiàn)一個(gè)窗口,如下所示,其中包含 URL 和示例輸出。復(fù)制 URL 以供我們將來(lái)參考。我在印度,我喜歡板球,所以我將其配置為顯示板球得分。如果您希望它為任何其他目的配置它,您可以通過(guò)稍微更改代碼來(lái)輕松完成。
基于 NodeMCU 和 IoT 的 Live Cricket Board 代碼
在本節(jié)中,我們將討論從 HTTP 網(wǎng)站獲取數(shù)據(jù)并將其顯示到 P10 顯示器所需的代碼,因?yàn)槲覀兪褂玫氖?NodeMCU 和 Arduino,因此這些將分為兩個(gè)部分。第一個(gè) Arduino 代碼配置 NodeMCU,第二個(gè)配置 Arduino Nano。
設(shè)置 NodeMCU 以上傳代碼:
如果您是第一次將代碼上傳到 nodeMCU,那么您必須先包含板,使用以下步驟。
要將代碼上傳到 NodeMCU,請(qǐng)按照以下步驟操作:
1.打開(kāi) Arduino IDE,然后轉(zhuǎn)到File–》Preferences–》Settings。
2.在 “Additional Board Manager URL ”字段中輸入https://arduino.esp8266.com/stable/package_esp8266com_index.json并單擊“Ok”。
3.現(xiàn)在,轉(zhuǎn)到工具 》 板 》 板管理器。在 Boards Manager 窗口中,在搜索框中鍵入ESP 8266,選擇最新版本的開(kāi)發(fā)板,然后單擊安裝。
4.安裝完成后,進(jìn)入Tools -》 Board -》 選擇NodeMCU 1.0(ESP-12E Module)。現(xiàn)在您可以使用 Arduino IDE 對(duì) NodeMCU 進(jìn)行編程。
完成上述步驟后,現(xiàn)在可以將代碼上傳到 NodeMCU,完整的代碼需要上傳到 NodeMCU。首先,所有必需的庫(kù)文件都將包含在代碼中。這里,在這個(gè)項(xiàng)目中,ESP8266WiFi.h和ESP8266HTTPClient.h用于使用 ESP8266 NodeMCU Wi-Fi 模塊,ArduinoJson.h用于使用 JSON 庫(kù),用于從 CricAPI 接收信息。
#include#include #include
現(xiàn)在,定義了網(wǎng)絡(luò)憑據(jù),即 SSID 和密碼。需要將 NodeMCU 連接到互聯(lián)網(wǎng)。
const char* ssid = "管理員"; const char* 密碼 = "123456789";
然后,為了將 nodeMCU 連接到互聯(lián)網(wǎng),調(diào)用 WiFi.begin并將 SSID 和密碼作為其參數(shù)。此外,使用波特率 = 115200 初始化串行通信。
Serial.begin(115200); WiiFi.begin(ssid,密碼);
在 loop() 內(nèi)部,傳遞我們之前記下的 API URL,以獲取實(shí)時(shí)板球比分。在http.begin() 函數(shù)中獲取信息。
http.begin("http://cricapi.com/api/cricketScore?apikey=rd0uOcJvvxUCbNlzlsGWyJt3gP53&unique_id=1254075");
現(xiàn)在,通過(guò)讀取并在串行監(jiān)視器上打印 JSON 數(shù)據(jù)來(lái)驗(yàn)證接收到的 JSON 文件。然后如果接收到的數(shù)據(jù)是正確的,將其打印在 Serial 上以將其發(fā)送到 Arduino。
int httpCode = http.GET(); if (httpCode > 0) { 字符串負(fù)載 = http.getString(); const size_t bufferSize = JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(8) + 370; DynamicJsonBuffer jsonBuffer(bufferSize); JsonObject& root = jsonBuffer.parseObject(http.getString()); const char* name1 = root["description"]; 序列號(hào).println(name1); 延遲(10000); }
代碼完成后,編譯代碼并上傳到NodeMCU。成功上傳后,現(xiàn)在是時(shí)候?yàn)?Arduino 編寫代碼了。
對(duì) Arduino Nano 進(jìn)行編程:
與 NodeMCU 類似,我們需要先對(duì) Arduino 進(jìn)行編程,然后才能繼續(xù)前進(jìn)并完成代碼。
對(duì)于 Arduino Nano,我們必須包含應(yīng)用程序中使用的所有庫(kù)。這里,代碼中使用了“DMD.h”庫(kù)和“TimerOne.h”,這兩個(gè)庫(kù)都可以通過(guò)下面給出的鏈接下載。
從 GitHub 下載 DMD.h 庫(kù)
從 GitHub 下載 TimerOne.h 庫(kù)
下載并包含這兩個(gè)庫(kù)后,通過(guò)包含所有必需的庫(kù)來(lái)啟動(dòng)代碼。
#include#include #include #include "SystemFont5x7.h" #include "Arial_black_16.h"
在下一步中,為 LED 矩陣定義行數(shù)和列數(shù)。這里本項(xiàng)目只用到了一個(gè)模塊,所以ROW值和COLUMN值都可以定義為1。
#define ROW 1 #define COLUMN 1 #define FONT Arial_Black_16 DMD led_module(ROW, COLUMN);
定義了一個(gè)函數(shù)scan_module(),它通過(guò) SPI 終端持續(xù)檢查來(lái)自 Arduino Nano 的任何傳入數(shù)據(jù)。如果是,那么它將觸發(fā)中斷以執(zhí)行用戶在程序中定義的某些事件。
無(wú)效 scan_module() { led_module.scanDisplayBySPI(); }
在setup()內(nèi)部,定時(shí)器被初始化,中斷被附加到函數(shù)scan_module,這在前面已經(jīng)討論過(guò)了。最初,使用函數(shù)clear screen(true) 清除屏幕,這意味著所有像素都定義為 OFF。
在這里,串行通信也啟用了串行功能。begin(115200)其中 115200 是串行通信的波特率。
無(wú)效設(shè)置() { Serial.begin(115200); Timer1.initialize(2000); Timer1.attachInterrupt(scan_module); led_module.clearScreen(真); }
在這里,檢查串行數(shù)據(jù)的可用性,是否有來(lái)自 nodeMCU 的有??效數(shù)據(jù)。接收到的數(shù)據(jù)存儲(chǔ)在一個(gè)變量中,然后打印在 p10 顯示器上。
無(wú)效循環(huán)() { 如果(Serial.available()) { 數(shù)據(jù)=Serial.readString(); } Serial.println(數(shù)據(jù)); (String("Score:")+String(data)).toCharArray(cstr1, 100); led_module.selectFont(字體);
然后,為了在模塊中顯示信息,使用selectFont()函數(shù)選擇字體。然后drawMarquee()函數(shù)用于在 p10 板上顯示所需的信息。
led_module.drawMarquee(cstr1,100, (32 * ROW), 0); 長(zhǎng)開(kāi)始 = 毫秒(); 長(zhǎng)時(shí)間的計(jì)時(shí)=開(kāi)始; 布爾標(biāo)志 = 假;
最后,由于我們需要滾動(dòng)消息顯示,我們編寫了一個(gè)代碼,使用一定的周期將整個(gè)消息從右向左移動(dòng)。
while (!flag) { if ((timming + 30) < millis()) { flag = led_module.stepMarquee(-1, 0); 計(jì)時(shí) = 毫秒(); } } }
節(jié)點(diǎn)單片機(jī)代碼:
#include
#include
#include
const char* ssid = "admin";
const char* 密碼 = "123456789";
整數(shù)計(jì)數(shù) = 0;
無(wú)效設(shè)置()
{
Serial.begin(115200);
WiFi.begin(ssid, 密碼);
而(WiFi.status()!= WL_CONNECTED)
{
延遲(1000);
}
}
void loop()
{
if (WiFi.status() == WL_CONNECTED)
{
HTTPClient http;
http.begin(" http://cricapi.com/api/cricketScore?apikey=rd0uOcJvvxUCbNlzlsGWyJt3gP53… ");
int httpCode = http.GET();
如果(http代碼>
{
字符串負(fù)載 = http.getString();
const size_t bufferSize = JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(3) + JSON_OBJECT_SIZE(5) + JSON_OBJECT_SIZE(8) + 370;
DynamicJsonBuffer jsonBuffer(bufferSize);
JsonObject& root = jsonBuffer.parseObject(http.getString());
const char* name1 = root["description"];
序列號(hào).println(name1);
延遲(10000);
}
http.end();
}
}
Arduino代碼:
#include
#include
#include
#include "SystemFont5x7.h"
#include "Arial_black_16.h"
#define ROW 1
#define COLUMN 1
#define FONT Arial_Black_16
字符輸入;
整數(shù)a = 0,b = 0;
整數(shù)標(biāo)志 = 0;
字符 cstr1;
DMD led_module(行,列);
字符串?dāng)?shù)據(jù)="";
無(wú)效 scan_module()
{
led_module.scanDisplayBySPI();
}
void setup()
{
Serial.begin(115200);
Timer1.initialize(2000);
Timer1.attachInterrupt(scan_module);
led_module.clearScreen(真);
}
無(wú)效循環(huán)()
{
if (Serial.available())
{
data=Serial.readString();
}
Serial.println(數(shù)據(jù));
(String("Score:")+String(data)).toCharArray(cstr1, 100);
led_module.selectFont(字體);
led_module.drawMarquee(cstr1,100, (32 * ROW), 0);
長(zhǎng)開(kāi)始 = 毫秒();
長(zhǎng)時(shí)間的計(jì)時(shí)=開(kāi)始;
布爾標(biāo)志 = 假;
while (!flag)
{
if ((timming + 30) < millis())
{
flag = led_module.stepMarquee(-1, 0);
計(jì)時(shí) = 毫秒();
}
}
}
-
顯示模塊
+關(guān)注
關(guān)注
1文章
50瀏覽量
23602 -
Arduino
+關(guān)注
關(guān)注
188文章
6477瀏覽量
187840 -
IOT
+關(guān)注
關(guān)注
187文章
4230瀏覽量
197630
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論