#include <WiFi.h>
#include <time.h>
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
#define BUFFER_SIZE 30
#define BAUD_RATE 115200
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 1
#define CLK_PIN 18
#define DATA_PIN 23
#define CS_PIN 21
// consts
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* NTP_SERVER = "pool.ntp.org";
const char* TZ_INFO = "IST-2IDT,M3.4.4/26,M10.5.0"; // enter your time zone (https://remotemonitoringsystems.ca/time-zone-abbreviations.php)
const char* datetime_format = "%H:%M";
const uint scroll_speed = 100;
// globals
tm timeinfo;
time_t now;
long unsigned lastNTPtime;
unsigned long lastEntryTime;
char buffer[BUFFER_SIZE];
MD_Parola ledMatrix = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
/****************************************
* Main Functions (`setup` and `loop`)
****************************************/
void setup() {
setupSerial(BAUD_RATE);
setupWifi();
setupTime();
setupLedMatrix();
ledMatrix.displayScroll("Starting...", PA_CENTER, PA_SCROLL_LEFT, scroll_speed );
while (!ledMatrix.getZoneStatus(0)) {
ledMatrix.displayAnimate();
}
ledMatrix.displayReset();
}
void loop() {
getTime(buffer, BUFFER_SIZE);
ledMatrix.displayScroll(buffer, PA_CENTER, PA_SCROLL_LEFT, scroll_speed);
while (!ledMatrix.getZoneStatus(0)) {
ledMatrix.displayAnimate();
}
ledMatrix.displayReset();
delay(1000);
}
/****************************************
* Helper Functions
****************************************/
void setupWifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(200);
Serial.print(".");
}
Serial.println("WiFi connected");
}
void setupSerial(int baud_rate) {
Serial.begin(baud_rate);
while (!Serial) {
delay(10);
}
}
void setupTime() {
configTime(0, 0, NTP_SERVER);
setenv("TZ", TZ_INFO, 1);
syncNTPtime();
}
void setupLedMatrix() {
ledMatrix.begin();
ledMatrix.setIntensity(0);
ledMatrix.displayClear();
}
void updateTime() {
time(&now);
localtime_r(&now, &timeinfo);
}
void getTime(char* buffer, uint len) {
if (!buffer) {
return;
}
updateTime();
strftime(buffer, len, datetime_format, localtime(&now));
}
void syncNTPtime() {
uint32_t start = millis();
Serial.print("Syncing time...");
while (timeinfo.tm_year < (2016 - 1900)) {
time(&now);
localtime_r(&now, &timeinfo);
delay(10);
}
char buffer[BUFFER_SIZE];
strftime(buffer, BUFFER_SIZE, datetime_format, localtime(&now));
Serial.printf("\nFinishd: now is: %s\n", buffer);
}