Search Code

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

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

ESP32-S3 Интернет часовник со виножито ефект во боја

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

ESP32-s3_internet_clock_animation

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

Откако ќе се напојува преку USB-C, ESP32-S3 се поврзува на вашата Wi-Fi мрежа и ја презема тековната локална време од интернет. Екранот нормално ја лизга времето, но во дефиниран интервал се префрла на прикажување на датумот. И времето и датумот се прикажуваат со динамичен виножито ефект, создавајќи живописен и анимиран приказ на малата 8×8 матрица.

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

Скицата се потпира на следниве библиотеки:

#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, ќе се инсталираат автоматски.

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

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

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

#define MATRIX_PIN 14

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

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

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

const char* WIFI_SSID     = "your WIFI";
const char* WIFI_PASSWORD = "passW0rd";

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

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

Часовникот ја синхронизира времето користејќи интернет NTP сервер:

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

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

// Торонто-слично: UTC-5, плус 1 час DST
const long  gmtOffset_sec     = -5 * 3600;
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec: UTC поместување во секунди (пример: UTC-5 = -5 * 3600)
  • daylightOffset_sec: Користете 3600 ако DST е активно, или 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 часот и 6 часот наутро, матрицата се затемнува за да го намали отсјајот. Во текот на дневните часови, нормалната осветленост се враќа.

Виножито ефект во боја

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

// Помошник за создавање виножито бои
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if (WheelPos < 85) {
    return matrix.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if (WheelPos < 170) {
    WheelPos -= 85;
    return matrix.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return matrix.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Додека текстот се лизга, секој знак напредува низ RGB спектарот, создавајќи континуиран виножито ефект кој изгледа особено импресивно на малата 8×8 матрица.

Однесување на приказот на време и датум

Часовникот одржува одделни бафери за време и датум:

  • Време: HH:MM
  • Датум: MMM DD (на пример JAN 08)

Датумот се прикажува во фиксен интервал:

const uint32_t dateIntervalMs = 60000; // Прикажи датум секоја 1 минута

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

Логика на лизгање на 8×8 матрица

Бидејќи екранот е широк само 8 пиксели, текстот се лизга мазно од десно кон лево. Откако текстот целосно ќе излезе од екранот, курсорот се ресетира и следната содржина (време или датум) се вчитува за следниот премин.

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

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

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

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

Целосниот изворен код е даден под овој напис. Корисни алатки и референци, вклучувајќи го и RGB Color Picker-от, исто така се поврзани под овој напис.

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
872-ESP32-S3 RGB LED Matrix Internte Clock Project 5 - Rainbow Color
Language: C++
/*
 * =====================================================================================
 * ESP32-S3 CLOCK - RAINBOW DATE & SOLID TIME - Project 5- RAINBOW MODE
 * =====================================================================================
 watch video https://youtube.com/shorts/4iWjLiD7fS8
 📚⬇️ Download and resource page https://robojax.com/RJT842
 * Author: Gemini (AI Thought Partner) & Ahmad Shamshiri (Robojax.com)
 * Date: 07 Jan 2026

 * =====================================================================================
 * ESP32-S3 INTERNET RGB CLOCK - RAINBOW MODE

 * * FEATURES: 
 * - Full Rainbow: Time and Date use flowing rainbow colors.
 * - Auto-Brightness: Dims at night (22:00 to 06:00).
 * - Custom WiFi: Robust connection logic with retries.
 * =====================================================================================
 */

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

#define MATRIX_PIN 14

// 👇 REPLACE these with your real home WiFi name & password
const char* WIFI_SSID     = "your WIFI";
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

// --- BRIGHTNESS CONFIGURATION ---
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22;
const int NIGHT_END_HOUR = 6;

// --- INTERVALS & TRACKING ---
unsigned long lastDateShowMs = 0;
const uint32_t dateIntervalMs = 60000; // Show date every 1 minute
bool isShowingDate = false;

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;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;
unsigned long lastTimeUpdateMs = 0;

// Helper to create Rainbow Colors
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return matrix.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return matrix.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return matrix.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

void updateClockData() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return;
  
  // Update Time and Date strings
  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]);

  // Handle Night Dimming
  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);
  
  int len = strlen(currentDisplayText);
  int16_t x = scrollX;

  // Draw each character with a shifting rainbow color
  for (int i = 0; i < len; i++) {
    uint8_t colorPos = (uint8_t)((i * 30) + (millis() / 5)); 
    matrix.setTextColor(Wheel(colorPos));
    matrix.setCursor(x + (i * 6), 0);
    matrix.print(currentDisplayText[i]);
  }

  matrix.show();
  scrollX--;

  int16_t textWidth = len * 6;
  if (scrollX < -textWidth) {
    scrollX = matrix.width();
    
    // Switch between Date and Time at end of cycle
    if (millis() - lastDateShowMs > dateIntervalMs) {
      strcpy(currentDisplayText, dateText);
      lastDateShowMs = millis();
      isShowingDate = true;
    } else {
      strcpy(currentDisplayText, timeText);
      isShowingDate = false;
    }
  }
}

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println("\nESP32-S3 Rainbow Clock Initializing...");

  // Connect to WiFi
  Serial.print("Connecting to WiFi: ");
  Serial.println(WIFI_SSID);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  int retries = 0;
  while (WiFi.status() != WL_CONNECTED && retries < 30) { // ~15s timeout
    delay(500);
    Serial.print(".");
    retries++;
  }
  Serial.println();

  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi connection FAILED");
  } else {
    Serial.print("WiFi connected. IP: ");
    Serial.println(WiFi.localIP());
  }

  // 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);
  
  updateClockData();
  strcpy(currentDisplayText, timeText); // Load initial time
}

void loop() {
  unsigned long now = millis();

  // Update time digits and check brightness every second
  if (now - lastTimeUpdateMs >= 1000) {
    lastTimeUpdateMs = now;
    updateClockData(); 
  }

  // Handle the scrolling animation
  if (now - lastScrollMs >= scrollIntervalMs) {
    lastScrollMs = now;
    scrollDisplay();
  }
}

Resources & references

Files📁

Fritzing File