#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "main.h"
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 8
#define CS1 27
#define CS2 26
#define SEC2PS(x) ((x) * 1000000)
#define SEC2MS(x) ((x) * 1000)
const char ssid[] = "Tuldok-House";
const char pass[] = "HelloWorld";
MD_Parola* line1;
MD_Parola* line2;
MBED_RPI_PICO_Timer clockTimer(0);
MBED_RPI_PICO_Timer updateTimer(1);
WiFiUDP ntpUdp;
NTPClient timeClient(ntpUdp, "time.google.com", 0, SEC2MS(64));
void setup() {
Serial.begin(115200); // USB UART
Serial1.begin(115200); // Serial line to the ESP-01 WiFi module
initWiFi();
initSpi();
initDisplay();
initTime();
initTimer();
}
void loop() {
timeClient.update();
sleep_ms(500);
}
void clockTick(uint alarmNum)
{
time_t now;
char buf[16];
time(&now);
auto tm = localtime(&now);
strftime(buf, 16, "%m/%d/%Y", tm);
line1->setTextAlignment(PA_CENTER);
line1->print(buf);
strftime(buf, 16, "%I:%M:%S %P", tm);
line2->setTextAlignment(PA_CENTER);
line2->print(buf);
}
void syncRtcTick(uint alarmNum)
{
timeval tv {.tv_sec = timeClient.getEpochTime()};
settimeofday(&tv, NULL);
}
void initWiFi()
{
WiFi.init(Serial1);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println("WiFi connected.");
}
void initDisplay()
{
line1 = new MD_Parola(HARDWARE_TYPE, SPI, CS1, 8);
line2 = new MD_Parola(HARDWARE_TYPE, SPI, CS2, 8);
line1->begin();
line2->begin();
line1->setIntensity(15);
line2->setIntensity(15);
line1->displayClear();
line2->displayClear();
}
void initTimer()
{
// clock tick interrupt
clockTimer.attachInterruptInterval(SEC2PS(1), clockTick);
// rtc sync interrupt
updateTimer.attachInterrupt(SEC2PS(5*60), syncRtcTick);
}
void initTime()
{
setenv("TZ", "Asia/Manila", 1);
tzset();
timeClient.update();
timeval tv {.tv_sec = timeClient.getEpochTime()};
settimeofday(&tv, NULL);
}
void initSpi()
{
SPI.begin();
pinMode(CS1, OUTPUT);
pinMode(CS2, OUTPUT);
}