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 - 3 Màu Ban Đêm kèm Ngày
Đồng hồ Internet RGB NeoMatrix ESP32-S3 với Độ sáng Tự động Ngày/Đêm
Dự án này là một Đồng hồ Internet Ma trận RGB ESP32-S3 tự động điều chỉnh độ sáng vào ban ngày và ban đêm. ESP32-S3 kết nối Wi-Fi, đồng bộ thời gian hiện tại từ máy chủ NTP và cuộn thời gian ở định dạng HH:MM trên màn hình RGB NeoMatrix 8×8. Đồng hồ cũng hỗ trợ màu RGB cố định hoặc thay đổi theo chu kỳ cho văn bản hiển thị.

Đồng hồ này làm gì
Sau khi khởi động, ESP32-S3 kết nối với mạng Wi-Fi của bạn và lấy thời gian địa phương hiện tại từ internet. Thời gian cuộn mượt mà trên ma trận LED. Vào ban đêm, màn hình tự động giảm độ sáng xuống mức thấp hơn, trong khi ban ngày nó chuyển lại mức sáng hơn.
Các thư viện được sử dụng
Bản phác thảo này sử dụng 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ừ Trình quản lý thư viện Arduino. 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 quan trọng cho người dùng
SSID và mật khẩu Wi-Fi (phân biệt chữ hoa/thường)
Thay thế các giá trị sau bằng thông tin đăng nhập Wi-Fi của 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. SSID tên "Book" không giống với "book". Nếu chữ hoa/thường 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ồ đồng bộ thời gian bằng máy chủ NTP sau:
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_secxác định độ lệch UTC của bạn tính bằng giâydaylightOffset_secthêm một giờ khi giờ mùa hè đang hoạt động (dùng0nếu không cần)
Các giá trị này được áp dụng bằng:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Độ sáng tự động ngày/đêm
Độ sáng màn hình thay đổi tự động dựa trên giờ hiện tại:
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22; // 10 giờ tối
const int NIGHT_END_HOUR = 6; // 6 giờ sáng
Từ 10 giờ tối đến 6 giờ sáng, độ sáng ma trận được giảm xuống để thoải mái trong môi trường tối. Ngoài khoảng thời gian đó, độ sáng ban ngày đầy đủ được khôi phục. Bạn có thể điều chỉnh các giá trị này để phù hợp với ánh sáng phòng của mình.
Cấu hình màu RGB
Màu văn bản đồng hồ được xác định bằng giá trị RGB (Đỏ, Xanh lá, Xanh dương), trong đó mỗi kênh dao động từ 0 đến 255. Nhiều màu có thể được lưu trong một mảng và tự động thay đổi theo chu kỳ:
uint8_t userColors[][3] = {
{17, 43, 171}, // Xanh dương nhạt
{255, 0, 0}, // Đỏ
{0, 255, 0}, // Xanh lá
{255, 165, 0}, // Cam
{255, 0, 255} // Hồng sẫm
};
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 đầy đủ thời gian.
Để nhanh chóng tìm giá trị RGB chính xác cho bất kỳ màu nào, hãy sử dụng công cụ Chọn màu RGB: Chọn màu .
Hiển thị thời gian và cuộn
Thời gian hiện tại được định dạng là HH:MM và lưu trong một bộ đệm ký tự nhỏ. Vì màn hình chỉ rộng 8 pixel, văn bản cuộn mượt mà từ phải sang trái. Khi thời gian hoàn toàn rời khỏi màn hình, màu tiếp theo (nếu được bật) sẽ được chọn cho lần chạy tiếp theo.
Trình diễn
Sau khi tải bản phác thảo lên:
- ESP32-S3 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 RGB
- Độ sáng tự động thay đổi giữa ngày và đêm
- Màu văn bản giữ cố định hoặc thay đổi theo chu kỳ dựa trên cài đặt của bạn
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 linh kiện, công cụ và bảng dữ liệu 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 - Hiển thị Thời gian & Ngày tháng 2 Đồng hồ đa màu sắc
- 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 3- Night color with Date
* =====================================================================================
watch video https://youtube.com/shorts/4iWjLiD7fS8
📚⬇️ Download and resource page https://robojax.com/RJT840
* Author: Gemini (AI Thought Partner) & 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 after the time finishes a full scroll.
* 3. Auto-Brightness: Dims the LEDs during night hours (User-configurable).
* =====================================================================================
*/
#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; // 10 PM
const int NIGHT_END_HOUR = 6; // 6 AM
// --- 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]);
// --- INTERVALS ---
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";
int16_t scrollX = 8;
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
void updateTimeText() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) return;
// Format HH:MM
snprintf(timeText, sizeof(timeText), "%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min);
// Apply Auto-Brightness
if (timeinfo.tm_hour >= NIGHT_START_HOUR || timeinfo.tm_hour < NIGHT_END_HOUR) {
matrix.setBrightness(NIGHT_BRIGHTNESS);
} else {
matrix.setBrightness(DAY_BRIGHTNESS);
}
}
void scrollTime() {
matrix.fillScreen(0);
// Pick the color (Fixed or Cycle)
int idx = useFixedColor ? fixedColorIndex : currentColorIndex;
matrix.setTextColor(matrix.Color(userColors[idx][0], userColors[idx][1], userColors[idx][2]));
matrix.setCursor(scrollX, 0);
matrix.print(timeText);
matrix.show();
scrollX--;
// Width for "HH:MM" is roughly 30 pixels
int16_t textWidth = 30;
// TRIGGER: When time is fully off-screen
if (scrollX < -textWidth) {
scrollX = matrix.width(); // Reset position to right side
// Cycle to the next color in the array for the next pass
if (!useFixedColor) {
currentColorIndex = (currentColorIndex + 1) % totalColors;
Serial.print("Next cycle color index: ");
Serial.println(currentColorIndex);
}
}
}
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);
updateTimeText();
}
void loop() {
unsigned long now = millis();
// Update time digits and brightness once per second
if (now - lastTimeUpdateMs >= timeUpdateIntervalMs) {
lastTimeUpdateMs = now;
updateTimeText();
}
// Handle the scrolling animation
if (now - lastScrollMs >= scrollIntervalMs) {
lastScrollMs = now;
scrollTime();
}
}
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
-
Nội bộ🎨 Color picker Toolrobojax.com
Tập tin📁
Tập tin Fritzing
-
esp32-S3-supermini-tht fritzing part
esp32-S3-supermini-tht.fzpz0.02 MB