Kod Ara

ESP32-S3 RGB LED Matris İnternet Saati Projesi - Tarih ile 3 Gece Rengi

ESP32-S3 RGB LED Matris İnternet Saati Projesi - Tarih ile 3 Gece Rengi

ESP32-S3 RGB NeoMatrix İnternet Saati ile Otomatik Gündüz/Gece Parlaklığı

Bu proje, gündüz ve gece boyunca parlaklığı otomatik olarak ayarlayan bir ESP32-S3 RGB Matrix İnternet Saatidir. ESP32-S3 Wi-Fi'ye bağlanır, bir NTP sunucusundan geçerli saati senkronize eder ve saati 8×8 RGB NeoMatrix üzerinde HH:MM formatında kaydırır. Saat ayrıca ekran metni için sabit veya döngüsel RGB renklerini destekler.

Bu saat ne yapar

Güç verildikten sonra ESP32-S3 Wi-Fi ağınıza bağlanır ve geçerli yerel saati internetten alır. Saat LED matris üzerinde sorunsuz bir şekilde kayar. Gece saatlerinde ekran otomatik olarak daha düşük bir parlaklığa kısılırken, gündüz saatlerinde daha parlak bir seviyeye geri döner.

ESP32-s3_internet_clock_animation

Kullanılan kütüphaneler

Bu taslak aşağıdaki kütüphaneleri kullanı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'nden Adafruit NeoMatrix kurun. Adafruit GFX Library ve Adafruit NeoPixel gibi gerekli tüm bağımlılıklar otomatik olarak kurulacaktır.

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

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

Aşağıdaki değerleri kendi Wi-Fi kimlik bilgilerinizle değiştirin:

const char* WIFI_SSID     = "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 bağlanamaz.

NTP sunucusu, saat dilimi ve yaz saati uygulaması

Saat, aşağıdaki NTP sunucusunu kullanarak zamanı senkronize eder:

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

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

const long  gmtOffset_sec     = -5 * 3600; 
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec, UTC ofsetinizi saniye cinsinden tanımlar
  • daylightOffset_sec, yaz saati uygulaması aktifken bir saat ekler (gerekmiyorsa 0 kullanın)

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

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

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

Ekran parlaklığı, 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; // 10 PM
const int NIGHT_END_HOUR = 6;    // 6 AM

22:00 ile 06:00 arasında matris parlaklığı, karanlık ortamlarda rahat olması için azaltılır. Bu saatlerin dışında tam gündüz parlaklığı geri yüklenir. Bu değerleri odanızın aydınlatmasına göre ayarlayabilirsiniz.

RGB renk yapılandırması

Saat metni rengi, her kanalın 0 ile 255 arasında değiştiği RGB (Kırmızı, Yeşil, Mavi) değerleri kullanılarak tanımlanır. Birden fazla renk bir dizide saklanabilir ve otomatik olarak döngüye alınabilir:

uint8_t userColors[][3] = {
  {17, 43, 171},  // Açık Mavi
  {255, 0, 0},    // Kırmızı
  {0, 255, 0},    // Yeşil
  {255, 165, 0},  // Turuncu
  {255, 0, 255}   // Magenta
};

useFixedColor true olarak ayarlanırsa, saat her zaman tek bir renk kullanır. false olarak ayarlanırsa, renk saatin her tam kaydırılmasından sonra otomatik olarak değişir.

Herhangi bir renk için tam RGB değerlerini hızlıca bulmak üzere RGB Renk Seçici aracını kullanın: Renk Seçici .

Saat görüntüleme ve kaydırma

Geçerli saat HH:MM biçiminde biçimlendirilir ve küçük bir karakter tamponunda saklanır. Ekran yalnızca 8 piksel genişliğinde olduğundan, metin sağdan sola doğru sorunsuz bir şekilde kayar. Saat ekrandan tamamen çıktığında, bir sonraki geçiş için bir sonraki renk (etkinse) seçilir.

Gösterim

Taslağı yükledikten sonra:

  • ESP32-S3 Wi-Fi'ye bağlanır
  • Saat internetten senkronize edilir
  • Geçerli saat RGB matris üzerinde kayar
  • Parlaklık gündüz ve gece arasında otomatik olarak değişir
  • Metin rengi sabit kalır veya ayarlarınıza göre döngüye girer

İndirmeler ve bağlantılar

Tam kaynak kodu bu makalenin altında verilmiştir. Parça, araç ve veri sayfalarına bağlantılar bu makalenin altında mevcuttur.

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
870-ESP32-S3 RGB LED Matrix Internte Clock Project 3 - Night Color with Date
Dil: C++
/*
 * =====================================================================================
 * ESP32-S3 INTERNET RGB CLOCK (8x8 Matrix) - Project 3- Night color with Date
 * =====================================================================================
 watch video https://youtube.com/shorts/4iWjLiD7fS8
 📚⬇️ Download and resource page https://robojax.com/RJT840
 * 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).
 * =====================================================================================
 */

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

#define MATRIX_PIN 14

// --- BRIGHTNESS CONFIGURATION ---
const int DAY_BRIGHTNESS = 40;
const int NIGHT_BRIGHTNESS = 5;
const int NIGHT_START_HOUR = 22; // 10 PM
const int NIGHT_END_HOUR = 6;    // 6 AM

// --- COLOR CONFIGURATION ---
bool useFixedColor = false; 
int fixedColorIndex = 0;    
uint8_t userColors[][3] = {
  {17, 43, 171},  // Light Blue
  {255, 0, 0},    // Red
  {0, 255, 0},    // Green
  {255, 165, 0},  // Orange
  {255, 0, 255}   // Magenta
};

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

int currentColorIndex = 0;
int totalColors = sizeof(userColors) / sizeof(userColors[0]);

// --- INTERVALS ---
unsigned long lastTimeUpdateMs = 0;
const uint16_t timeUpdateIntervalMs = 1000;
unsigned long lastScrollMs = 0;
const uint16_t scrollIntervalMs = 100;

// --- GLOBAL VARIABLES ---
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;


const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec     = -5 * 3600; 
const int   daylightOffset_sec = 3600;

void updateTimeText() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return;
  
  // Format HH:MM
  snprintf(timeText, sizeof(timeText), "%02d:%02d", timeinfo.tm_hour, timeinfo.tm_min);

  // Apply Auto-Brightness
  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);
  
  // Pick the color (Fixed or Cycle)
  int idx = useFixedColor ? fixedColorIndex : currentColorIndex;
  matrix.setTextColor(matrix.Color(userColors[idx][0], userColors[idx][1], userColors[idx][2]));

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

  scrollX--;

  // Width for "HH:MM" is roughly 30 pixels
  int16_t textWidth = 30;
  
  // TRIGGER: When time is fully off-screen
  if (scrollX < -textWidth) {
    scrollX = matrix.width(); // Reset position to right side
    
    // Cycle to the next color in the array for the next pass
    if (!useFixedColor) {
      currentColorIndex = (currentColorIndex + 1) % totalColors;
      Serial.print("Next cycle color index: ");
      Serial.println(currentColorIndex);
    }
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(DAY_BRIGHTNESS);
  
  updateTimeText();
}

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

  // Update time digits and brightness once per second
  if (now - lastTimeUpdateMs >= timeUpdateIntervalMs) {
    lastTimeUpdateMs = now;
    updateTimeText(); 
  }

  // Handle the scrolling animation
  if (now - lastScrollMs >= scrollIntervalMs) {
    lastScrollMs = now;
    scrollTime();
  }
}

İhtiyacın olabileceğini düşünüyor

Kaynaklar ve referanslar

Dosyalar📁

Fritzing Dosyası