Search Code

Dự án Đồng hồ Internet Ma trận LED RGB ESP32-S3 - 4 màu ngẫu nhiên

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.

ESP32-s3_internet_clock_animation

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 LibraryAdafruit 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ụng 3600 khi giờ mùa hè đang hoạt động hoặc 0 nế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

完整的源代码在本文下方提供。有用的工具和参考资料在本文下方链接。

Hình ảnh

ESP32 S3 Matrix
ESP32 S3 Matrix
ESP32 S3 Matrix  pin out
ESP32 S3 Matrix pin out
ESP32-S3_RGB_8x8_matrix-3
ESP32-S3_RGB_8x8_matrix-3
ESP32-S3_RGB_8x8_matrix1
ESP32-S3_RGB_8x8_matrix1
ESP32-S3_RGB_8x8_matrix-2
ESP32-S3_RGB_8x8_matrix-2
ESP32-s3_internet_clock_animation
ESP32-s3_internet_clock_animation
873-ESP32-S3 RGB LED Matrix Internte Clock Project 4 - Random Color
Ngôn ngữ: C++
/*
 * =====================================================================================
 * 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

Tập tin📁

Tập tin Fritzing