Search Code

Iṣẹ́ Aago Internet Matrix LED RGB ESP32-S3 - Àwọ̀ Òṣùwọ̀n 5

Iṣẹ́ Aago Internet Matrix LED RGB ESP32-S3 - Àwọ̀ Òṣùwọ̀n 5

Aago ESP32-S3 pẹ̀lu Ipa Àwọ̀ Òṣùwọ̀n

Iṣẹ́ yìí jẹ́ Aago Ayélujára ESP32-S3 RGB Matrix tí ó ń sopọ̀ sí Wi-Fi, tí ó ń ṣàmúṣọ̀ àkókò àdúgbò láti ọ̀dọ̀ olùpèsè NTP, tí ó sì ń yí àkókò ní ọ̀nà HH:MM kọjá lórí 8×8 RGB NeoMatrix tí a kọ́ sínú rẹ̀. Kò dàbí àwọn ẹ̀yà àwọ̀ líle tabí àìrọ̀tẹ́lẹ̀, aago yìí ń lo ìpàtàkì àwọ̀ òṣùwọ̀n tí ó dán, níbi tí ohun kíkọ́ kọ̀ọ̀kan ti ń yípadà nípasẹ̀ àwọ̀ RGB nígbà gbogbo bí ó ti ń yí. Aago náà tún ń fi ọjọ́ hàn lẹ́ẹ̀kọ̀ọ̀kan, ó sì ń ṣàtúnṣe ìmọ́lẹ̀ láàárín ọ̀sán àti òru fúnrarẹ̀.

Ìṣerí àgo ESP32-s3 lórí ayélujára

Bí aago yìí ṣe ń ṣiṣẹ́

Nígbà tí a bá fi agbára mú un nípasẹ̀ USB-C, ESP32-S3 ń sopọ̀ sí nẹ́tíwọọkì Wi-Fi rẹ, ó sì ń gba àkókò àdúgbò lọ́wọ́lọ́wọ́ láti orí ayélujára. Àfihàn náà ń yí àkókò nígbà gbogbo, ṣùgbọ́n ní ààyè tí a yàn, ó ń yípadà láti fi ọjọ́ hàn. Bí àkókò àti ọjọ́ ti ń lo ìpàtàkì àwọ̀ òṣùwọ̀n tí ó ń yí, tí ó ń dá ìfihàn alààyè tí ó lálàá lórí 8×8 matrix kékeré.

Àwọn ilé-ìkàwé tí a lò

Ìwé-àkọsílẹ̀ náà gbára lé àwọn ilé-ìkàwé wọ̀nyí:

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

Fi Adafruit NeoMatrix sọ̀rọ̀ nípa lílo Arduino Library Manager. Àwọn ohun tí ó gbára lé, bíi Adafruit GFX Library àti Adafruit NeoPixel, yóò fi sílẹ̀ fúnrarẹ̀.

Ìtòlẹ́tò olùmúlò pàtàkì

Pínì data Matrix (RGB matrix tí a kọ́ sínú)

Bí ó tilẹ̀ jẹ́ pé RGB matrix ti so mọ́ bọ́ọ̀dù ESP32-S3, pínì data náà gbọ́dọ̀ ṣàlàyé nínú kóòdù:

#define MATRIX_PIN 14

GPIO 14 ni a ń lò nígbà gbogbo lórí àwọn bọ́ọ̀dù RGB matrix ESP32-S3. Bí ẹ̀yà bọ́ọ̀dù rẹ bá lo pínì ọ̀tọ̀ọ̀tọ̀, ṣàtúnṣe iye yìí.

Wi-Fi SSID àti ọ̀rọ̀ìpamọ́ (tí ó kọ́ka sí àwọn lẹ́tà)

Rọ́pò àwọn ìdánimọ̀ Wi-Fi pẹ̀lú àwọn àlàyé nẹ́tíwọọkì tirẹ:

const char* WIFI_SSID     = "WIFI rẹ";
const char* WIFI_PASSWORD = "passW0rd";

Pàtàkì: Àwọn SSID Wi-Fi jẹ́ tí ó kọ́ka sí àwọn lẹ́tà. SSID tí a pè ní "Book" kò jọ̀ọ́ "book". Bí àwọn lẹ́tà ńlá kò bá bá àwọn lẹ́tà kékeré mu dáadáa, ESP32-S3 yóò kùnà láti sopọ̀.

Olùpèsè NTP, àgbègbè àkókò, àti ìmúra ọ̀sán

Aago náà ń ṣàmúṣọ̀ àkókò nípasẹ̀ olùpèsè NTP ayélujára:

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

A ṣe ìṣirò àkókò àdúgbò nípasẹ̀ àwọn ìyàtọ̀ wọ̀nyí:

// Bíi Toronto: UTC-5, pẹ̀lú 1 wákàtí DST
const long  gmtOffset_sec     = -5 * 3600;
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec: Ìyàtọ̀ UTC ní ìṣẹ́jú-aaya (àpẹẹrẹ: UTC-5 = -5 * 3600)
  • daylightOffset_sec: Lo 3600 bí DST bá ń ṣiṣẹ́, tàbí 0 bí a kò bá lò ó

A ń lo àwọn iye wọ̀nyí nípasẹ̀:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Ìmọ́lẹ̀ ọ̀sán / òru fúnrarẹ̀

Ìmọ́lẹ̀ ń yípadà fúnrarẹ̀ nígbà gbogbo nípa lílo wákàtí lọ́wọ́lọ́wọ́:

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

Láàárín 10 alẹ́ àti 6 àárọ̀, matrix ń ṣókùnkùn láti dín ìtànṣán kù. Ní àwọn wákàtí ọ̀sán, ìmọ́lẹ̀ déédéé ń padà bọ̀.

Ìpàtàkì àwọ̀ òṣùwọ̀n

Iṣẹ́ yìí ń lo kẹ̀kẹ́ àwọ̀ RGB àtijọ́ láti ṣẹ̀dá àwọn àwọ̀ òṣùwọ̀n tí ó dán. Wọ́n ń ya ohun kíkọ́ kọ̀ọ̀kan pẹ̀lú ìyàtọ̀ àwọ̀ díẹ̀, àwọn àwọ̀ sì ń yípadà lórí àkókò, tí ó ń ṣẹ̀dá ìṣerí àwọ̀ òṣùwọ̀n tí ó ń ṣàn.

// Olùrànlọ́wọ́ láti ṣẹ̀dá Àwọ̀ Òṣùwọ̀n
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);
}

Bí ọ̀rọ̀ náà ti ń yí, ohun kíkọ́ kọ̀ọ̀kan ń gbéra nípasẹ̀ àwọ̀ RGB, tí ó ń ṣẹ̀dá ìpàtàkì àwọ̀ òṣùwọ̀n tí ó ń tẹ̀síwájú tí ó wúni lórí ní pàtàkì lórí 8×8 display kékeré.

Ìwà àkókò àti ọjọ́ ìfihàn

Aago náà ń pa àwọn àkójọpọ̀ ọ̀tọ̀ọ̀tọ̀ fún àkókò àti ọjọ́:

  • Àkókò: HH:MM
  • Ọjọ́: MMM DD (fún àpẹẹrẹ JAN 08)

A fi ọjọ́ hàn ní ààyè tí a yàn:

const uint32_t dateIntervalMs = 60000; // Fi ọjọ́ hàn ní gbogbo ìṣẹ́jú 1

Ní ìparí ọ̀kọ̀ọ̀kan yíyí kíkún, kóòdù náà ń pinnu bóyá ó yẹ kí ó tẹ̀síwájú láti fi àkókò hàn tàbí yípadà sí ọjọ́.

Ìṣerí ọgbọ́n lórí 8×8 matrix

Nítorí pé display jẹ́ 8 pixels ní gbígbòòrò péré, ọ̀rọ̀ náà ń yí ní ọ̀nà tí ó dán láti ọ̀tún sí òsì. Nígbà tí ọ̀rọ̀ náà bá ti jáde kúrò lórí iboju pátápátá, cursor ń padà sí ìbẹ̀rẹ̀, a sì ń gbé ohun tí ó tẹ̀lé e (àkókò tàbí ọjọ́) sílẹ̀ fún ìgbà tí ó tẹ̀lé e.

Ìfihàn

Lẹ́yìn tí a bá ti gbé ìwé-àkọsílẹ̀ sílẹ̀ tí a sì fi agbára mú bọ́ọ̀dù náà nípasẹ̀ USB-C:

  • ESP32-S3 ń sopọ̀ sí nẹ́tíwọọkì Wi-Fi rẹ
  • A ṣàmúṣọ̀ àkókò láti orí ayélujára
  • Àkókò ń yí ní ọ̀nà HH:MM
  • Ọjọ́ ń farahàn lẹ́ẹ̀kọ̀ọ̀kan
  • Gbogbo ọ̀rọ̀ ni a ń fi ìpàtàkì àwọ̀ òṣùwọ̀n tí ó ń yí ṣe
  • Ìfihàn náà ń ṣókùnkùn ní alẹ́, ó sì ń tàn ní ọ̀sán fúnrarẹ̀

Àwọn ìgbàlódé àti àwọn ọ̀nà àbọ̀

Kòd orijinal konplè a bay anba atik sa a. Zouti itil ak referans, tankou RGB Color Picker, yo tou lye anba atik sa a.

Aworan

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

Orisun & itọkasi

Fáìlìs📁

Fayile Fritzing