#include "Wire.h"
#include <MD_Parola.h>
#include "RTClib.h"
RTC_DS1307 RTC;
DateTime now;
//#define HARDWARE_TYPE MD_MAX72XX::FC16_HW // modified for 8x32 LED matrix panel
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW // WOKWI
//#define HARDWARE_TYPE MD_MAX72XX::DR0CR0RR0_HW // modified to be complatible with 8x20 matrix panel
#define MAX_DEVICES 4
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
int i = 9;
int Animation;
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
char monthOfTheYear[12][12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
struct sCatalog
{
textEffect_t effect;
const char * psz;
uint16_t speed;
uint16_t pause;
};
sCatalog catalog[] =
{
{ PA_PRINT, "", 80, 3000 },
{ PA_SCROLL_UP, "", 80, 3000 },
{ PA_SCROLL_DOWN, "", 80, 3000 },
{ PA_SCROLL_LEFT, "", 80, 3000 },
{ PA_SCROLL_RIGHT, "", 80, 3000 },
{ PA_SPRITE, "", 80, 3000 },
{ PA_SLICE, "", 15, 3000 },
{ PA_MESH, "", 150, 3000 },
{ PA_FADE, "", 250, 3000 },
{ PA_DISSOLVE, "", 500, 3000 },
{ PA_BLINDS, "", 120, 3000 },
{ PA_RANDOM, "", 50, 3000 },
{ PA_WIPE, "", 80, 3000 },
{ PA_WIPE_CURSOR, "", 80, 3000 },
{ PA_SCAN_HORIZ, "", 80, 3000 },
{ PA_SCAN_HORIZX, "", 80, 3000 },
{ PA_SCAN_VERT, "", 80, 3000 },
{ PA_SCAN_VERTX, "", 80, 3000 },
{ PA_OPENING, "", 80, 3000 },
{ PA_OPENING_CURSOR, "", 80, 3000 },
{ PA_CLOSING, "", 80, 3000 },
{ PA_CLOSING_CURSOR, "", 80, 3000 },
{ PA_SCROLL_UP_LEFT, "", 80, 3000 },
{ PA_SCROLL_UP_RIGHT, "", 80, 3000 },
{ PA_SCROLL_DOWN_LEFT, "", 80, 3000 },
{ PA_SCROLL_DOWN_RIGHT, "", 80, 3000 },
{ PA_GROW_UP, "", 80, 3000 },
{ PA_GROW_DOWN, "", 80, 3000 },
};
// Sprite Definitions
const uint8_t F_PMAN1 = 6;
const uint8_t W_PMAN1 = 8;
static const uint8_t PROGMEM pacman1[F_PMAN1 * W_PMAN1] = // gobbling pacman animation
{
0x00, 0x81, 0xc3, 0xe7, 0xff, 0x7e, 0x7e, 0x3c,
0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
};
const uint8_t F_PMAN2 = 6;
const uint8_t W_PMAN2 = 18;
static const uint8_t PROGMEM pacman2[F_PMAN2 * W_PMAN2] = // ghost pursued by a pacman
{
0x00, 0x81, 0xc3, 0xe7, 0xff, 0x7e, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe,
0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe,
0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00, 0x00, 0xfe, 0x73, 0xfb, 0x7f, 0xf3, 0x7b, 0xfe,
};
void setup()
{
Serial.begin(9600);
P.begin();
P.setInvert(false);
P.setIntensity(0);
Wire.begin();
RTC.begin();
if (! RTC.isrunning())
{
//Serial.println("RTC is NOT running!");
RTC.adjust(DateTime(__DATE__, __TIME__));
}
#if ENA_SPRITE
P.setSpriteData(pacman1, W_PMAN1, F_PMAN1, pacman2, W_PMAN2, F_PMAN2);
#endif
P.displayText("Digital clock ARDUINO" , PA_CENTER, 50, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
while (!P.displayAnimate());
}
String TIME = " ";
String HOUR = " ";
String MINUTE = " ";
String DATE = "";
String Day;
String Month;
String Year;
void loop()
{
String DayOfWeek = daysOfTheWeek[now.dayOfTheWeek()];
String MonthOfYear = monthOfTheYear[now.month() - 1];
const char *DayOfWeekC = DayOfWeek.c_str();
const char *MonthOfYearC = MonthOfYear.c_str();
HOUR = (now.hour());
if (HOUR.length() < 2)
{
HOUR = "0" + HOUR;
}
MINUTE = (now.minute());
if (MINUTE.length() < 2)
{
MINUTE = "0" + MINUTE;
}
TIME = HOUR + ":" + MINUTE;
const char *theTime = TIME.c_str();
Day = now.day();
Month = now.month();
Year = now.year();
const char *theDay = Day.c_str();
const char *theMonth = Month.c_str();
const char *theYear = Year.c_str();
String Date = Day + "/" + Month + "/" + Year;
const char *theDate = Date.c_str();
if (i == 1)
{ // show day of week
Serial.print("Day of week is: "); // as a word
Serial.println(DayOfWeekC);
Animation = random(1, 29);
P.displayText(DayOfWeekC, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
while (!P.displayAnimate());
}
if (i == 2)
{ // show day of month
Serial.print("Day of month is: "); // as a number
Serial.println(theDay);
Animation = random(1, 29);
P.displayText(theDay, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
while (!P.displayAnimate());
}
if (i == 3)
{
Serial.print("Month of year is: "); // as a word
Serial.println(MonthOfYearC);
Animation = random(1, 29);
P.displayText(MonthOfYearC, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
while (!P.displayAnimate());
}
if (i == 4)
{
Serial.print("Year is: "); // as a number
Serial.println(theYear);
Animation = random(1, 29);
P.displayText(theYear, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
while (!P.displayAnimate());
}
if (i == 5)
{
Serial.print("Time is: "); // Hours+Minutes
Serial.println(theTime);
Animation = random(1, 29);
P.displayText(theTime, PA_CENTER, catalog[Animation].speed, catalog[Animation].pause, catalog[Animation].effect, catalog[Animation].effect);
while (!P.displayAnimate());
}
Serial.print("i= ");
Serial.println(i);
i = i + 1;
if (i > 5)
{
i = 1;
};
} // void loop