Tìm kiếm mã

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

Hoạt ảnh đồng hồ internet ESP32-s3

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 LibraryAdafruit 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_sec xác định độ lệch UTC của bạn tính bằng giây
  • daylightOffset_sec thêm một giờ khi giờ mùa hè đang hoạt động (dùng 0 nế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ì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
870-ESP32-S3 RGB LED Matrix Internte Clock Project 3 - Night Color with Date
Ngôn ngữ: C++
/*
 * =====================================================================================
 * 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

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

Tập tin📁

Tập tin Fritzing