Search Code

የESP32-S3 RGB LED ማትሪክስ የበይነመረብ ሰዓት ፕሮጀክት - 4 የዘፈቀደ ቀለም

የESP32-S3 RGB LED ማትሪክስ የበይነመረብ ሰዓት ፕሮጀክት - 4 የዘፈቀደ ቀለም

ESP32-S3 የበይነመረብ ሰዓት ከዘፈቀደ RGB ቀለሞች ጋር

ይህ ፕሮጀክት ከWi-Fi ጋር የሚገናኝ፣ የአካባቢውን ሰዓት ከNTP አገልጋይ የሚያመሳስል እና ሰዓቱን በHH:MM ቅርጸት በተሰራው 8×8 RGB NeoMatrix ላይ የሚያሽከለልል ESP32-S3 RGB Matrix የበይነመረብ ሰዓት ነው። በዚህ ስሪት ውስጥ፣ ሰዓቶቹ፣ ኮሎን እና ደቂቃዎቹ እያንዳንዳቸው በየዘፈቀደ ቀለሞች በእያንዳንዱ ሙሉ የማሽከለል ዑደት ላይ ይመረጣሉ፣ ይህም ያለማቋረጥ የሚለዋወጥ እና አስደሳች የሰዓት ማሳያ ይፈጥራል።

ESP32-s3_internet_clock_animation

ይህ ሰዓት እንዴት ይሰራል

ቦርዱን በUSB-C ካብራሩ በኋላ፣ ESP32-S3 ከWi-Fi አውታረ መረብዎ ጋር ይገናኛል እና የአሁኑን የአካባቢ ሰዓት ከበይነመረብ ያመጣል። ሰዓቱ በሦስት ክፍሎች ይከፈላል—ሰዓቶች፣ ኮሎን እና ደቂቃዎች—እና እያንዳንዱ ክፍል በRGB ማትሪክስ ላይ በተናጠል ይሳላል። ጽሑፉ ሙሉ በሙሉ ከስክሪኑ ሲወጣ፣ ለሚቀጥለው ማለፊያ አዳዲስ የዘፈቀደ ቀለሞች ይመረጣሉ።

ጥቅም ላይ የዋሉ ቤተ-መጻሕፍት

ይህ ስኬች የሚከተሉትን ቤተ-መጻሕፍት ይጠቀማል፦

#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 ያሉ አስፈላጊ ጥገኞች በራስ-ሰር ይጫናሉ።

አስፈላጊ የተጠቃሚ ውቅር

የማትሪክስ ዳታ ፒን (የተሰራው RGB ማትሪክስ)

ምንም እንኳን RGB ማትሪክስ በቦርዱ ላይ የተዋሃደ ቢሆንም፣ የዳታ ፒኑ አሁንም በኮዱ ውስጥ መገለጽ አለበት፦

#define MATRIX_PIN 14

GPIO 14 በESP32-S3 RGB ማትሪክስ ቦርዶች ላይ በተለምዶ ጥቅም ላይ ይውላል። የቦርድዎ ዓይነት የተለየ ፒን የሚጠቀም ከሆነ፣ ይህንን እሴት በዚሁ መሠረት ያዘምኑ።

የWi-Fi SSID እና የይለፍ ቃል (ትልቅ/ትንሽ ፊደል ስሜታዊ)

የWi-Fi ምስክርነቶችን በራስዎ የአውታረ መረብ ዝርዝሮች ይተኩ፦

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

አስፈላጊ፦ የWi-Fi SSIDዎች ትልቅ/ትንሽ ፊደል ስሜታዊ ናቸው። "Book" የሚባል SSID ከ"book" ጋር አንድ አይደለም። አቢይ ሆሄያቱ በትክክል ካልተዛመዱ፣ ESP32-S3 መገናኘት አይችልም።

የNTP አገልጋይ፣ የሰዓት ሰቅ እና የቀን ብርሃን ቁጠባ

የሰዓት ማመሳሰል የሚከናወነው የበይነመረብ NTP አገልጋይ በመጠቀም ነው፦

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

የአካባቢ ሰዓት የሚሰላው UTC እና የቀን ብርሃን ቁጠባ ማካካሻዎችን በመጠቀም ነው፦

// ቶሮንቶ-መሰል፡ UTC-5፣ ሲደመር 1 ሰዓት DST
const long  gmtOffset_sec     = -5 * 3600;
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec፦ የUTC ማካካሻ በሰከንዶች (ለአካባቢዎ ያስተካክሉ)
  • daylightOffset_sec፦ DST ንቁ በሚሆንበት ጊዜ 3600 ይጠቀሙ፣ ወይም ካልሆነ 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;

ከምሽቱ 10 ሰዓት እስከ ጠዋቱ 6 ሰዓት ባለው ጊዜ፣ ማሳያው በጨለማ አካባቢዎች ውስጥ የብርሃን ነጸብራቅን ለመቀነስ ይደበዝዛል። በቀን ሰዓታት ውስጥ፣ ማትሪክሱ ወደ መደበኛ ብሩህነት ይመለሳል።

የዘፈቀደ RGB ቀለም ባህሪ

አስቀድሞ የተገለጸ የRGB ቀለሞች ዝርዝር በድርድር ውስጥ ይከማቻል፣ እያንዳንዱ ቀለም ከ0 እስከ 255 ባለው ክልል ውስጥ ባሉ ቀይ፣ አረንጓዴ እና ሰማያዊ እሴቶች ይገለጻል፦

uint8_t userColors[][3] = {
  {255, 0, 0},    // ቀይ
  {0, 255, 0},    // አረንጓዴ
  {0, 0, 255},    // ሰማያዊ
  {255, 165, 0},  // ብርቱካናማ
  {255, 0, 255},  // ማጀንታ
  {0, 255, 255},  // ሳያን
  {255, 255, 0}   // ቢጫ
};

በእያንዳንዱ ሙሉ የማሽከለል ዑደት ላይ፦

  • ሰዓት አሃዞች የዘፈቀደ ቀለም ይመደባሉ
  • ኮሎኑ የተለየ የዘፈቀደ ቀለም ይቀበላል
  • ደቂቃ አሃዞች ሌላ የዘፈቀደ ቀለም ይቀበላሉ

ይህ ሰዓቱን በእይታ አስደሳች የሚያደርገውን ያለማቋረጥ የሚለዋወጥ የቀለም ጥምረት ያመርታል። የራስዎን ብጁ ቀለሞች ለመፍጠር፣ የRGB Color Picker መሣሪያን መጠቀም ይችላሉ፦ RGB Color Picker

የሰዓት አቀራረብ አመክንዮ

ሰዓቱ በሦስት ክፍሎች ይከፈላል፦

  • ሰዓቶች፦ HH
  • ኮሎን፦ :
  • ደቂቃዎች፦ MM

እያንዳንዱ ክፍል የራሱ ቀለም እንዲኖረው በተናጠል ይሳላል፣ ሁሉም ክፍሎች በ8×8 ማሳያ ላይ ለስላሳ የማሽከለል እነማ ለመፍጠር አብረው ይንቀሳቀሳሉ።

የዘፈቀደ ቀለም ማመንጨት

የቀለም ዘፈቀደነትን ለማረጋገጥ፣ ስኬቹ በመነሻ ጊዜ የዘፈቀደ ቁጥር አመንጪውን ያልተገናኘ የአናሎግ ፒን በመጠቀም ይዘራል፦

randomSeed(analogRead(0));

ይህ የቀለም ጥምረቶች በእያንዳንዱ ኃይል ማብራት እና በእያንዳንዱ የማሽከለል ዑደት ላይ የተለያዩ መሆናቸውን ያረጋግጣል።

ማሳያ

ስኬቹን ከጫኑ እና ቦርዱን በUSB-C ካበሩ በኋላ፦

  • ESP32-S3 ከWi-Fi አውታረ መረብዎ ጋር ይገናኛል
  • ሰዓት ከበይነመረብ ይመሳሰላል
  • ሰዓቱ በHH:MM ቅርጸት ይሽከለላል
  • ሰዓቶች፣ ኮሎን እና ደቂቃዎች በእያንዳንዱ ዑደት ወደ የዘፈቀደ ቀለሞች ይቀየራሉ
  • ማሳያው በሌሊት በራስ-ሰር ይደብዝዛል

ውርዶች እና አገናኞች

የተሟላ ምንጭ ኮድ ከዚህ ጽሑፍ በታች ቀርቧል። ጠቃሚ መሣሪያዎች እና ማጣቀሻዎች ከዚህ ጽሑፍ በታች ተገናኝተዋል።

ምስሎች

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
873-ESP32-S3 RGB LED Matrix Internte Clock Project 4 - Random Color
ቋንቋ: C++
/*
 * =====================================================================================
 * ESP32-S3 INTERNET RGB CLOCK (8x8 Matrix) - Project 4- Random Color
 * =====================================================================================
 watch video https://youtube.com/shorts/4iWjLiD7fS8
 📚⬇️ Download and resource page https://robojax.com/RJT843
 * 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).
 * =====================================================================================
 */
/*
 * =====================================================================================
 * ESP32-S3 INTERNET CLOCK - MULTI-COLOR ELEMENTS
 * =====================================================================================
 * Each part of the time (HH : MM) gets a different random color from your list.
 * Colors only change once the full scroll cycle is finished.
 * =====================================================================================
 */

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

#define MATRIX_PIN 14

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

uint8_t userColors[][3] = {
  {255, 0, 0},    // Red
  {0, 255, 0},    // Green
  {0, 0, 255},    // Blue
  {255, 165, 0},  // Orange
  {255, 0, 255},  // Magenta
  {0, 255, 255},  // Cyan
  {255, 255, 0}   // Yellow
};
int totalColors = sizeof(userColors) / sizeof(userColors[0]);

// Variables to store the current random color indices
int hourColorIdx = 0;
int colonColorIdx = 1;
int minColorIdx = 2;

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

char hourText[3], minText[3];
int16_t scrollX = 8;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;

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


void updateTimeParts() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return;
  
  snprintf(hourText, sizeof(hourText), "%02d", timeinfo.tm_hour);
  snprintf(minText, sizeof(minText), "%02d", timeinfo.tm_min);

  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);
  
  int x = scrollX;

  // 1. Draw Hours
  matrix.setTextColor(matrix.Color(userColors[hourColorIdx][0], userColors[hourColorIdx][1], userColors[hourColorIdx][2]));
  matrix.setCursor(x, 0);
  matrix.print(hourText);
  x += 12; // Move 12 pixels (2 digits * 6px)

  // 2. Draw Colon
  matrix.setTextColor(matrix.Color(userColors[colonColorIdx][0], userColors[colonColorIdx][1], userColors[colonColorIdx][2]));
  matrix.setCursor(x, 0);
  matrix.print(":");
  x += 6; // Move 6 pixels

  // 3. Draw Minutes
  matrix.setTextColor(matrix.Color(userColors[minColorIdx][0], userColors[minColorIdx][1], userColors[minColorIdx][2]));
  matrix.setCursor(x, 0);
  matrix.print(minText);

  matrix.show();
  scrollX--;

  // Total width is roughly 30 pixels (HH=12, :=6, MM=12)
  if (scrollX < -30) {
    scrollX = matrix.width(); 
    
    // Pick NEW random colors for the next cycle
    hourColorIdx = random(0, totalColors);
    colonColorIdx = random(0, totalColors);
    minColorIdx = random(0, totalColors);
  }
}

void setup() {
  Serial.begin(115200);
  
  // Seed the random generator using an unconnected analog pin
  randomSeed(analogRead(0));

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  
  // 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);
}

void loop() {
  if (millis() % 1000 == 0) updateTimeParts();

  if (millis() - lastScrollMs >= scrollIntervalMs) {
    lastScrollMs = millis();
    scrollTime();
  }
}

ምንጮች እና ምንጮች

ፋይሎች📁

ፍሪትዚንግ ፋይል