Kod Ara

ESP32-S3 RGB LED Matris İnternet Saati Projesi - 5 Gökkuşağı rengi

ESP32-S3 RGB LED Matris İnternet Saati Projesi - 5 Gökkuşağı rengi

ESP32-S3 İnternet Saati Gökkuşağı Renk Efektli

Bu proje, Wi-Fi'ye bağlanan, NTP sunucusundan yerel saati senkronize eden ve saati SS:DD formatında dahili 8×8 RGB NeoMatrix üzerinde kayan bir ESP32-S3 RGB Matrix İnternet Saatidir. Sabit veya rastgele renkli sürümlerin aksine, bu saat, her karakter kayarken RGB spektrumunda sürekli olarak geçiş yapan yumuşak bir gökkuşağı renk efekti kullanır. Saat ayrıca periyodik olarak tarihi görüntüler ve gece ile gündüz arasında parlaklığı otomatik olarak ayarlar.

ESP32-s3_internet_clock_animation

Bu saat nasıl çalışır

USB-C üzerinden güç verildiğinde, ESP32-S3 Wi-Fi ağınıza bağlanır ve geçerli yerel saati internetten alır. Ekran normalde saati kaydırır, ancak belirli bir aralıkta tarihi göstermeye geçer. Hem saat hem de tarih, küçük 8×8 matriste canlı ve animasyonlu bir görüntü oluşturan dinamik bir gökkuşağı efekti kullanılarak işlenir.

Kullanılan kütüphaneler

Taslak aşağıdaki kütüphanelere dayanır:

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

Arduino Kütüphane Yöneticisi'ni kullanarak Adafruit NeoMatrix'i kurun. Adafruit GFX Library ve Adafruit NeoPixel dahil bağımlılıkları otomatik olarak kurulacaktır.

Önemli kullanıcı yapılandırması

Matris veri pini (dahili RGB matris)

RGB matris ESP32-S3 kartına bağlı olsa da, veri pini yine de kodda tanımlanmalıdır:

#define MATRIX_PIN 14

GPIO 14, ESP32-S3 RGB matris kartlarında yaygın olarak kullanılır. Kart varyantınız farklı bir pin kullanıyorsa, bu değeri güncelleyin.

Wi-Fi SSID ve şifre (büyük/küçük harf duyarlı)

Wi-Fi kimlik bilgilerini kendi ağ bilgilerinizle değiştirin:

const char* WIFI_SSID     = "your WIFI";
const char* WIFI_PASSWORD = "passW0rd";

Önemli: Wi-Fi SSID'leri büyük/küçük harf duyarlıdır. "Book" adlı bir SSID, "book" ile aynı değildir. Büyük harf kullanımı tam olarak eşleşmezse, ESP32-S3 bağlanamaz.

NTP sunucusu, saat dilimi ve yaz saati uygulaması

Saat, bir internet NTP sunucusu kullanarak zamanı senkronize eder:

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

Yerel saat şu ofsetler kullanılarak hesaplanır:

// Toronto benzeri: UTC-5, artı 1 saat DST
const long  gmtOffset_sec     = -5 * 3600;
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec: UTC ofseti saniye cinsinden (örnek: UTC-5 = -5 * 3600)
  • daylightOffset_sec: DST aktifse 3600, kullanılmıyorsa 0 kullanın

Bu değerler şu şekilde uygulanır:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Otomatik gündüz / gece parlaklığı

Parlaklık, geçerli saate göre otomatik olarak değişir:

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

Akşam 10 ile sabah 6 arasında matris, parlamayı azaltmak için kısılır. Gündüz saatlerinde normal parlaklık geri yüklenir.

Gökkuşağı renk efekti

Bu proje, yumuşak gökkuşağı renkleri oluşturmak için klasik bir RGB renk çarkı kullanır. Her karakter, hafifçe farklı bir renk ofsetiyle çizilir ve renkler zamanla kayarak akan bir gökkuşağı animasyonu üretir.

// Gökkuşağı Renkleri oluşturmak için yardımcı
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);
}

Metin kaydıkça, her karakter RGB spektrumunda ilerleyerek küçük 8×8 ekranda özellikle etkileyici görünen sürekli bir gökkuşağı efekti oluşturur.

Saat ve tarih görüntüleme davranışı

Saat, saat ve tarih için ayrı tamponlar tutar:

  • Saat: SS:DD
  • Tarih: AAA GG (örneğin OCA 08)

Tarih, sabit bir aralıkta gösterilir:

const uint32_t dateIntervalMs = 60000; // Tarihi her 1 dakikada bir göster

Her tam kaydırma döngüsünün sonunda, kod saati göstermeye devam edip etmeyeceğine veya tarihe geçip geçmeyeceğine karar verir.

8×8 matriste kaydırma mantığı

Ekran yalnızca 8 piksel genişliğinde olduğundan, metin sağdan sola doğru yumuşak bir şekilde kayar. Metin ekrandan tamamen çıktığında, imleç sıfırlanır ve bir sonraki geçiş için sonraki içerik (saat veya tarih) yüklenir.

Gösterim

Taslağı yükledikten ve kartı USB-C üzerinden güç verdikten sonra:

  • ESP32-S3 Wi-Fi ağınıza bağlanır
  • Saat internetten senkronize edilir
  • Saat SS:DD formatında kayar
  • Tarih periyodik olarak görünür
  • Tüm metin yumuşak animasyonlu bir gökkuşağı efektiyle işlenir
  • Ekran gece otomatik olarak kısılır ve gündüz parlaklaşır

İndirmeler ve bağlantılar

Bu makalenin altında kaynak kodun tamamı verilmiştir. RGB Renk Seçici dahil olmak üzere faydalı araçlar ve referanslar da bu makalenin altında bağlantılı olarak sunulmuştur.

Görseller

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

Kaynaklar ve referanslar

Dosyalar📁

Fritzing Dosyası