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>

Arduino Library Manager-ден Adafruit NeoMatrix орнатыңыз. Adafruit GFX Library және Adafruit NeoPixel сияқты барлық қажетті тәуелділіктер автоматты түрде орнатылады.

Маңызды пайдаланушы конфигурациясы

Wi-Fi SSID және пароль (регистрге сезімтал)

Келесі мәндерді өз Wi-Fi деректеріңізбен ауыстырыңыз:

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

Маңызды: Wi-Fi SSID-тері регистрге сезімтал. "Book" деп аталған SSID "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 құралын пайдаланыңыз: Түс таңдағыш .

Уақытты көрсету және айналдыру

Ағымдағы уақыт HH:MM форматында пішімделіп, шағын таңба буферінде сақталады. Дисплей тек 8 пиксель ені болғандықтан, мәтін оңнан солға қарай тегіс айналады. Уақыт дисплейден толығымен шыққаннан кейін, келесі түс (қосылған болса) келесі өту үшін таңдалады.

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

Скетчті жүктегеннен кейін:

  • ESP32-S3 Wi-Fi-ға қосылады
  • Уақыт интернеттен синхрондалады
  • Ағымдағы уақыт RGB матрицасы бойымен айналады
  • Жарықтық күндіз және түнде автоматты түрде өзгереді
  • Мәтін түсі параметрлеріңізге байланысты тұрақты немесе циклдік болады

Жүктеулер мен сілтемелер

Толық бастапқы код осы мақаланың астында берілген. Бөлшектерге, құралдарға және деректер парақтарына сілтемелер осы мақаланың астында қолжетімді.

Суреттер

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
Тіл: 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();
  }
}

Сізге қажет болуы мүмкін нәрселер

Ресурстар мен сілтемелер

Файлдар📁

Fritzing файлы