Кодты іздеу

ESP32-S3 RGB LED матрицасы Wi-Fi + NTP уақыт сағаты жобасы -1 Негізгі сағат

ESP32-S3 RGB LED матрицасы Wi-Fi + NTP уақыт сағаты жобасы -1 Негізгі сағат

ESP32-S3 Интернет сағаты 8×8 NeoMatrix (Wi-Fi + NTP уақыты)

Бұл жоба ESP32-S3 және 8×8 RGB NeoMatrix (NeoPixel/WS2812) шағын интернет сағатына айналдырады. ESP32 Wi-Fi-ға қосылады, NTP серверінен жергілікті уақытты синхрондайды, содан кейін уақытты HH:MM ретінде 8×8 дисплейде айналдырып көрсетеді.

ESP32-s3_internet_clock_animation

 

Қалай жұмыс істейді (жоғары деңгей)

1) ESP32-S3 <WiFi.h> көмегімен маршрутизаторға қосылады.
2) Ол "time.h" және configTime() көмегімен NTP серверінен уақытты синхрондайды.
3) Уақыт HH:MM форматында пішімделіп, шағын мәтіндік буферге сақталады.
4) NeoMatrix мәтінді көрсетіп, оны 8×8 панельде айналдырады.

RGB түсі

Сағат мәтінінің түсі RGB (Қызыл, Жасыл, Көк) мәндері арқылы басқарылады, мұнда әр түс арнасы 0-ден 255-ке дейін өзгереді және әртүрлі комбинациялар NeoMatrix-те әртүрлі түстер жасайды. color_RED, color_GREEN және color_BLUE айнымалыларын реттеу арқылы сағаттың көрінісін қалаған түске оңай теңшеуге болады. Белгілі бір түс үшін нақты RGB мәндерін жылдам табу үшін онлайн RGB түс таңдағышын пайдалануға болады Түс таңдағыш .

Пайдаланылған кітапханалар

Бұл include файлдары эскиздің неге тәуелді екенін нақты көрсетеді:

#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 сияқты қажетті тәуелділіктерді тартады.

Міндетті түрде өңдеуіңіз керек маңызды пайдаланушы параметрлері

1) Мәтін түсі (RGB)

Сағат мәтінінің түсін 0–255 мәндерін пайдаланып орнатыңыз:

//дисплей түсін Қызыл, Жасыл және Көк түстерінен құрастырыңыз
unsigned int color_RED = 17;
unsigned int color_GREEN = 43;
unsigned int color_BLUE = 171;

Бұл мәндер мына жерде қолданылады:

matrix.setTextColor(matrix.Color(color_RED, color_GREEN, color_BLUE));

Ескерту: Барлық түстерді 0-ге (қара) орнатсаңыз, мәтін көрінбейтін болады. Эскизде қауіпсіздік тексеруі бар:

// егер пайдаланушы барлық түстерді 0-ге орнатса, дисплей өшеді, сондықтан оны жасыл етіп орнатыңыз
if (color_RED == 0 && color_GREEN == 0 && color_BLUE == 0) {
  color_GREEN = 200;
}

Бұл матрицаның көрінбейтін түс параметріне байланысты “өлі” көрінбеуін қамтамасыз етеді.

2) Wi-Fi SSID және құпия сөз

Оларды нақты Wi-Fi атауымен және құпия сөзімен ауыстырыңыз:

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

Іске қосу кезінде ESP32 Serial Monitor-да қосылу барысын басып шығарады және шамамен 15 секундтан кейін уақыт бітеді (30 қайталау × 500мс).

3) NTP сервері

Әдепкі NTP сервері:

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

Оны сол күйінде қалдыруға болады. Жергілікті серверді пайдаланғыңыз келсе, хост атауын қалаған NTP серверімен ауыстырыңыз.

4) Уақыт белдеуінің ауытқуы және жазғы уақыт ауытқуы

Бұл екі параметр жергілікті уақытты басқарады:

// Торонтоға ұқсас: UTC-5, плюс 1 сағат DST
const long  gmtOffset_sec      = -5 * 3600;  // -5 сағат
const int   daylightOffset_sec = 3600;       // DST үшін +1 сағат

Оларды қалай орнату керек:

  • gmtOffset_sec = (UTC ауытқу сағаттары) × 3600. Мысалы: UTC-5 → -5*3600, UTC+2 → 2*3600.
  • daylightOffset_sec = DST реттеуін қаламасаңыз 0, немесе аймағыңыз қазір DST бақылап жатса (+1 сағат) 3600.

Олар мына жерде қолданылады:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Дисплей конфигурациясы

Матрица деректер түйреуіші

Деректер түйреуіші мына жерде анықталған:

#define MATRIX_PIN 14

Сым қосылымы басқа GPIO пайдаланса, сәйкестендіру үшін осы нөмірді өзгертіңіз.

NeoMatrix орналасуы + түс реті

Матрицаңыз келесідей инициализацияланады:

Adafruit_NeoMatrix matrix(8, 8, MATRIX_PIN,
  NEO_MATRIX_TOP    + NEO_MATRIX_LEFT +
  NEO_MATRIX_ROWS   + NEO_MATRIX_PROGRESSIVE,
  NEO_RGB           + NEO_KHZ800);

Дисплейдің “дұрыс емес” көрінуінің екі жалпы себебі:

  • Айналдыру / сым бағыты: Мәтін төңкерілген немесе айнадай көрінсе, NEO_MATRIX_* жалаушаларын реттеңіз (TOP/BOTTOM, LEFT/RIGHT, ROWS/COLUMNS, PROGRESSIVE/ZIGZAG).
  • Түс реті: Бұл код NEO_RGB пайдаланады. Кейбір панельдер NEO_GRB. Қызыл/жасыл/көк сәйкес келмесе, NEO_RGB мәнін дұрыс ретке өзгертіңіз.

Жарықтық

Жарықтық initMatrix() функциясында орнатылады:

matrix.setBrightness(40);

Жарық дисплей үшін арттырыңыз, жылу мен қуат тұтынуды азайту үшін төмендетіңіз.

Уақыт HH:MM ретінде қалай жасалады

Сағат пішімделген уақытты 6 таңбалы буферде сақтайды:

char timeText[6] = "00:00";

Содан кейін updateTimeText() NTP-синхрондалған жергілікті уақытты оқиды және мәтінді жазады:

// Форматы: СС:ММ
snprintf(timeText, sizeof(timeText), "%02d:%02d",
         timeinfo.tm_hour,
         timeinfo.tm_min);

Бұл негізгі циклде секундына бір рет жаңартылады.

8×8 дисплейде айналдыру қалай жұмыс істейді

8×8 матрица СС:ММ мәтінін бірден көрсету үшін тым тар, сондықтан скетч мәтінді айналдырады. Ол уақытты өзгеретін X орнында (scrollX) салады, содан кейін әр жаңартуда оны бір пиксельге солға жылжытады.

int16_t scrollX = 8;
const uint16_t scrollIntervalMs = 120;

Әр айналдыру қадамы:

matrix.fillScreen(0);
matrix.setCursor(scrollX, 0);
matrix.print(timeText);
matrix.show();
scrollX--;

Мәтін сол жақтан толығымен шыққанда, код оны оң жақ шетінен қайта бастау үшін қалпына келтіреді:

int16_t textWidth = 30;
if (scrollX < -textWidth) {
  scrollX = matrix.width();
}

Serial Monitor шығысы (жөндеу)

Бұл скетч пайдалы хабарламаларды басып шығарады:

  • Wi-Fi қосылу барысы және IP мекенжайы
  • Уақыт синхрондауы сәтті болғанын көрсетеді
  • Форматталған уақыт жолы (мысалы, Уақыт мәтіні: 14:32)

Дисплей бос болса, Wi-Fi және NTP жұмыс істеп тұрғанын тексеру үшін алдымен Serial Monitor-ды тексеру керек.

Жобаны көрсету

Жүктеуден және қалпына келтіруден кейін:

  • ESP32 Wi-Fi-ға қосылады
  • pool.ntp.org серверінен уақытты синхрондайды
  • Матрицада OK қысқаша көрсетеді
  • Ағымдағы уақытты СС:ММ ретінде үздіксіз айналдырады

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

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

Суреттер

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
868-ESP32-S3 RGB LED Matrix Internte Clock Project 1 - Basic Clock
Тіл: C++
/*
This is ESP32 sketch that connects to the internet, gets the time and displays it on the RGB matrix
you must set your WiFi correctly to make sure it gets connected. 
 watch video https://youtube.com/shorts/4iWjLiD7fS8
 📚⬇️ Download and resource page https://robojax.com/RJT838
 * Author:  Ahmad Shamshiri (Robojax.com)
 * Date: 07 Jan 2026
www.Robojax.com
https://youTube.com/@robojax


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

//set the color of diplay make of Red, Green and Blue 
unsigned int color_RED = 17;
unsigned int color_GREEN = 43;
unsigned int color_BLUE = 171;

// 👇 REPLACE these with your real home WiFi name & password
const char* WIFI_SSID     = "WiFi";
const char* WIFI_PASSWORD = "passW0rd";



#define MATRIX_PIN 14

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

unsigned long lastTimeUpdateMs = 0;
const uint16_t timeUpdateIntervalMs = 1000;

//prototypes
bool updateTimeText();  // forward declaration
void scrollTime();      // forward declaration



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



bool updateTimeText() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Failed to obtain time for display");
    return false;
  }

  // Format HH:MM
  snprintf(timeText, sizeof(timeText), "%02d:%02d",
           timeinfo.tm_hour,
           timeinfo.tm_min);

  Serial.print("Time text: ");
  Serial.println(timeText);
  return true;
}

void scrollTime() {
  matrix.fillScreen(0);
  matrix.setCursor(scrollX, 0);
  matrix.print(timeText);
  matrix.show();

  scrollX--;

  // Rough width: 5 characters ("HH:MM") × 6 pixels each ≈ 30 px
  int16_t textWidth = 30;
  if (scrollX < -textWidth) {
    scrollX = matrix.width();  // reset to right edge (8)
  }
}


void initMatrix() {
  matrix.begin();
  matrix.setBrightness(40);        // be careful with heat
  matrix.setTextWrap(false);
  matrix.setTextColor(matrix.Color(color_RED, color_GREEN, color_BLUE)); // color of text
}

void showMessage(const char* msg) {
  matrix.fillScreen(0);
  matrix.setCursor(0, 0);  // top-left
  matrix.print(msg);
  matrix.show();
}


void printLocalTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Failed to obtain time");
    return;
  }
  // Format: 2025-11-18 14:35:12
  Serial.printf("%04d-%02d-%02d %02d:%02d:%02d\n",
                timeinfo.tm_year + 1900,
                timeinfo.tm_mon + 1,
                timeinfo.tm_mday,
                timeinfo.tm_hour,
                timeinfo.tm_min,
                timeinfo.tm_sec);
}

void setup() {
  Serial.begin(115200);
  delay(1000);
  Serial.println();
  Serial.println("ESP32-S3 Internet Clock - WiFi + NTP test");

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

// if user set all colors to 0, the dispaly will be turned off so set it green
  if(color_RED ==0 & color_GREEN ==0 && color_BLUE ==0)
  {
    color_GREEN = 200;
  }

  // Configure time via NTP
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  Serial.println("Waiting for time...");
  delay(2000); // small wait for initial sync

  printLocalTime(); // print once at startup

    // NEW: init the LED matrix and show a test message
  initMatrix();
  showMessage("OK");
}

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

  // Update the time string "HH:MM" once per second
  if (now - lastTimeUpdateMs >= timeUpdateIntervalMs) {
    lastTimeUpdateMs = now;
    updateTimeText();  // fills timeText[], e.g. "14:32"
  }

  // Scroll the time across the 8×8 every scrollIntervalMs
  if (now - lastScrollMs >= scrollIntervalMs) {
    lastScrollMs = now;
    scrollTime();      // uses timeText and scrollX
  }
}

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

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

Файлдар📁

Fritzing файлы