#include <Wire.h> //For WiFi Network Connection
#include <MD_Parola.h> //For MAX7219 Matrix LED
//#include <MD_MAX72xx.h> //For MAX7219 SPI LED Driver
#include <SPI.h> //For SPI Communication
#include <time.h> //For Time Based Application
#include "Fonts.h"
#include <MD_DS1307.h>
//=====MAX7219================================
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4
#define CLK_PIN 13
#define DATA_PIN 11
#define CS_PIN 10
MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
//MD_MAX72xx display = MD_MAX72xx(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
#define SPEED_TIME 60 //数字越小越快,0最快
#define PAUSE_TIME 0
#define MAX_MESG 20
int Mode = 0;
// Global variables
char szTime[9]; // hh:mm
char szsecond[4]; // ss
char szMesg[MAX_MESG+1] = "";
char *mon2str(uint8_t mon, char *psz, uint8_t len)
// ==========月份----从PROGMEM获取一个标签到一个char数组中
{
static const __FlashStringHelper* str[] =
{
F("Jan"), F("Feb"), F("Mar"), F("Apr"),
F("May"), F("Jun"), F("Jul"), F("Aug"),
F("Sep"), F("Oct"), F("Nov"), F("Dec")
};
strncpy_P(psz, (const char PROGMEM *)str[mon-1], len);
psz[len] = '\0';
return(psz);
}
char *dow2str(uint8_t code, char *psz, uint8_t len)
// ==========星期==========
{
static const __FlashStringHelper* str[] =
{
F("Sunday"), F("Monday"), F("Tuesday"),F("Wednesday"),
F("Thursday"), F("Friday"),
F("Saturday")
};
strncpy_P(psz, (const char PROGMEM *)str[code-1], len);
psz[len] = '\0';
return(psz);
}
void getTime(char *psz, bool f = true)
// ==========时间==========
{
RTC.readTime();
sprintf(psz, "%02d%c%02d", RTC.h, ':', RTC.m);
//sprintf(psz, "%02d%c%02d", RTC.h, (f ? ':' : ' '), RTC.m); //冒号闪
}
void getDate(char *psz)
//========== 日期==========
{
char szBuf[10];
RTC.readTime();
sprintf(psz, "%d %s %04d", RTC.dd, mon2str(RTC.mm, szBuf, sizeof(szBuf)-1), RTC.yyyy); // m-d-y
//sprintf(psz, " %d %s %d",RTC.yyyy, (RTC.mm, szBuf, sizeof(szBuf)-1), RTC.dd); //y-m-d
}
void gethh(char *psz, bool f = true)
// Code for reading clock time
{
RTC.readTime();
sprintf(psz, "%c%02d%c%02d", (f ? ':' : ' '), RTC.h, (f ? ':' : ' '), RTC.m);
}
void getmin(char *psz, bool f = true)
// Code for reading clock time
{
RTC.readTime();
sprintf(psz, "%02d%c%02d%c", RTC.h, (f ? ':' : ' '), RTC.m, (f ? ':' : ' '));
}
void getsec(char *psz)
// Code for reading clock date
{
char szBuf[10];
RTC.readTime();
sprintf(psz, "%02d", RTC.s);
}
void getdyy(char *psz)
{
char szBuf[10];
RTC.readTime();
sprintf(psz, "%02d", RTC.dd);
}
void getmon(char *psz)
// Code for reading clock date
{
char szBuf[10];
RTC.readTime();
sprintf(psz, "%s", mon2str(RTC.mm, szBuf, sizeof(szBuf)-1));
}
void getyyyy(char *psz)
// Code for reading clock date
{
char szBuf[10];
RTC.readTime();
sprintf(psz, "%04d", RTC.yyyy);
}
void setup(void)
{
P.begin(3);
P.setInvert(false);
P.setIntensity(0,1); //(区域,亮度0-15)
P.setZone(2, 0, 3);
P.setZone(1, 1, 3);
P.setZone(0, 4, 1);
P.setFont(2, GYD_PHP5X7);
P.setFont(1, Dig4x7p);
P.setFont(0, Dig3x5p);
P.displayZoneText(1, szTime, PA_LEFT, SPEED_TIME, PAUSE_TIME, PA_PRINT, PA_NO_EFFECT);
P.displayZoneText(0, szsecond, PA_LEFT, SPEED_TIME, 0, PA_PRINT, PA_NO_EFFECT);
P.displayZoneText(2, szMesg, PA_CENTER, SPEED_TIME, 0, PA_PRINT, PA_SCROLL_LEFT);
RTC.control(DS1307_CLOCK_HALT, DS1307_OFF);
RTC.control(DS1307_12H, DS1307_OFF);
getTime(szTime);
}
void loop(void)
{
if (Mode == 0)
{
static uint32_t lastTime = 0; // millis() memory
static bool flasher = false; // seconds passing flasher
P.displayAnimate();
P.setTextEffect(2, PA_PRINT, PA_NO_EFFECT);
P.getZoneStatus(1);
P.getZoneStatus(0);
if (millis() - lastTime >= 1000)
{
lastTime = millis();
getsec(szsecond);
getTime(szTime, flasher);
flasher = !flasher;
P.displayReset(1);
P.displayReset(0);
}
}
if (Mode == 1)
{
static uint8_t display = 0; // current display mode
P.displayAnimate();
P.getZoneStatus(2);
if (P.getZoneStatus(2))
{
switch (display)
{
case 0: // Time
P.setTextEffect(2, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
display++;
getTime(szMesg);
break;
case 1: // Day
P.setTextEffect(2, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
display++;
dow2str(RTC.dow, szMesg, MAX_MESG);
break;
default: // Calendar
P.setTextEffect(2, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
display++;
getDate(szMesg);
break;
}
P.displayReset(2);
}
}
if (Mode == 2) //星期
{
static uint8_t display = 0; // current display mode
P.displayAnimate();
P.getZoneStatus(2);
P.setTextEffect(2, PA_PRINT, PA_SCROLL_LEFT);
dow2str(RTC.dow, szMesg, MAX_MESG);
P.displayReset(2);
}
if (Mode == 3) //日
{
P.displayAnimate();
P.getZoneStatus(2);
P.setTextEffect(2, PA_PRINT, PA_NO_EFFECT);
getdyy(szMesg);
P.displayReset(2);
}
if (Mode == 4) //月份(简写)
{
P.displayAnimate();
P.getZoneStatus(2);
P.setTextEffect(2, PA_PRINT, PA_NO_EFFECT);
getmon(szMesg);
P.displayReset(2);
}
if (Mode == 5) //年
{
P.displayAnimate();
P.getZoneStatus(2);
P.setTextEffect(2, PA_PRINT, PA_NO_EFFECT);
getyyyy(szMesg);
P.displayReset(2);
}
}