Search Code

ESP32-S3 RGB LED матричен интернет часовник проект - 3 ноќни бои со датум

ESP32-S3 RGB LED матричен интернет часовник проект - 3 ноќни бои со датум

ESP32-S3 RGB NeoMatrix интернет часовник со автоматска дневна/ноќна осветленост

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

Што прави овој часовник

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

ESP32-s3_internet_clock_animation

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

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

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

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

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

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

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

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

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

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

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

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

const long  gmtOffset_sec     = -5 * 3600; 
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec го дефинира вашето UTC поместување во секунди
  • daylightOffset_sec додава еден час кога е активно летното сметање на времето (користете 0 ако не е потребно)

Овие вредности се применуваат со:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

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

Осветленоста на екранот се менува автоматски врз основа на моменталниот час:

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

Помеѓу 22:00 и 6:00 часот, осветленоста на матрицата се намалува за да биде удобна во темни средини. Надвор од тие часови, се враќа целосната дневна осветленост. Можете да ги прилагодите овие вредности според осветлувањето на вашата просторија.

RGB конфигурација на бои

Бојата на текстот на часовникот е дефинирана со RGB (црвена, зелена, сина) вредности, каде што секој канал се движи од 0 до 255. Повеќе бои може да се чуваат во низа и автоматски да се менуваат:

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

Ако useFixedColor е поставено на true, часовникот секогаш користи една боја. Ако е поставено на false, бојата автоматски се менува по секое целосно поминување на времето.

За брзо пронаоѓање на точните RGB вредности за било која боја, користете ја алатката RGB Color Picker: Color Picker .

Приказ на времето и движење

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

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

По поставувањето на кодот:

  • ESP32-S3 се поврзува на Wi-Fi
  • Времето се синхронизира од интернет
  • Моменталното време се движи преку RGB матрицата
  • Осветленоста автоматски се менува помеѓу ден и ноќ
  • Бојата на текстот останува фиксна или се менува според вашите поставки

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

Целосниот изворен код е даден подолу во овој напис. Линкови до делови, алатки и технички спецификации се достапни подолу во овој напис.

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
870-ESP32-S3 RGB LED Matrix Internte Clock Project 3 - Night Color with Date
Language: 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();
  }
}

Things you might need

Resources & references

Files📁

Fritzing File