arduino R4 WiFi 开发板自带 WiFi 连接模块,同时带有 8×12 LED 显示矩阵。本实验开发了一个能通过WiFi连接网络,获取NTP时间,然后在LED矩阵上滚动显示的功能。
什么是 NTP 时间
NTP(Network Time Protocol,网络时间协议)是一种用于同步网络中计算机时钟的互联网协议。它的目的是使所有参与的计算机时钟与协调世界时(UTC)保持同步,误差通常在几毫秒以内。NTP 是目前仍在使用的最古老的互联网协议之一,自 1985 年以来一直在运行。
依赖的库
#include "WiFiS3.h"
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
#include "WiFiUdp.h"
#include "NTPClient.h"
基于Arduino_LED_Matrix.h 控制 LED 矩阵的显示,利用ArduinoGraphics.h 进行字符的循环显示。注意,ArduinoGraphics.h
必须在Arduino_LED_Matrix.h
之前导入,否则无法正确引入 beginDraw
函数。
新建secret_key.h用来保存WiFi账号和密码
#define SECRET_SSID "WiFi名称"
#define SECRET_PASS "WiFi密码"
完整代码
#include "WiFiS3.h"
#include "secret_key.h"
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
#include "WiFiUdp.h"
#include "NTPClient.h"
char ssid[] = SECRET_SSID;
char pass[] = SECRET_PASS;
// NTP 服务器配置
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 8 * 3600, 60000); // 东八区,北京时间
//定义一个LED点阵对象
ArduinoLEDMatrix matrix;
void setup(){
Serial.begin(115200);
delay(1000);
Serial.println("Connecting to WiFi");
WiFi.begin(ssid, pass);
while(WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("Connected to WiFi");
Serial.println("IP Address: ");
Serial.println(WiFi.localIP());
//显示一个字符串
matrix.begin();
matrix.beginDraw();
matrix.stroke(0xFFFFFFFF);
const char text[] = "UNO R4";
matrix.textFont(Font_4x6);
matrix.beginText(0,1,0xFFFFFF);
matrix.println(text);
matrix.endText();
matrix.endDraw();
delay(2000);
//启用时间客户端
timeClient.begin();
}
void loop(){
timeClient.update();
time_t now = timeClient.getEpochTime();
// 格式化时间字符串
struct tm *timeinfo;
timeinfo = localtime(&now);
char timeStr[30];
sprintf(timeStr, "%04d-%02d-%02d %02d:%02d:%02d",
timeinfo->tm_year + 1900, // 年
timeinfo->tm_mon + 1, // 月
timeinfo->tm_mday, // 日
timeinfo->tm_hour, // 时
timeinfo->tm_min, // 分
timeinfo->tm_sec); // 秒
matrix.beginDraw();
matrix.stroke(0xFFFFFFFF);
matrix.textScrollSpeed(100);
matrix.textFont(Font_4x6);
matrix.beginText(0,1,0xFFFFFF);
matrix.println(timeStr);
matrix.endText(SCROLL_LEFT);
matrix.endDraw();
delay(1000);
}