هذا الدليل جزء من: مصفوفة مصابيح LED RGB من نوع ESP32-S3
مشروع رائع يمكنك تنفيذه لأغراض ترفيهية وعملية باستخدام وحدة ESP32-S3 RGB Matrix. تجد روابط لفيديوهات أخرى أسفل هذه المقالة.
مشروع ساعة إنترنت مصفوفة LED RGB ESP32-S3 - 5 ألوان قوس قزح
ساعة إنترنت ESP32-S3 بتأثير لون قوس قزح
هذا المشروع عبارة عن ساعة إنترنت بشاشة مصفوفة RGB تعتمد على ESP32-S3 تتصل بشبكة Wi-Fi، وتزامن الوقت المحلي من خادم NTP، وتقوم بتمرير الوقت فيHH:MMالتنسيق عبر مصفوفة NeoMatrix RGB المدمجة 8×8. بخلاف النسخ الثابتة أو العشوائية، يستخدم هذا الساعة تنسيقًا سلسًا.تأثير لون قوس قزححيث يتحرك كل حرف بشكل مستمر عبر طيف RGB أثناء التمرير. كما أن الساعة تعرض أيضًا التاريخ بشكل دوري وتضبط السطوع تلقائيًا بين النهار والليل.

كيف تعمل هذه الساعة
بمجرد توصيله عبر USB-C، يتصل ESP32-S3 بشبكة Wi-Fi الخاصة بك ويسترجع الوقت المحلي الحالي من الإنترنت. عادة ما يقوم العرض بالتمرير لعرض الوقت، ولكن في فترات محددة يتحول لعرض التاريخ. يتم عرض كل من الوقت والتاريخ باستخدام تأثير قوس قزح الديناميكي، مما يخلق عرضًا نابضًا وحيويًا على المصفوفة الصغيرة 8×8.
المكتبات المستخدمة
يعتمد الرسم التخطيطي على المكتبات التالية:

#include <WiFi.h>
#include "time.h"
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>تثبيتأدافرويت نيو ماتريكساستخدام مدير مكتبة الأردوينو. dependencies الخاصة به، بما في ذلكAdafruit GFX LibraryوAdafruit NeoPixelسيتم تثبيته تلقائيًا.

تكوين المستخدم المهم
دبوس بيانات المصفوفة (مصفوفة RGB مدمجة)
على الرغم من أن مصفوفة RGB مرتبطة بلوحة ESP32-S3، إلا أنه يجب تعريف دبوس البيانات في الكود.

#define MATRIX_PIN 14يتم استخدام GPIO 14 عادةً في لوحات مصفوفة RGB للـ ESP32-S3. إذا كانت نسخة لوحتك تستخدم دبوسًا مختلفًا، يرجى تحديث هذه القيمة.
اسم شبكة Wi-Fi وكلمة المرور (حساسة لحالة الأحرف)
استبدل بيانات Wi-Fi الخاصة بك بتفاصيل الشبكة الخاصة بك:
const char* WIFI_SSID = "your WIFI";
const char* WIFI_PASSWORD = "passW0rd";مهم:شبكات الواي فاي هيحساس لحالة الأحرف. اسم SSID يسمى"Book"ليس هو نفسه كما"book"إذا لم يتطابق تسجيل الأحرف تمامًا، فسيفشل ESP32-S3 في الاتصال.
خادم NTP، منطقة زمنية، وتوقيت الصيف
تزامن الساعة الوقت باستخدام خادم NTP عبر الإنترنت:
const char* ntpServer = "pool.ntp.org";يتم حساب الوقت المحلي باستخدام هذه الفروقات:
// Toronto-ish: UTC-5, plus 1 hour DST
const long gmtOffset_sec = -5 * 3600;
const int daylightOffset_sec = 3600;gmtOffset_sec: فرق التوقيت بالتوقيت العالمي المنسق بالثواني (مثال: UTC-5 =-5 * 3600)daylightOffset_secاستخدم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 الكلاسيكية لتوليد ألوان قوس قزح بسلاسة. يتم رسم كل حرف بلون مختلف قليلاً، وتتحول الألوان مع مرور الوقت، مما ينتج عنه رسوم متحركة لقوس قزح تتدفق.
// 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);
}بينما يتدفق النص، يتقدم كل حرف عبر طيف RGB، مما يخلق تأثير قوس قزح مستمر يبدو مثيرًا للإعجاب بشكل خاص على الشاشة الصغيرة 8×8.
سلوك عرض الوقت والتاريخ
يحافظ الساعة على مخازن منفصلة للوقت والتاريخ:
- الوقت:
HH:MM - تاريخ:
MMM DD(على سبيل المثالJAN 08)
تظهر التاريخ في فترة ثابتة:
const uint32_t dateIntervalMs = 60000; // Show date every 1 minuteفي نهاية كل دورة تمرير كاملة، يقرر الكود ما إذا كان سيستمر في عرض الوقت أو التحول إلى التاريخ.
منطق التمرير على مصفوفة 8×8
لأن العرض ضيق فقط 8 بكسل، يتم تمرير النص بسلاسة من اليمين إلى اليسار. بمجرد أن يخرج النص بالكامل من الشاشة، يعيد المؤشر ضبطه ويتم تحميل المحتوى التالي (الوقت أو التاريخ) للمرور التالي.
عرض
بعد تحميل الرسم التخطيطي وتشغيل اللوحة عبر USB-C:
- ESP32-S3 يتصل بشبكة الواي فاي الخاصة بك
- يتم مزامنة الوقت من الإنترنت
- تتقدم الوقت
HH:MMتنسيق - تظهر التاريخ بشكل دوري
- تُعرض جميع النصوص بتأثير قوس قزح مفعم بالحيوية وسلس.
- يتم تعتيم العرض تلقائيًا في الليل ويزداد سطوعه خلال النهار
التنزيلات والروابط
يتم توفير الشيفرة المصدرية الكاملة أدناه في هذه المقالة. كما تم ربط أدوات ومراجع مفيدة، بما في ذلك أداة اختيار لون RGB، أدناه في هذه المقالة.
هذا الدليل هو جزء من: مصفوفة مصابيح LED RGB من نوع ESP32-S3
- مشاريع مصفوفة LED الملونة ESP32-S3 (لعبة الميل، النص، السهم، عرض الواي فاي)
- مشروع مصفوفة LED RGB ESP32-S3 2 - نص متحرك
- مشروع مصفوفة LED RGB ESP32-S3 3 - نص من الهاتف المحمول
- مشروع مصفوفة LED RGB ESP32-S3 4 - نقطة مائلة
- مشروع مصفوفة LED RGB ESP32-S3 5 - السهم دائما لأعلى
- مشروع مصفوفة LEDs RGB ESP32-S3 6 - لعبة Cible
- مشروع ساعة بتوقيت NTP + Wi-Fi لمصفوفة LED RGB ESP32-S3 -1 ساعة أساسية
- مشروع ساعة الإنترنت لشاشة مصفوفة LED RGB ESP32-S3 - عرض الوقت والتاريخ متعدد الألوان 2 ساعة
- مشروع ساعة الإنترنت لمصفوفة LED RGB ESP32-S3 - 3 ألوان ليلية مع التاريخ
- مشروع ساعة الإنترنت لشبكة مصفوفة LEDs RGB ESP32-S3 - 4 ألوان عشوائية
- اختبار مصفوفة LED RGB ESP32-S3 لإعداد RGB و GRB
/*
* =====================================================================================
* 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();
}
}
الموارد والمراجع
-
فيديو
-
داخليأداة اختيار الألوانrobojax.com
ملفات📁
Fritzing File
-
جزء فريتزنج esp32-S3-supermini-tht
esp32-S3-supermini-tht.fzpz0.02 MB