Search Code

Mradi wa Saa ya Mtandao ya Matrix ya LED ya RGB ya ESP32-S3 - Rangi 5 za Upinde wa mvua

Mradi wa Saa ya Mtandao ya Matrix ya LED ya RGB ya ESP32-S3 - Rangi 5 za Upinde wa mvua

Saa ya Mtandao ya ESP32-S3 yenye Athari ya Rangi ya Upinde wa mvua

Mradi huu ni Saa ya Mtandao ya RGB Matrix ya ESP32-S3 inayounganisha kwenye Wi-Fi, husawazisha muda wa eneo kutoka kwa seva ya NTP, na husogeza saa katika muundo wa HH:MM kwenye NeoMatrix ya RGB ya 8×8 iliyojengewa ndani. Tofauti na matoleo ya rangi thabiti au ya nasibu, saa hii hutumia athari laini ya rangi ya upinde wa mvua, ambapo kila herufi hubadilika kila mara kupitia wigo wa RGB inaposogea. Saa pia huonyesha tarehe mara kwa mara na hubadilisha mwangaza kiotomatiki kati ya mchana na usiku.

Uhuishaji wa saa ya mtandao ya ESP32-s3

Jinsi saa hii inavyofanya kazi

Mara tu inapowashwa kupitia USB-C, ESP32-S3 huunganisha kwenye mtandao wako wa Wi-Fi na kupata muda wa sasa wa eneo kutoka kwenye mtandao. Onyesho kwa kawaida husogeza saa, lakini kwa muda uliowekwa hubadilika kuonyesha tarehe. Saa na tarehe zote mbili huonyeshwa kwa kutumia athari ya nguvu ya upinde wa mvua, na kuunda onyesho la kuvutia na la uhuishaji kwenye matrix ndogo ya 8×8.

Maktaba zilizotumika

Sketch hii inategemea maktaba zifuatazo:

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

Sakinisha Adafruit NeoMatrix kwa kutumia Meneja wa Maktaba wa Arduino. Vitegemezi vyake, vikiwemo Adafruit GFX Library na Adafruit NeoPixel, vitasakinishwa kiotomatiki.

Usanidi muhimu wa mtumiaji

Pini ya data ya Matrix (matrix ya RGB iliyojengewa ndani)

Ingawa matrix ya RGB imeunganishwa kwenye bodi ya ESP32-S3, pini ya data bado lazima ifafanuliwe kwenye msimbo:

#define MATRIX_PIN 14

GPIO 14 hutumika kwa kawaida kwenye bodi za matrix za RGB za ESP32-S3. Ikiwa lahaja ya bodi yako inatumia pini tofauti, sasisha thamani hii.

SSID na nenosiri la Wi-Fi (nyeti kwa herufi kubwa/ndogo)

Badilisha hati za Wi-Fi na maelezo yako ya mtandao:

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

Muhimu: SSID za Wi-Fi ni nyeti kwa herufi kubwa/ndogo. SSID inayoitwa "Book" si sawa na "book". Ikiwa herufi kubwa hazilingani haswa, ESP32-S3 itashindwa kuunganisha.

Seva ya NTP, eneo la saa, na muda wa kuokoa mchana

Saa husawazisha muda kwa kutumia seva ya NTP ya mtandao:

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

Muda wa eneo huhesabiwa kwa kutumia maofseti haya:

// Toronto-ish: UTC-5, plus 1 hour DST
const long  gmtOffset_sec     = -5 * 3600;
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec: Ofseti ya UTC kwa sekunde (mfano: UTC-5 = -5 * 3600)
  • daylightOffset_sec: Tumia 3600 ikiwa DST ipo, au 0 ikiwa haitumiki

Thamani hizi hutumika kwa kutumia:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Mwangaza otomatiki wa mchana / usiku

Mwangaza hubadilika kiotomatiki kulingana na saa ya sasa:

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

Kati ya saa 10 jioni na saa 6 asubuhi, matrix hupunguza mwangaza ili kupunguza mng'ao. Wakati wa mchana, mwangaza wa kawaida hurudishwa.

Athari ya rangi ya upinde wa mvua

Mradi huu hutumia gurudumu la kawaida la rangi za RGB kuzalisha rangi laini za upinde wa mvua. Kila herufi huchorwa kwa ofseti tofauti kidogo ya rangi, na rangi hubadilika kwa wakati, na kutoa uhuishaji wa upinde wa mvua unaotiririka.

// 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);
}

Maandishi yanaposogea, kila herufi hupitia wigo wa RGB, na kuunda athari ya upinde wa mvua inayoendelea ambayo inaonekana ya kuvutia haswa kwenye onyesho dogo la 8×8.

Tabia ya kuonyesha saa na tarehe

Saa hudumisha bafa tofauti za saa na tarehe:

  • Saa: HH:MM
  • Tarehe: MMM DD (kwa mfano JAN 08)

Tarehe huonyeshwa kwa muda uliowekwa:

const uint32_t dateIntervalMs = 60000; // Show date every 1 minute

Mwishoni mwa kila mzunguko kamili wa usogeaji, msimbo huamua kuendelea kuonyesha saa au kubadilisha kwenda tarehe.

Mantiki ya usogeaji kwenye matrix ya 8×8

Kwa sababu onyesho lina upana wa pikseli 8 tu, maandishi husogea laini kutoka kulia kwenda kushoto. Mara tu maandishi yanapotoka kabisa kwenye skrini, mshale hurejeshewa na maudhui yanayofuata (saa au tarehe) hupakiwa kwa mzunguko unaofuata.

Maonyesho

Baada ya kupakia sketch na kuwasha bodi kupitia USB-C:

  • ESP32-S3 huunganisha kwenye mtandao wako wa Wi-Fi
  • Muda husawazishwa kutoka kwenye mtandao
  • Saa husogea katika muundo wa HH:MM
  • Tarehe huonekana mara kwa mara
  • Maandishi yote huonyeshwa kwa athari laini ya upinde wa mvua yenye uhuishaji
  • Onyesho hupunguza mwangaza kiotomatiki usiku na kuongeza mchana

Upakuaji na viungo

Chanzo kamili cha msimbo kimetolewa hapa chini ya makala hii. Zana muhimu na marejeo, ikiwa ni pamoja na Kichagua Rangi cha RGB, pia vimeunganishwa hapa chini ya makala hii.

Bilder

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
Språk: 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();
  }
}

Resurser och referenser

Filer📁

Fritzing-fil