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