//#include <ESP8266WiFi.h>
#include <TimeLib.h>
#define NUM_MAX 4
#define DIN_PIN 11 // D7
#define CS_PIN 10 // D3
#define CLK_PIN 13 // D5
#define MILLI_AMPS 2000
#define FRAMES_PER_SECOND 120
#include "max7219_hr.h"
#include "fonts.h"
//WiFiClient client;
// =======================================================================
// CHANGE YOUR CONFIG HERE:
// =======================================================================
const char* ssid = "SSID"; // SSID of local network
const char* password = "PASSWORD"; // Password on network
String date;
byte hourval, minuteval, secondval, oldsec;
int cyclesPerSec;
long newSecTime;
int subSeconds;
void digitalClockDisplay();
void printDigits(int digits);
#define MAX_DIGITS 16
byte dig[MAX_DIGITS] = {0};
byte digold[MAX_DIGITS] = {0};
byte digtrans[MAX_DIGITS] = {0};
int updCnt = 0;
int dots = 0;
long dotTime = 0;
long clkTime = 0;
int dx = 0;
int dy = 0;
byte del = 0;
int h, m, s;
char timeIs [10];
//int mode = 1; // Variable of the display mode of the clock
//int modeMax = 6; // Change this when new modes are added. This is so selecting modes can go back beyond.
//int LEDOffset = 0;
void setup()
{
Serial.begin(115200);
initMAX7219();
sendCmdAll(CMD_SHUTDOWN, 1);
sendCmdAll(CMD_INTENSITY, 1);
//Serial.print("Connecting WiFi ");
//WiFi.begin(ssid, password);
printStringWithShift(" WIFI ", 15);
setTime(16, 39, 20, 31, 3, 2024);
delay(1000);
}
//uint32_t prevDisplay = 0; // when the digital clock was displayed
uint8_t lastSecond = 0;
void loop()
{
/*
if (updCnt <= 0) { // every 10 scrolls, ~450s=7.5m
updCnt = 20;
Serial.println("Getting data ...");
printStringWithShift(" Sync...", 15);
Serial.println("Data loaded");
clkTime = millis();
}
if (millis() - clkTime > 30000 && !del && dots) { // clock for 30s, then scrolls for about 30s
printStringWithShift(" Welcome ", 20);
printStringWithShift("Sun 7th April 2024", 20);
printStringWithShift(" Time: ", 20);
//printStringWithShift(weatherString.c_str(),40);
updCnt--;
clkTime = millis();
}
*/
if (millis() - dotTime >= 500) {
dotTime = millis();
dots = !dots;
}
//if (now() != prevDisplay) { //update the display only if time has changed
if (second() != lastSecond) {
//prevDisplay = now();
lastSecond = second();
updateTime();
digitalClockDisplay();
}
showAnimClock();
}
// =======================================================================
void showSimpleClock()
{
dx = dy = 0;
clr();
showDigit(h / 10, 0, dig6x8);
showDigit(h % 10, 8, dig6x8);
showDigit(m / 10, 17, dig6x8);
showDigit(m % 10, 25, dig6x8);
showDigit(s / 10, 34, dig6x8);
showDigit(s % 10, 42, dig6x8);
setCol(15, dots ? B00100100 : 0);
setCol(32, dots ? B00100100 : 0);
refreshAll();
}
// =======================================================================
void showAnimClock() {
byte digPos[6] = {0, 5, 12, 17, 24, 28};
int digHt = 8;
int num = 6;
int i;
if (del == 0) {
del = digHt;
for (i = 0; i < num; i++) digold[i] = dig[i];
dig[0] = h / 10;
dig[1] = h % 10;
dig[2] = m / 10;
dig[3] = m % 10;
dig[4] = s / 10;
dig[5] = s % 10;
for (i = 0; i < num; i++) digtrans[i] = (dig[i] == digold[i]) ? 0 : digHt;
} else
del--;
clr();
for (i = 0; i < num; i++) {
if (digtrans[i] == 0) {
dy = 0;
showDigit(dig[i], digPos[i], i < 4 ? dig4x7 : dig3x5);
} else {
dy = digHt - digtrans[i];
showDigit(digold[i], digPos[i], i < 4 ? dig4x7 : dig3x5);
dy = -digtrans[i];
showDigit(dig[i], digPos[i], i < 4 ? dig4x7 : dig3x5);
digtrans[i]--;
}
}
dy = 0;
setCol(10, dots ? B00010100 : 0);
setCol(22, dots ? B00010100 : 0);
refreshAll();
delay(30);
}
// =======================================================================
void showDigit(char ch, int col, const uint8_t *data)
{
if (dy < -8 | dy > 8) return;
int len = pgm_read_byte(data);
int w = pgm_read_byte(data + 1 + ch * len);
col += dx;
for (int i = 0; i < w; i++)
if (col + i >= 0 && col + i < 8 * NUM_MAX) {
byte v = pgm_read_byte(data + 1 + ch * len + 1 + i);
if (!dy) scr[col + i] = v; else scr[col + i] |= dy > 0 ? v << dy : v >> -dy;
}
}
// =======================================================================
void setCol(int col, byte v)
{
if (dy < -8 | dy > 8) return;
col += dx;
if (col >= 0 && col < 8 * NUM_MAX)
if (!dy) scr[col] = v; else scr[col] |= dy > 0 ? v >> dy : v << -dy;
}
// =======================================================================
int showChar(char ch, const uint8_t *data)
{
int len = pgm_read_byte(data);
int i, w = pgm_read_byte(data + 1 + ch * len);
for (i = 0; i < w; i++)
scr[NUM_MAX * 8 + i] = pgm_read_byte(data + 1 + ch * len + 1 + i);
scr[NUM_MAX * 8 + i] = 0;
return w;
}
// =======================================================================
void printCharWithShift(unsigned char c, int shiftDelay) {
if (c < ' ' || c > '~' + 25) return;
c -= 32;
int w = showChar(c, font);
for (int i = 0; i < w + 1; i++) {
delay(shiftDelay);
scrollLeft();
refreshAll();
}
}
// =======================================================================
void printStringWithShift(const char* s, int shiftDelay) {
while (*s) {
printCharWithShift(*s, shiftDelay);
s++;
}
}
/*
void DateString () {
}
*/
void updateTime()
{
h = hour();
m = minute();
s = second();
}
void digitalClockDisplay() {
// digital clock display of the time
sprintf(timeIs, "%02d:%02d:%02d", h, m, s);
Serial.println(timeIs);
}