Tìm kiếm mã

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 - 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.

ESP32-s3_internet_clock_animation

Đồ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 LibraryAdafruit 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ụng 3600 cho giờ mùa hè hoặc 0 nế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ì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
869-ESP32-S3 RGB LED Matrix Internte Clock Project 2 - Multi Color with Date
Ngôn ngữ: C++
/*
 * =====================================================================================
 * 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

Tài nguyên & tài liệu tham khảo

Tập tin📁

Tập tin Fritzing