Search Code

Проект за интернет часовник со RGB LED матрица базиран на ESP32-S3 - 4 случајни бои

Проект за интернет часовник со RGB LED матрица базиран на ESP32-S3 - 4 случајни бои

Интернет часовник ESP32-S3 со случајни RGB бои

Овој проект е ESP32-S3 RGB Matrix интернет часовник кој се поврзува на Wi-Fi, ја синхронизира локалната временска зона од NTP сервер и го прикажува времето во HH:MM формат преку вградената 8×8 RGB NeoMatrix матрица. Во оваа верзија, часовите, две точки и минутите се прикажани во случајни бои избрани при секој целосен циклус на движење, создавајќи динамичен и разигран приказ на часовникот кој постојано се менува.

ESP32-s3_internet_clock_animation

Како работи овој часовник

По напојувањето на плочката преку USB-C, ESP32-S3 се поврзува на вашата Wi-Fi мрежа и го презема моменталното локално време од интернет. Времето е поделено на три дела—часови, две точки и минути—и секој дел е нацртан одделно на RGB матрицата. Кога текстот целосно ќе се оддалечи од екранот, се избираат нови случајни бои за следниот премин.

Користени библиотеки

Овој код ги користи следниве библиотеки:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>

Инсталирајте го Adafruit NeoMatrix од Arduino Library Manager. Потребните зависности како Adafruit GFX Library и Adafruit NeoPixel ќе бидат инсталирани автоматски.

Важна корисничка конфигурација

Пин за податоци на матрицата (вградена RGB матрица)

Иако RGB матрицата е интегрирана на плочката, пинот за податоци сепак мора да биде дефиниран во кодот:

#define MATRIX_PIN 14

GPIO 14 најчесто се користи на ESP32-S3 RGB матрица плочките. Ако вашата варијанта на плочката користи различен пин, ажурирајте ја оваа вредност соодветно.

Wi-Fi SSID и лозинка (осетливи на големи/мали букви)

Заменете ги Wi-Fi акредитивите со деталите на вашата мрежа:

const char* WIFI_SSID     = "your WiFi SSID";
const char* WIFI_PASSWORD = "passW0rd";

Важно: Wi-Fi SSID имињата се осетливи на големи/мали букви. SSID наречен "Book" не е исто што и "book". Ако големината на буквите не се совпаѓа точно, ESP32-S3 нема да може да се поврзе.

NTP сервер, временска зона и летно сметање на времето

Синхронизацијата на времето се прави преку интернет NTP сервер:

const char* ntpServer = "pool.ntp.org";

Локалното време се пресметува користејќи UTC и офсети за летно сметање на времето:

// Торонто-слично: UTC-5, плус 1 час летно сметање
const long  gmtOffset_sec     = -5 * 3600;
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec: UTC офсет во секунди (прилагодете за вашата локација)
  • daylightOffset_sec: Користете 3600 кога летното сметање е активно, или 0 во спротивно

Овие поставки се применуваат користејќи:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Автоматска осветленост за ден/ноќ

Часовникот автоматски ја прилагодува осветленоста врз основа на моменталниот час:

const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;

Помеѓу 22:00 и 06:00, екранот се затемнува за да го намали отсјајот во темни средини. Во текот на дневните часови, матрицата се враќа на нормална осветленост.

Однесување на случајни RGB бои

Предефинирана листа на RGB бои е складирана во низа, каде што секоја боја е дефинирана со вредности за црвена, зелена и сина боја кои се движат од 0 до 255:

uint8_t userColors[][3] = {
  {255, 0, 0},    // Црвена
  {0, 255, 0},    // Зелена
  {0, 0, 255},    // Сина
  {255, 165, 0},  // Портокалова
  {255, 0, 255},  // Магента
  {0, 255, 255},  // Цијан
  {255, 255, 0}   // Жолта
};

При секој целосен циклус на движење:

  • На цифрите за часови им се доделува случајна боја
  • Двете точки добиваат различна случајна боја
  • Цифрите за минути добиваат друга случајна боја

Ова произведува постојано менувачка комбинација на бои што го прави часовникот визуелно интересен. За да креирате свои сопствени бои, можете да ја користите алатката RGB Color Picker: RGB Color Picker.

Логика за прикажување на времето

Времето е поделено на три компоненти:

  • Часови: HH
  • Две точки: :
  • Минути: MM

Секој дел е нацртан поединечно за да може да има своја боја, додека сите делови се движат заедно за да формираат мазна анимација на движење низ 8×8 екранот.

Генерирање случајни бои

За да се обезбеди случајност на боите, кодот го иницијализира генераторот на случајни броеви при стартување користејќи неповрзан аналоген пин:

randomSeed(analogRead(0));

Ова осигурува дека комбинациите на бои се различни при секое вклучување и при секој циклус на движење.

Демонстрација

По поставувањето на кодот и напојувањето на плочката преку USB-C:

  • ESP32-S3 се поврзува на вашата Wi-Fi мрежа
  • Времето се синхронизира од интернет
  • Времето се движи во HH:MM формат
  • Часовите, двете точки и минутите се менуваат во случајни бои при секој циклус
  • Екранот автоматски се затемнува ноќе

Преземања и линкови

Целосниот изворен код е даден под овој напис. Корисни алатки и референци се поврзани под овој напис.

Images

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
Language: 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();
  }
}

Resources & references

Files📁

Fritzing File