Tafuta Msimbo

Mradi wa Saa ya Mtandao ya Matrix ya LED ya RGB ya ESP32-S3 - Saa 2 za rangi nyingi za Kuonyesha Muda na Tarehe

Mradi wa Saa ya Mtandao ya Matrix ya LED ya RGB ya ESP32-S3 - Saa 2 za rangi nyingi za Kuonyesha Muda na Tarehe

Saa ya Mtandao ya ESP32-S3 RGB NeoMatrix yenye Mwonekano wa Muda na Tarehe

Mradi huu ni saa ya mtandao ya ESP32-S3 RGB Matrix iliyoboreshwa ambayo haionyeshi muda wa sasa tu bali pia huonyesha tarehe mara kwa mara. ESP32-S3 huungana na Wi-Fi, husawazisha muda kutoka kwa seva ya NTP, na hutembeza ama HH:MM au tarehe (kwa mfano SEP 21) kwenye 8×8 RGB NeoMatrix. Mwonekano huu unaauni udhibiti wa mwangaza wa mchana/usiku kiotomatiki na rangi za RGB zinazoweza kubadilishwa.

ESP32-s3_internet_clock_animation

Nini saa hii hufanya

Baada ya kuungana na mtandao wako wa Wi-Fi, ESP32-S3 hupata muda wa sasa wa eneo lako kutoka kwenye mtandao. Saa kwa kawaida hutembeza muda, lakini kwa muda maalum hubadilika kuonyesha tarehe. Rangi ya maandishi inaweza kuwa ya kudumu kwa rangi moja au kubadilika kiotomatiki kati ya rangi nyingi zilizobainishwa na mtumiaji. Mwangaza hupunguzwa kiotomatiki usiku ili mwonekano usiudhi macho.

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 kutoka kwenye Arduino Library Manager. Vitegemezi vyote muhimu kama vile Adafruit GFX Library na Adafruit NeoPixel vitasakinishwa kiotomatiki.

Usanidi muhimu wa mtumiaji

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

Lazima ubadilishe vitambulisho vya Wi-Fi na taarifa za mtandao wako mwenyewe:

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

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

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

Saa hutumia seva ya muda ya mtandao:

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

Muda wa eneo huhesabiwa kwa kutumia marekebisho haya:

const long  gmtOffset_sec     = -5 * 3600; 
const int   daylightOffset_sec = 3600;
  • gmtOffset_sec: Marekebisho yako ya UTC kwa sekunde (mfano: UTC-5 = -5 * 3600)
  • daylightOffset_sec: Tumia 3600 kwa DST au 0 ikiwa DST haitumiki

Mipangilio hii inatumika kwa kutumia:

configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

Udhibiti wa mwangaza (mchana / usiku)

Mradi huu hubadilisha mwangaza kiotomatiki kulingana na saa ya siku:

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, mwangaza hupunguzwa ili mwonekano usisumbue katika mazingira ya giza. Unaweza kubadilisha thamani hizi kulingana na upendeleo wako.

Usanidi wa rangi za RGB

Saa inaauni hali ya rangi ya kudumu na hali ya kubadilisha rangi kiotomatiki. Rangi za RGB zilizobainishwa na mtumiaji huhifadhiwa kwenye safu:

uint8_t userColors[][3] = {
  {17, 43, 171},  // Bluu Nyepesi
  {255, 0, 0},    // Nyekundu
  {0, 255, 0},    // Kijani
  {255, 165, 0},  // Chungwa
  {255, 0, 255}   // Magenta
};

Kila rangi hutumia thamani za RGB (Nyekundu, Kijani, Bluu) kuanzia 0 hadi 255. Kwa kubadilisha nambari hizi, unaweza kuunda karibu rangi yoyote kwa mwonekano. Ikiwa useFixedColor imewekwa kuwa true, saa daima hutumia rangi moja. Ikiwa imewekwa kuwa false, rangi hubadilika kiotomatiki baada ya kila tembezi kamili.

Ili kupata haraka thamani sahihi za RGB kwa rangi yoyote unayotaka, tumia zana ya RGB Color Picker Color Picker .

Muundo wa muda na tarehe

Muda huundwa kama HH:MM na huhifadhiwa kwenye kihifadhi kidogo cha herufi. Tarehe huundwa kama mfuatano wa herufi kubwa kama vile SEP 21. Mwonekano hubadilika kiotomatiki kati ya muda na tarehe kwa muda maalum.

Mantiki ya utembezi kwenye mwonekano wa 8×8

Kwa sababu matrix ya 8×8 ni ndogo sana kuonyesha maandishi yote mara moja, sketch hutembeza maandishi kwa mlalo. Mara tu maandishi yanapoondoka kabisa kwenye mwonekano, rangi husasishwa na maudhui hubadilika kati ya muda na tarehe inapohitajika.

Maonyesho

Baada ya kupakia sketch:

  • ESP32 huungana na Wi-Fi
  • Muda husawazishwa kutoka kwenye mtandao
  • Muda wa sasa hutembea kwenye matrix
  • Tarehe inaonekana mara kwa mara
  • Mwangaza hubadilika kiotomatiki kwa mchana na usiku

Vipakuliwa na viungo

Msimbo kamili wa chanzo umetolewa hapa chini ya makala hii. Viungo vya sehemu, zana, na karatasi za data pia vinapatikana 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
869-ESP32-S3 RGB LED Matrix Internte Clock Project 2 - Multi Color with Date
Språk: C++
/*
 * =====================================================================================
 * ESP32-S3 INTERNET RGB CLOCK (8x8 Matrix) - Project 2
 Multi color
 * =====================================================================================
 watch video https://youtube.com/shorts/4iWjLiD7fS8
 📚⬇️ Download and resource page https://robojax.com/RJT839
 * Author:  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 when text finishes a full scroll.
 * 3. Auto-Brightness: Dims the LEDs during night hours (User-configurable).
 * 4. Periodic Date: Scrolls the date (e.g., "JAN 07") every 2 minutes.
 * * USER CONFIGURATION GUIDE:
 * -------------------------
 * - WiFi: Change 'WIFI_SSID' and 'WIFI_PASSWORD' to your local network.
 * - Colors: Add or remove {R, G, B} sets in the 'userColors' array.
 * - Night Mode: Adjust 'NIGHT_START_HOUR' and 'NIGHT_BRIGHTNESS'.
 * =====================================================================================
 */

#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; 
const int NIGHT_END_HOUR = 6;

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

// --- DATE/TIME INTERVALS ---
unsigned long lastDateShowMs = 0;
const uint32_t dateIntervalMs = 30000; // 2 minutes
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";
char dateText[10] = "";
char currentDisplayText[12] = ""; 
int16_t scrollX = 8;


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

void updateTimeAndDate() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) return;
  
  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]);

  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);
  
  // FIXED LOGIC: Uses currentColorIndex which only changes at the end of a scroll
  int idx = useFixedColor ? fixedColorIndex : currentColorIndex;
  matrix.setTextColor(matrix.Color(userColors[idx][0], userColors[idx][1], userColors[idx][2]));

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

  scrollX--;

  int16_t textWidth = strlen(currentDisplayText) * 6;
  
  // THE TRIGGER POINT: This happens only when text is fully off-screen
  if (scrollX < -textWidth) {
    scrollX = matrix.width(); 
    
    // 1. Cycle the color now and only now
    if (!useFixedColor) {
      currentColorIndex = (currentColorIndex + 1) % totalColors;
    }

    // 2. Decide whether to switch between Time and Date
    if (millis() - lastDateShowMs > dateIntervalMs) {
      strcpy(currentDisplayText, dateText);
      lastDateShowMs = millis();
    } else {
      strcpy(currentDisplayText, timeText);
    }
  }
}

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);
  
  updateTimeAndDate();
  strcpy(currentDisplayText, timeText); 
}

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

  if (now - lastTimeUpdateMs >= timeUpdateIntervalMs) {
    lastTimeUpdateMs = now;
    updateTimeAndDate(); 
  }

  if (now - lastScrollMs >= scrollIntervalMs) {
    lastScrollMs = now;
    scrollDisplay();
  }
}

Tänker att du kanske behöver

Resurser och referenser

Filer📁

Fritzing-fil