呢個教學係以下嘅一部分: ESP32-S3 RGB LED 点阵
这是一个很棒的项目,可以使用 ESP32-S3 RGB 矩阵模块进行创作,兼具趣味性和实用性。本文下方有其他相关视频的链接。
ESP32-S3 RGB LED矩陣網絡時鐘項目 - 2個時鐘多色時間及日期顯示
ESP32-S3 RGB NeoMatrix 網絡時鐘(含時間及日期顯示)
呢個項目係一個增強版嘅 ESP32-S3 RGB Matrix 網絡時鐘,除咗顯示當前時間之外,仲會定期顯示日期。ESP32-S3 會連接 Wi-Fi,從 NTP 伺服器同步時間,並喺 8×8 RGB NeoMatrix 上滾動顯示 HH:MM 或者日期(例如 SEP 21)。顯示屏支援自動日夜亮度控制同可自訂 RGB 顏色。

呢個時鐘做啲乜
連接到你嘅 Wi-Fi 網絡之後,ESP32-S3 會從互聯網攞當前本地時間。時鐘平時會滾動顯示時間,但每隔一段固定時間就會切換去顯示日期。文字顏色可以固定為一種顏色,或者自動循環顯示多種用戶定義嘅顏色。夜晚亮度會自動降低,令顯示屏冇咁刺眼。
用到嘅程式庫
呢個程式依賴以下程式庫:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
從 Arduino Library Manager 安裝 Adafruit NeoMatrix。所有需要嘅依賴程式庫,例如 Adafruit GFX Library 同 Adafruit NeoPixel,都會自動安裝。

重要嘅用戶設定
Wi-Fi SSID 同密碼(區分大小寫)
你必須將 Wi-Fi 憑證替換成你自己嘅網絡資料:

const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";
重要: Wi-Fi SSID 係區分大小寫嘅。例如,一個叫 "Book" 嘅 SSID 同 "book" 唔係一樣嘅。如果大細階唔完全相符,ESP32 就會連接失敗。
NTP 伺服器、時區同夏令時間
時鐘會用互聯網時間伺服器:
const char* ntpServer = "pool.ntp.org";
本地時間係用以下偏移量計算:
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
gmtOffset_sec:你嘅 UTC 偏移量(以秒計)(例子:UTC-5 =-5 * 3600)daylightOffset_sec:如果有夏令時間就用3600,如果冇用夏令時間就用0
呢啲設定會用以下方式套用:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
亮度控制(日 / 夜)
呢個項目會根據一日入面嘅時間自動調整亮度:
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;
喺夜晚 10 點到凌晨 6 點之間,亮度會降低,令顯示屏喺黑暗環境入面冇咁擾人。你可以按自己嘅喜好調整呢啲數值。
RGB 顏色設定
時鐘支援固定顏色模式同自動顏色循環。用戶定義嘅 RGB 顏色會儲存喺一個陣列入面:
uint8_t userColors[][3] = {
{17, 43, 171}, // 淺藍色
{255, 0, 0}, // 紅色
{0, 255, 0}, // 綠色
{255, 165, 0}, // 橙色
{255, 0, 255} // 洋紅色
};
每種顏色都用 RGB(紅、綠、藍)數值表示,範圍由 0 到 255。透過更改呢啲數字,你可以為顯示屏創造幾乎任何顏色。如果 useFixedColor 設為 true,時鐘就會一直用一種顏色。如果設為 false,顏色就會喺每次完整滾動之後自動改變。
如果想快速搵到任何你想要顏色嘅準確 RGB 數值,可以用 RGB 顏色揀色器工具 Color Picker 。
時間同日期格式
時間會格式化為 HH:MM,並儲存喺一個細嘅字元緩衝區入面。日期會格式化為大寫字串,例如 SEP 21。顯示屏會喺固定間隔自動喺時間同日期之間切換。
喺 8×8 顯示屏上嘅滾動邏輯
因為 8×8 矩陣太細,冇辦法一次過顯示晒全部文字,所以程式會水平滾動文字。當文字完全離開顯示屏之後,顏色就會更新,而且喺需要嘅時候內容會喺時間同日期之間切換。
示範
上載程式之後:
- ESP32 會連接 Wi-Fi
- 時間會從互聯網同步
- 當前時間會喺矩陣上滾動顯示
- 日期會定期出現
- 亮度會自動因應日同夜調整
下載同連結
完整原始碼喺呢篇文章下面提供。零件、工具同數據表嘅連結亦都喺呢篇文章下面提供。
呢個教學係以下嘅一部分: ESP32-S3 RGB LED 点阵
- ESP32-S3 RGB LED矩陣項目1-基本點
- ESP32-S3 RGB LED矩陣項目2 - 滾動文字
- ESP32-S3 RGB LED矩陣項目3 - 手機文字
- ESP32-S3 RGB LED矩陣項目 4 - 傾斜點
- ESP32-S3 RGB LED矩陣項目5 - 箭嘴永遠向上
- ESP32-S3 RGB LED矩陣項目6 - Cible遊戲
- ESP32-S3 RGB LED矩陣 Wi-Fi + NTP時鐘項目 -1 基本時鐘
- ESP32-S3 RGB LED矩陣互聯網時鐘項目 - 3種夜間顏色連日期
- ESP32-S3 RGB LED矩陣網絡時鐘項目 - 5 彩虹色
- ESP32-S3 RGB LED矩陣網絡時鐘項目 - 4種隨機顏色
- ESP32-S3 RGB LED Matrix test for RGB, GRB setting
/*
* =====================================================================================
* ESP32-S3 INTERNET RGB CLOCK (8x8 Matrix) - Project 2
Multi color
* =====================================================================================
watch video https://youtube.com/shorts/4iWjLiD7fS8
📚⬇️ Download and resource page https://robojax.com/RJT839
* Author: Ahmad Shamshiri (Robojax.com)
* Date: 07 Jan 2026
* * FEATURES:
* 1. WiFi/NTP Time: Syncs automatically with internet time servers.
* 2. Cycle-Based Color: Color changes ONLY when text finishes a full scroll.
* 3. Auto-Brightness: Dims the LEDs during night hours (User-configurable).
* 4. Periodic Date: Scrolls the date (e.g., "JAN 07") every 2 minutes.
* * USER CONFIGURATION GUIDE:
* -------------------------
* - WiFi: Change 'WIFI_SSID' and 'WIFI_PASSWORD' to your local network.
* - Colors: Add or remove {R, G, B} sets in the 'userColors' array.
* - Night Mode: Adjust 'NIGHT_START_HOUR' and 'NIGHT_BRIGHTNESS'.
* =====================================================================================
*/
#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define MATRIX_PIN 14
// --- BRIGHTNESS CONFIGURATION ---
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;
// --- COLOR CONFIGURATION ---
bool useFixedColor = false;
int fixedColorIndex = 0;
uint8_t userColors[][3] = {
{17, 43, 171}, // Light Blue
{255, 0, 0}, // Red
{0, 255, 0}, // Green
{255, 165, 0}, // Orange
{255, 0, 255} // Magenta
};
// 👇 REPLACE these with your real home WiFi name & password
const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";
int currentColorIndex = 0;
int totalColors = sizeof(userColors) / sizeof(userColors[0]);
// --- DATE/TIME INTERVALS ---
unsigned long lastDateShowMs = 0;
const uint32_t dateIntervalMs = 30000; // 2 minutes
unsigned long lastTimeUpdateMs = 0;
const uint16_t timeUpdateIntervalMs = 1000;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;
// --- GLOBAL VARIABLES ---
Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800);
char timeText[6] = "00:00";
char dateText[10] = "";
char currentDisplayText[12] = "";
int16_t scrollX = 8;
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
void updateTimeAndDate() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) return;
snprintf(timeText, sizeof(timeText), "%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min);
strftime(dateText, sizeof(dateText), "%b %d", &timeinfo);
for (int i = 0; dateText[i]; i++) dateText[i] = toupper(dateText[i]);
if (timeinfo.tm_hour >= NIGHT_START_HOUR || timeinfo.tm_hour < NIGHT_END_HOUR) {
matrix.setBrightness(NIGHT_BRIGHTNESS);
} else {
matrix.setBrightness(DAY_BRIGHTNESS);
}
}
void scrollDisplay() {
matrix.fillScreen(0);
// FIXED LOGIC: Uses currentColorIndex which only changes at the end of a scroll
int idx = useFixedColor ? fixedColorIndex : currentColorIndex;
matrix.setTextColor(matrix.Color(userColors[idx][0], userColors[idx][1], userColors[idx][2]));
matrix.setCursor(scrollX, 0);
matrix.print(currentDisplayText);
matrix.show();
scrollX--;
int16_t textWidth = strlen(currentDisplayText) * 6;
// THE TRIGGER POINT: This happens only when text is fully off-screen
if (scrollX < -textWidth) {
scrollX = matrix.width();
// 1. Cycle the color now and only now
if (!useFixedColor) {
currentColorIndex = (currentColorIndex + 1) % totalColors;
}
// 2. Decide whether to switch between Time and Date
if (millis() - lastDateShowMs > dateIntervalMs) {
strcpy(currentDisplayText, dateText);
lastDateShowMs = millis();
} else {
strcpy(currentDisplayText, timeText);
}
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(DAY_BRIGHTNESS);
updateTimeAndDate();
strcpy(currentDisplayText, timeText);
}
void loop() {
unsigned long now = millis();
if (now - lastTimeUpdateMs >= timeUpdateIntervalMs) {
lastTimeUpdateMs = now;
updateTimeAndDate();
}
if (now - lastScrollMs >= scrollIntervalMs) {
lastScrollMs = now;
scrollDisplay();
}
}
你可能需要嘅嘢
-
亞馬遜
-
易贝
-
阿里巴巴速卖通Purchase ESP32-S3 RGB matrix from AliExpresss.click.aliexpress.com
-
阿里巴巴速卖通Purchase ESP32-S3 RGB matrix from AliExpress (2)s.click.aliexpress.com
資源與參考資料
-
視頻
文件📁
Fritzing 文件
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB