/*********************************************************************
* LED‑matrix hodiny / kalendár – 4 × 8×8 moduly (FC‑16 / MAX7219)
* – zobrazuje čas, dátum a názov dňa v týždni
* – každých 5 s prepína medzi režimami
*
* Autor: (vaše meno)
* Dátum: 2025‑12‑28
*********************************************************************/
#include <MD_Parola.h>
#include <MD_MAX72xx.h> // <<--- dôležité, s .h
#include <SPI.h>
#include <Wire.h>
#include "RTClib.h"
/* ---------- nastavenie hardvéru ---------- */
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW // najčastejší typ pre FC‑16 moduly
// #define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW // ← alternatíva ak FC16 nefunguje
#define MAX_DEVICES 4 // počet 8×8 modulov vo reťazci
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
/* ---------- objekty ---------- */
MD_Parola display(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
RTC_DS3231 rtc;
/* ---------- premenné ---------- */
unsigned long lastMillis = 0; // čas posledného prepnutia
uint8_t mode = 0; // 0 = čas, 1 = dátum, 2 = deň v týždni
/* ---------- názvy dní (bez diakritiky – jednoduchšie) ---------- */
const char *weekdayName[] = {
"Nedela", "Pondelok", "Utorok", "Streda",
"Stvrtok", "Piatok", "Sobota"
};
/* ---------- pomocná funkcia – voliteľná ---------- */
inline void showBuffer(const char *txt,
uint16_t speed, uint16_t pause,
textEffect_t inEffect, textEffect_t outEffect)
{
display.displayClear(); // najskôr vymažeme predchádzajúci obsah
display.displayText(txt, // text, ktorý chceme zobrazovať
PA_CENTER, // centrovať na celú reťaz
speed, // rýchlosť scrollu (0 = okamžite)
pause, // pauza po úplnom zastavení (ms)
inEffect, // efekt pri vstupe
outEffect); // efekt pri výstupe
}
/* ---------- setup ---------- */
void setup()
{
Serial.begin(9600);
Wire.begin();
if (!rtc.begin()) {
Serial.println(F("❌ DS3231 sa nenašiel!"));
while (1) ; // zastavíme program – môžete pridať blikajúci signál
}
if (rtc.lostPower()) {
Serial.println(F("🔧 RTC stratil napájanie – nastavujem na čas kompilácie"));
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
display.begin();
display.setIntensity(5); // 0 (najtichší) … 15 (max)
display.displayClear(); // istota, že je čistá
}
/* ---------- hlavná slučka ---------- */
void loop()
{
DateTime now = rtc.now();
/* ---- každých 5 s zmeníme režim ---- */
if (millis() - lastMillis >= 5000UL) {
lastMillis = millis();
mode = (mode + 1) % 3; // 0 → 1 → 2 → 0
char buf[32]; // dostatočne veľký buffer pre všetky reťazce
if (mode == 0) { // ---- ČAS ----
sprintf(buf, "%02d:%02d", now.hour(), now.minute());
showBuffer(buf, 0, 0, PA_PRINT, PA_NO_EFFECT); // okamžitý výpis
}
else if (mode == 1) { // ---- DÁTUM ----
sprintf(buf, "%02d/%02d/%04d", now.day(), now.month(), now.year());
showBuffer(buf, 30, 1500, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
}
else { // ---- DEŇ V TÝŽDNÍ ----
sprintf(buf, "%s", weekdayName[now.dayOfTheWeek()]);
showBuffer(buf, 30, 1500, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
}
}
/* ---- animácia PAROLA – MUSÍ sa volať vždy! ---- */
display.displayAnimate(); // posúva text, roluje efekty, atď.
}