Hướng dẫn này là một phần của: Ma trận LED RGB ESP32-S3
Đây là một dự án thú vị và hữu ích sử dụng module ma trận RGB ESP32-S3. Các liên kết đến các video khác được cung cấp bên dưới bài viết này.
Dự án Đồng hồ Internet Ma trận LED RGB ESP32-S3 - Hiển thị Thời gian & Ngày tháng 2 Đồng hồ đa màu sắc
Đồng hồ Internet NeoMatrix RGB ESP32-S3 hiển thị giờ & ngày
Dự án này là một đồng hồ Internet Ma trận RGB ESP32-S3 nâng cao, không chỉ hiển thị thời gian hiện tại mà còn định kỳ hiển thị ngày. ESP32-S3 kết nối Wi-Fi, đồng bộ thời gian từ máy chủ NTP và cuộn HH:MM hoặc ngày (ví dụ SEP 21) trên NeoMatrix RGB 8×8. Màn hình hỗ trợ điều khiển độ sáng tự động ngày/đêm và màu RGB tùy chỉnh.

Đồng hồ này làm gì
Sau khi kết nối với mạng Wi-Fi của bạn, ESP32-S3 lấy thời gian địa phương hiện tại từ internet. Đồng hồ thường cuộn thời gian, nhưng ở một khoảng thời gian cố định, nó chuyển sang hiển thị ngày. Màu chữ có thể được cố định ở một màu hoặc tự động thay đổi qua nhiều màu do người dùng xác định. Độ sáng tự động giảm vào ban đêm để màn hình dễ nhìn hơn.
Các thư viện được sử dụng
Bản phác thảo này phụ thuộc vào các thư viện sau:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
Cài đặt Adafruit NeoMatrix từ Arduino Library Manager. Tất cả các phụ thuộc cần thiết như Adafruit GFX Library và Adafruit NeoPixel sẽ được cài đặt tự động.

Cấu hình người dùng quan trọng
SSID và mật khẩu Wi-Fi (phân biệt chữ hoa/thường)
Bạn phải thay thế thông tin đăng nhập Wi-Fi bằng thông tin mạng của riêng bạn:

const char* WIFI_SSID = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";
Quan trọng: SSID Wi-Fi phân biệt chữ hoa/thường. Ví dụ: SSID tên "Book" không giống với "book". Nếu chữ hoa không khớp chính xác, ESP32 sẽ không kết nối được.
Máy chủ NTP, múi giờ và giờ mùa hè
Đồng hồ sử dụng máy chủ thời gian internet:
const char* ntpServer = "pool.ntp.org";
Thời gian địa phương được tính bằng các độ lệch sau:
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
gmtOffset_sec: Độ lệch UTC của bạn tính bằng giây (ví dụ: UTC-5 =-5 * 3600)daylightOffset_sec: Sử dụng3600cho giờ mùa hè hoặc0nếu không sử dụng giờ mùa hè
Các cài đặt này được áp dụng bằng:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Điều khiển độ sáng (ngày / đêm)
Dự án này tự động điều chỉnh độ sáng dựa trên giờ trong ngày:
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;
Giữa 10 giờ tối và 6 giờ sáng, độ sáng được giảm để màn hình ít gây mất tập trung trong môi trường tối. Bạn có thể điều chỉnh các giá trị này theo sở thích của mình.
Cấu hình màu RGB
Đồng hồ hỗ trợ cả chế độ màu cố định và tự động thay đổi màu. Màu RGB do người dùng xác định được lưu trong một mảng:
uint8_t userColors[][3] = {
{17, 43, 171}, // Xanh nhạt
{255, 0, 0}, // Đỏ
{0, 255, 0}, // Xanh lá
{255, 165, 0}, // Cam
{255, 0, 255} // Tím
};
Mỗi màu sử dụng giá trị RGB (Đỏ, Xanh lá, Xanh dương) từ 0 đến 255. Bằng cách thay đổi các số này, bạn có thể tạo hầu như bất kỳ màu nào cho màn hình. Nếu useFixedColor được đặt thành true, đồng hồ luôn sử dụng một màu. Nếu đặt thành false, màu tự động thay đổi sau mỗi lần cuộn hoàn tất.
Để nhanh chóng tìm giá trị RGB chính xác cho bất kỳ màu nào bạn muốn, hãy sử dụng công cụ RGB Color Picker Color Picker .
Định dạng giờ và ngày
Thời gian được định dạng là HH:MM và được lưu trong một bộ đệm ký tự nhỏ. Ngày được định dạng là chuỗi chữ hoa như SEP 21. Màn hình tự động chuyển đổi giữa giờ và ngày ở một khoảng thời gian cố định.
Logic cuộn trên màn hình 8×8
Vì ma trận 8×8 quá nhỏ để hiển thị toàn bộ văn bản cùng lúc, bản phác thảo cuộn văn bản theo chiều ngang. Khi văn bản hoàn toàn rời khỏi màn hình, màu được cập nhật và nội dung chuyển đổi giữa giờ và ngày khi cần.
Trình diễn
Sau khi tải bản phác thảo lên:
- ESP32 kết nối Wi-Fi
- Thời gian được đồng bộ từ internet
- Thời gian hiện tại cuộn trên ma trận
- Ngày xuất hiện định kỳ
- Độ sáng tự động điều chỉnh cho ngày và đêm
Tải xuống và liên kết
Mã nguồn hoàn chỉnh được cung cấp bên dưới bài viết này. Liên kết đến các bộ phận, công cụ và bảng dữ liệu cũng có sẵn bên dưới bài viết này.
Hướng dẫn này là một phần của: Ma trận LED RGB ESP32-S3
- Dự án Ma trận LED RGB ESP32-S3 1- Chấm cơ bản
- Dự án Ma trận LED RGB ESP32-S3 2 - Văn bản cuộn
- Dự án ma trận LED RGB ESP32-S3 3 - Văn bản từ điện thoại di động
- Dự án Ma trận LED RGB ESP32-S3 4 - Chấm nghiêng
- Dự án Ma trận LED RGB ESP32-S3 5 - Mũi tên luôn hướng lên
- Dự án Ma trận LED RGB ESP32-S3 6 - Trò chơi Cible
- Dự án Đồng hồ thời gian Wi-Fi + NTP sử dụng ma trận LED RGB ESP32-S3 - 1 Đồng hồ cơ bản
- Dự án Đồng hồ Internet Ma trận LED RGB ESP32-S3 - 3 Màu Ban Đêm kèm Ngày
- Dự án Đồng hồ Internet Ma trận LED RGB ESP32-S3 - 5 Màu cầu vồng
- Dự án Đồng hồ Internet Ma trận LED RGB ESP32-S3 - 4 màu ngẫu nhiên
- 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();
}
}
Nghĩ bạn có thể cần
-
Amazon
-
eBay
-
AliExpressPurchase ESP32-S3 RGB matrix from AliExpresss.click.aliexpress.com
-
AliExpressPurchase ESP32-S3 RGB matrix from AliExpress (2)s.click.aliexpress.com
Tài nguyên & tài liệu tham khảo
-
Video
Tập tin📁
Tập tin Fritzing
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB