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 Ma trận LED RGB ESP32-S3 2 - Văn bản cuộn
Dự án 2 – Cuộn chữ trên Ma trận LED RGB ESP32-S3
Trong dự án này, chúng ta biến Ma trận LED RGB ESP32-S3 thành một bảng chữ nhỏ. Một thông điệp ngắn (ví dụ Robojax) cuộn ngang qua màn hình RGB 8×8 và bạn có thể dễ dàng thay đổi văn bản, màu sắc, độ sáng và tốc độ cuộn trực tiếp trong mã. Điều này rất hữu ích cho các thông báo đơn giản, thẻ tên hoặc tin nhắn trạng thái nhỏ.
Tất cả sáu dự án trong loạt bài này được trình diễn và giải thích trong một video YouTube duy nhất. Video tương tự được nhúng trên trang này, vì vậy bạn có thể thấy chính xác cách cuộn chữ trông như thế nào trong thời gian thực và cách mỗi cài đặt ảnh hưởng đến hoạt ảnh. Mã hoàn chỉnh cho dự án này được tải tự động bên dưới bài viết và bạn có thể mua mô-đun Ma trận LED RGB ESP32-S3 từ các cửa hàng liên kết được liệt kê trong phần mã.
Dự án này xây dựng dựa trên những kiến thức cơ bản của Dự án 1 (chấm di chuyển và điều khiển màu sắc) và thêm khả năng hiển thị văn bản và cuộn bằng thư viện NeoMatrix.


Tổng quan về Mô-đun Ma trận LED RGB ESP32-S3
Phần cứng giống nhau cho cả sáu dự án: vi điều khiển ESP32-S3 với Wi-Fi và Bluetooth, ma trận LED RGB 8×8 (64 đèn LED RGB có thể định địa chỉ), gia tốc kế QMI8658C, cổng USB và các chân IO có thể truy cập.:contentReference[oaicite:0]{index=0}

- ESP32-S3 – CPU chính với Wi-Fi/BLE cho các dự án nâng cao.
- Ma trận RGB 8×8 – 64 đèn LED RGB cho biểu tượng, văn bản và hoạt ảnh.
- Gia tốc kế QMI8658C – được sử dụng trong các dự án sau cho độ nghiêng và hướng.
- Cổng USB – được sử dụng để cấp nguồn và lập trình qua Arduino IDE.
- Các chân tiếp xúc – cho phép bạn sử dụng bo mạch như một ESP32 thông thường cho các IO khác.
- Nút Boot / Reset – để tải firmware và khởi động lại sketch.
Trong Dự án 2, chúng tôi chủ yếu tập trung vào ma trận và các chức năng văn bản NeoMatrix. Gia tốc kế chưa được sử dụng, nhưng cùng một bo mạch sẽ xử lý tất cả các dự án tương tác và trò chơi sau này.

Các dự án được trình bày trong video (Dấu thời gian)
Video đi kèm với bài viết này bao gồm tất cả sáu dự án. Các dấu thời gian gần đúng là:
- 00:00 – Giới thiệu
- 02:01 – Cài đặt bo mạch ESP32
- 03:32 – Cài đặt thư viện
- 05:32 – Dự án 1: Chấm di chuyển
- 11:11 – Dự án 2: Cuộn chữ
- 12:59 – Dự án 3: Văn bản HTTP
- 16:41 – Dự án 4: Chấm nghiêng
- 18:55 – Dự án 5: Mũi tên lên
- 20:02 – Dự án 6: Trò chơi bắn mục tiêu
Bạn nên xem video trong khi đọc bài viết này. Video cho thấy văn bản cuộn trực tiếp trên ma trận LED và hướng dẫn từng bước trong Arduino IDE.
Cài đặt bo mạch ESP32 trong Arduino IDE
Trước khi chạy mã cuộn chữ, hãy đảm bảo hỗ trợ ESP32 đã được cài đặt trong Arduino IDE của bạn:
- Mở
File > Preferencesvà thêm URL bo mạch ESP32 vào “Additional Boards Manager URLs”. - Đi tới
Tools > Board > Boards Manager…, tìm kiếmESP32và cài đặt gói ESP32 chính thức. - Chọn bo mạch Ma trận LED RGB ESP32-S3 của bạn từ
Tools > Board. - Kết nối mô-đun qua USB và chọn cổng COM/serial chính xác trong
Tools > Port.
Nếu loại bo mạch hoặc cổng không chính xác, sketch sẽ không tải lên được.
Cài đặt NeoMatrix và các thư viện cần thiết
Cuộn chữ được triển khai bằng Adafruit NeoMatrix và các phần phụ thuộc của nó. Trong video, chúng được cài đặt qua Library Manager.
Bạn sẽ cần:
Adafruit NeoMatrixAdafruit NeoPixelAdafruit GFX Library
- Mở
Sketch > Include Library > Manage Libraries…. - Tìm kiếm
Adafruit NeoMatrixvà nhấp vào Install. - Khi được nhắc, cho phép cài đặt
Adafruit GFXvàAdafruit NeoPixellàm phần phụ thuộc.
Nếu cài đặt thành công, bạn sẽ thấy các sketch ví dụ trong File > Examples > Adafruit NeoMatrix và File > Examples > Adafruit NeoPixel.
Dự án 2 – Cài đặt mã (Cuộn chữ)
Sketch cuộn chữ đầy đủ được tải tự động bên dưới bài viết này trên trang web. Ở đây chúng tôi chỉ tập trung vào các giá trị cấu hình mà bạn có thể muốn chỉnh sửa: chân, kích thước ma trận, độ sáng, chuỗi văn bản, màu sắc, tốc độ cuộn và hướng tùy chọn.
Tất cả các đoạn mã dưới đây được lấy từ phần cấu hình ở đầu sketch để bạn có thể nhanh chóng điều chỉnh hành vi mà không cần chạm vào logic chính.
Chân và kích thước ma trận
Giống như Dự án 1, ma trận RGB được kết nối với GPIO 14 và chứa 64 đèn LED (8×8). Đảm bảo hai dòng này khớp với mô-đun của bạn:
// Chân kết nối với ma trận RGB 8×8
const int MATRIX_PIN = 14; // phải là 14 trên mô-đun này // Kích thước ma trận (chiều rộng và chiều cao)
const int MATRIX_WIDTH = 8;
const int MATRIX_HEIGHT = 8;
Nếu bạn sao chép một ví dụ từ thư viện NeoMatrix, nó có thể sử dụng chân hoặc kích thước khác; luôn thay đổi chúng để khớp với bo mạch này.
Độ sáng của văn bản
Độ sáng thường được điều khiển bằng giá trị từ 0 đến 255, trong đó 0 là tắt và 255 là độ sáng tối đa. Một giá trị vừa phải thường là đủ:
// Độ sáng tổng thể của ma trận (0–255)
uint8_t matrixBrightness = 40; // độ sáng trong nhà thoải mái // Trong
setup():
matrix.setBrightness(matrixBrightness);
Nếu bạn sử dụng bảng trong môi trường sáng hoặc trong thời gian ngắn, bạn có thể tăng giá trị này, nhưng tránh tăng quá cao nếu bạn ở gần màn hình.
Văn bản cuộn
Thông điệp thực tế được lưu dưới dạng chuỗi. Trong video, văn bản ví dụ là Robojax. Bạn có thể thay đổi nó thành bất kỳ nhãn hoặc thông điệp ngắn nào bạn muốn:
// Văn bản để cuộn trên ma trận 8×8 const char scrollText[] = "Robojax";
// thay đổi cái này thành thông điệp của bạn
Hãy nhớ rằng đây chỉ là ma trận 8×8, vì vậy các thông điệp rất dài sẽ mất nhiều thời gian hơn để cuộn và có thể khó đọc.
Màu văn bản (Giá trị RGB)
Màu của văn bản cuộn được đặt bởi các thành phần đỏ, lục và lam (0–255). Ví dụ, màu đỏ thuần là (255, 0, 0), màu lục thuần là (0, 255, 0), và màu lam thuần là (0, 0, 255). Trong bản phác thảo, bạn sẽ thấy một cái gì đó như:
// Màu văn bản (R, G, B) uint8_t textRed = 255; // thành phần đỏ uint8_t textGreen = 0; // thành phần lục uint8_t textBlue = 0; // thành phần lam
Để thay đổi màu:
- Vàng:
textRed = 255; textGreen = 255; textBlue = 0; - Xanh lơ:
textRed = 0; textGreen = 255; textBlue = 255; - Trắng:
textRed = 255; textGreen = 255; textBlue = 255;
Video cũng trình bày cách sử dụng công cụ chọn màu trực tuyến để tìm giá trị RGB và sau đó nhập chúng vào mã.:contentReference[oaicite:1]{index=1}
Tốc độ cuộn (Độ trễ giữa các khung hình)
Tốc độ cuộn được điều khiển bởi giá trị độ trễ tính bằng mili giây giữa mỗi bước cập nhật. Giá trị nhỏ hơn làm văn bản di chuyển nhanh hơn; giá trị lớn hơn làm chậm lại. Trong bản phác thảo, bạn nên tìm một biến như:
// Độ trễ giữa các bước cuộn (tính bằng mili giây) int scrollDelayMs = 50;
// nhỏ hơn = nhanh hơn, lớn hơn = chậm hơn
Ví dụ:
scrollDelayMs = 20;→ cuộn nhanh.scrollDelayMs = 50;→ tốc độ trung bình (tương tự như video).scrollDelayMs = 100;hoặc nhiều hơn → cuộn chậm, dễ đọc.
Bên trong loop(), giá trị này được sử dụng trong lệnh gọi delay(scrollDelayMs); sau mỗi lần vẽ lại vị trí văn bản.
Hướng cuộn (Tùy chọn)
Trong dự án “cuộn văn bản cơ bản”, chúng ta thường cuộn sang trái, nhưng việc xác định một biến hướng tượng trưng là hữu ích để bạn có thể thử nghiệm với các hướng khác sau này (trái, phải, lên, xuống).
Một mẫu phổ biến là:
// Bộ chọn hướng cuộn // 0 = trái, 1 = phải, 2 = lên, 3 = xuống
int scrollDirection = 0; // mặc định: cuộn sang trái
Vòng lặp chính sau đó kiểm tra scrollDirection và di chuyển văn bản theo hướng đã chọn. Đối với Dự án 2, bạn có thể để nó ở 0 (trái), nhưng nếu bạn mở rộng bản phác thảo sau này, bạn có thể thêm các điều kiện như:
if (scrollDirection == 0) {
// di chuyển văn bản sang trái
} else if (scrollDirection == 1) {
// di chuyển văn bản sang phải
} else if (scrollDirection == 2) {
// di chuyển văn bản lên
} else if (scrollDirection == 3) {
// di chuyển văn bản xuống
}
Đối với bài viết này, chúng tôi chỉ ghi lại cài đặt. Việc triển khai đầy đủ là một phần của mã được tải bên dưới bài viết.
Tóm tắt
Dự án 2 biến ESP32-S3 RGB LED Matrix của bạn thành một màn hình hiển thị văn bản đơn giản nhưng bắt mắt. Bằng cách chỉnh sửa một vài biến ở đầu mã, bạn có thể nhanh chóng thay đổi:
- Thông điệp nào được hiển thị (
scrollText). - Màu của văn bản (
textRed,textGreen,textBlue). - Độ sáng của ma trận (
matrixBrightness). - Tốc độ cuộn (
scrollDelayMs). - Hướng cuộn (
scrollDirection, nếu bạn chọn sử dụng nó).
Bản phác thảo đầy đủ cho dự án này có sẵn bên dưới bài viết này (được tải tự động bởi trang web). Để biết cấu hình chi tiết từng bước và trình diễn trực tiếp về văn bản cuộn hoạt động, hãy đảm bảo xem phần tương ứng của video. Nếu bạn thích dự án này và muốn tự xây dựng nó, bạn cũng có thể mua mô-đun ESP32-S3 RGB LED Matrix từ các liên kết liên kết được liệt kê bên dưới mã.
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 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
- 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
/*
Project 2: Text scroll – ESP32-S3 RGB LED Matrix (Waveshare)
This sketch displays the scrolling text on 8x8 matrix
▶️ Video Tutorial:
https://youtu.be/JKLuYrRcLMI
📚⬇️ Resources & Code Page:
https://robojax.com/RJT829
QMI8658_RGB_2
*/
#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
// -------- LED MATRIX SETUP --------
#define MATRIX_PIN 14
#define MATRIX_WIDTH 8
#define MATRIX_HEIGHT 8
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(
MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_PROGRESSIVE,
NEO_RGB + NEO_KHZ800
);
// =========================
// USER SETTINGS
// =========================
// Text to scroll
const char* MESSAGE = "ROBOJAX ";
// Brightness (0–255)
uint8_t BRIGHTNESS = 10;
// Scroll speed (milliseconds between steps)
// Smaller = faster
uint16_t SCROLL_DELAY = 80;
// Scroll direction
enum ScrollDir {
SCROLL_LEFT,
SCROLL_RIGHT,
SCROLL_UP,
SCROLL_DOWN
};
// Change this to set direction
ScrollDir DIRECTION = SCROLL_LEFT;
// Text color (set RGB here)
uint8_t COLOR_R = 255;
uint8_t COLOR_G = 0;
uint8_t COLOR_B = 0;
// =========================
// INTERNAL STATE
// =========================
uint16_t textColor;
int16_t posX, posY;
int16_t textWidth, textHeight;
uint32_t lastStepTime = 0;
// Compute text size in pixels for default 5x7 font
void computeTextSize() {
int16_t x1, y1;
uint16_t w, h;
matrix.getTextBounds((char*)MESSAGE, 0, 0, &x1, &y1, &w, &h);
textWidth = (int16_t)w;
textHeight = (int16_t)h;
}
// Initialize starting position based on direction
void resetScrollPosition() {
switch (DIRECTION) {
case SCROLL_LEFT:
// Start just off the right edge
posX = matrix.width();
posY = 0; // top row for 8x8
break;
case SCROLL_RIGHT:
// Start just off the left edge
posX = -textWidth;
posY = 0;
break;
case SCROLL_UP:
posX = 0;
posY = matrix.height(); // start below bottom
break;
case SCROLL_DOWN:
posX = 0;
posY = -textHeight; // start above top
break;
}
}
// One scroll step
void stepScroll() {
// Move position
switch (DIRECTION) {
case SCROLL_LEFT:
posX--;
if (posX < -textWidth) {
posX = matrix.width();
}
break;
case SCROLL_RIGHT:
posX++;
if (posX > matrix.width()) {
posX = -textWidth;
}
break;
case SCROLL_UP:
posY--;
if (posY < -textHeight) {
posY = matrix.height();
}
break;
case SCROLL_DOWN:
posY++;
if (posY > matrix.height()) {
posY = -textHeight;
}
break;
}
// Draw frame
matrix.fillScreen(0);
matrix.setCursor(posX, posY);
matrix.print(MESSAGE);
matrix.show();
}
void setup() {
matrix.begin();
matrix.setBrightness(BRIGHTNESS);
matrix.setTextWrap(false); // No automatic wrapping
matrix.setTextSize(1); // Default 5x7 font
textColor = matrix.Color(COLOR_R, COLOR_G, COLOR_B);
matrix.setTextColor(textColor);
computeTextSize();
resetScrollPosition();
matrix.fillScreen(0);
matrix.show();
}
void loop() {
uint32_t now = millis();
if (now - lastStepTime >= SCROLL_DELAY) {
lastStepTime = now;
stepScroll();
}
}
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
-
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