This tutorial is part of: 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 - 4 màu ngẫu nhiên
Đồng hồ Internet ESP32-S3 với màu RGB ngẫu nhiên
Dự án này là một Đồng hồ Internet ma trận RGB ESP32-S3 kết nối Wi-Fi, đồng bộ thời gian địa phương từ máy chủ NTP và cuộn thời gian ở định dạng HH:MM trên ma trận NeoMatrix RGB 8×8 tích hợp. Trong phiên bản này, giờ, dấu hai chấm và phút được hiển thị bằng màu ngẫu nhiên được chọn trong mỗi chu kỳ cuộn đầy đủ, tạo ra một màn hình đồng hồ động và vui nhộn liên tục thay đổi.

Cách hoạt động của đồng hồ này
Sau khi cấp nguồn cho bo mạch qua USB-C, 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 được chia thành ba phần—giờ, dấu hai chấm và phút—và mỗi phần được vẽ riêng biệt trên ma trận RGB. Khi văn bản cuộn hoàn toàn khỏi màn hình, các màu ngẫu nhiên mới sẽ được chọn cho lần chạy tiếp theo.
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ừ Arduino Library Manager. 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
Chân dữ liệu ma trận (ma trận RGB tích hợp)
Mặc dù ma trận RGB được tích hợp trên bo mạch, chân dữ liệu vẫn phải được định nghĩa trong mã:

#define MATRIX_PIN 14
GPIO 14 thường được sử dụng trên các bo mạch ma trận RGB ESP32-S3. Nếu biến thể bo mạch của bạn sử dụng chân khác, hãy cập nhật giá trị này cho phù hợp.
SSID và mật khẩu Wi-Fi (phân biệt chữ hoa/thường)
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 = "your WiFi SSID";
const char* WIFI_PASSWORD = "passW0rd";
Quan trọng: SSID Wi-Fi phân biệt chữ hoa/thường. SSID có tên "Book" không giống với "book". Nếu viết hoa không khớp chính xác, ESP32-S3 sẽ không kết nối được.
Máy chủ NTP, múi giờ và giờ mùa hè
Đồng bộ thời gian được thực hiện bằng máy chủ NTP internet:
const char* ntpServer = "pool.ntp.org";
Thời gian địa phương được tính bằng cách sử dụng UTC và độ lệch giờ mùa hè:
// Toronto-ish: UTC-5, cộng thêm 1 giờ DST
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;
gmtOffset_sec: Độ lệch UTC tính bằng giây (điều chỉnh theo vị trí của bạn)daylightOffset_sec: Sử dụng3600khi giờ mùa hè đang hoạt động hoặc0nếu không
Các cài đặt này được áp dụng bằng:
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Tự động điều chỉnh độ sáng ngày / đêm
Đồng hồ tự động điều chỉnh độ sá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;
const int NIGHT_END_HOUR = 6;
Từ 10 giờ tối đến 6 giờ sáng, màn hình giảm độ sáng để giảm chói trong môi trường tối. Trong giờ ban ngày, ma trận trở lại độ sáng bình thường.
Hành vi màu RGB ngẫu nhiên
Một danh sách màu RGB được xác định trước được lưu trong một mảng, trong đó mỗi màu được định nghĩa bằng các giá trị Đỏ, Xanh lục và Xanh lam từ 0 đến 255:
uint8_t userColors[][3] = {
{255, 0, 0}, // Đỏ
{0, 255, 0}, // Xanh lục
{0, 0, 255}, // Xanh lam
{255, 165, 0}, // Cam
{255, 0, 255}, // Đỏ tươi
{0, 255, 255}, // Xanh lơ
{255, 255, 0} // Vàng
};
Trong mỗi chu kỳ cuộn đầy đủ:
- Chữ số giờ được gán một màu ngẫu nhiên
- Dấu hai chấm nhận một màu ngẫu nhiên khác
- Chữ số phút nhận một màu ngẫu nhiên khác
Điều này tạo ra một sự kết hợp màu sắc liên tục thay đổi giúp đồng hồ trở nên thú vị về mặt thị giác. Để tạo màu tùy chỉnh của riêng bạn, bạn có thể sử dụng công cụ RGB Color Picker: RGB Color Picker.
Logic hiển thị thời gian
Thời gian được chia thành ba thành phần:
- Giờ:
HH - Dấu hai chấm:
: - Phút:
MM
Mỗi phần được vẽ riêng lẻ để có thể có màu riêng, trong khi tất cả các phần di chuyển cùng nhau để tạo thành một hoạt ảnh cuộn mượt mà trên màn hình 8×8.
Tạo màu ngẫu nhiên
Để đảm bảo tính ngẫu nhiên của màu sắc, bản phác thảo gieo trình tạo số ngẫu nhiên khi khởi động bằng một chân analog không kết nối:
randomSeed(analogRead(0));
Điều này đảm bảo rằng các kết hợp màu sắc khác nhau trong mỗi lần bật nguồn và mỗi chu kỳ cuộn.
Trình diễn
Sau khi tải bản phác thảo lên và cấp nguồn cho bo mạch qua USB-C:
- ESP32-S3 kết nối với mạng Wi-Fi của bạn
- Thời gian được đồng bộ từ internet
- Thời gian cuộn ở định dạng
HH:MM - Giờ, dấu hai chấm và phút thay đổi thành màu ngẫu nhiên mỗi chu kỳ
- Màn hình tự động giảm độ sáng vào ban đêm
Tải xuống và liên kết
完整的源代码在本文下方提供。有用的工具和参考资料在本文下方链接。
This tutorial is part of: 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 - 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
- ESP32-S3 RGB LED Matrix test for RGB, GRB setting
/*
* =====================================================================================
* ESP32-S3 INTERNET RGB CLOCK (8x8 Matrix) - Project 4- Random Color
* =====================================================================================
watch video https://youtube.com/shorts/4iWjLiD7fS8
📚⬇️ Download and resource page https://robojax.com/RJT843
* 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).
* =====================================================================================
*/
/*
* =====================================================================================
* ESP32-S3 INTERNET CLOCK - MULTI-COLOR ELEMENTS
* =====================================================================================
* Each part of the time (HH : MM) gets a different random color from your list.
* Colors only change once the full scroll cycle is finished.
* =====================================================================================
*/
#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define MATRIX_PIN 14
// --- CONFIGURATION ---
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;
uint8_t userColors[][3] = {
{255, 0, 0}, // Red
{0, 255, 0}, // Green
{0, 0, 255}, // Blue
{255, 165, 0}, // Orange
{255, 0, 255}, // Magenta
{0, 255, 255}, // Cyan
{255, 255, 0} // Yellow
};
int totalColors = sizeof(userColors) / sizeof(userColors[0]);
// Variables to store the current random color indices
int hourColorIdx = 0;
int colonColorIdx = 1;
int minColorIdx = 2;
// --- GLOBALS ---
Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800);
char hourText[3], minText[3];
int16_t scrollX = 8;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;
// 👇 REPLACE these with your real home WiFi name & password
const char* WIFI_SSID = "your WiFi SSID";
const char* WIFI_PASSWORD = "passW0rd";
// NTP (time) server
const char* ntpServer = "pool.ntp.org";
// Toronto-ish: UTC-5, plus 1 hour DST
const long gmtOffset_sec = -5 * 3600; // -5 hours
const int daylightOffset_sec = 3600; // +1 hour for DST
void updateTimeParts() {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) return;
snprintf(hourText, sizeof(hourText), "%02d", timeinfo.tm_hour);
snprintf(minText, sizeof(minText), "%02d", timeinfo.tm_min);
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);
int x = scrollX;
// 1. Draw Hours
matrix.setTextColor(matrix.Color(userColors[hourColorIdx][0], userColors[hourColorIdx][1], userColors[hourColorIdx][2]));
matrix.setCursor(x, 0);
matrix.print(hourText);
x += 12; // Move 12 pixels (2 digits * 6px)
// 2. Draw Colon
matrix.setTextColor(matrix.Color(userColors[colonColorIdx][0], userColors[colonColorIdx][1], userColors[colonColorIdx][2]));
matrix.setCursor(x, 0);
matrix.print(":");
x += 6; // Move 6 pixels
// 3. Draw Minutes
matrix.setTextColor(matrix.Color(userColors[minColorIdx][0], userColors[minColorIdx][1], userColors[minColorIdx][2]));
matrix.setCursor(x, 0);
matrix.print(minText);
matrix.show();
scrollX--;
// Total width is roughly 30 pixels (HH=12, :=6, MM=12)
if (scrollX < -30) {
scrollX = matrix.width();
// Pick NEW random colors for the next cycle
hourColorIdx = random(0, totalColors);
colonColorIdx = random(0, totalColors);
minColorIdx = random(0, totalColors);
}
}
void setup() {
Serial.begin(115200);
// Seed the random generator using an unconnected analog pin
randomSeed(analogRead(0));
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) delay(500);
// Configure time via NTP
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
Serial.println("Waiting for time...");
delay(2000); // small wait for initial sync
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(DAY_BRIGHTNESS);
}
void loop() {
if (millis() % 1000 == 0) updateTimeParts();
if (millis() - lastScrollMs >= scrollIntervalMs) {
lastScrollMs = millis();
scrollTime();
}
}
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