Skip to content

Instantly share code, notes, and snippets.

@tuldok89
Last active January 8, 2024 16:42
Show Gist options
  • Save tuldok89/6e71a63c56da6fc6c01d6de4b8b19c31 to your computer and use it in GitHub Desktop.
Save tuldok89/6e71a63c56da6fc6c01d6de4b8b19c31 to your computer and use it in GitHub Desktop.
ESP8266 Clock
#include <Arduino.h>
#include <SPI.h>
#include <ESP8266WiFi.h>
#include <MD_Parola.h>
#include <MD_ParolaExt.h>
#include <MD_MAX72xx.h>
#include <ESP8266TimerInterrupt.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <time.h>
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 8
#define CS0 SS
#define CS1 16
ESP8266TimerInterrupt timer;
MD_ParolaExt* line1;
MD_ParolaExt* line2;
WiFiUDP ntpUdp;
NTPClient* timeClient;
const char* wifiSsid = "Tuldok-House";
const char* wifiPass = "HelloWorld1234";
const char* timezone = "PST-8";
void timerTick();
void connectWiFi();
void initTime();
void initHwSpi();
void displayInit();
void setup()
{
Serial.begin(2000000, SERIAL_8N1);
connectWiFi();
initTime();
initHwSpi();
displayInit();
timer.attachInterruptInterval(1000, &timerTick);
}
void loop() {
timeClient->update();
struct timeval tvx;
tvx.tv_sec = timeClient->getEpochTime();
tvx.tv_usec = 0;
settimeofday(&tvx, NULL);
delay(500);
}
void connectWiFi()
{
WiFi.begin(wifiSsid, wifiPass);
while(WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.println("WiFi connected.");
}
void IRAM_ATTR timerTick()
{
struct tm timeinfo;
getLocalTime(&timeinfo);
line1->setTextAlignment(PA_CENTER);
line1->printExt(&timeinfo, "%m/%d/%Y");
line2->setTextAlignment(PA_CENTER);
line2->printExt(&timeinfo, "%I:%M:%S %P");
}
void initTime()
{
timeClient = new NTPClient(ntpUdp, "pool.ntp.org", 0, 60000);
setenv("TZ", timezone, 1);
tzset();
}
void displayInit()
{
line1 = new MD_ParolaExt(HARDWARE_TYPE, SPI, CS0, MAX_DEVICES);
line2 = new MD_ParolaExt(HARDWARE_TYPE, SPI, CS1, MAX_DEVICES);
line1->begin();
line2->begin();
line1->setIntensity(15);
line2->setIntensity(15);
line1->displayClear();
line2->displayClear();
}
void initHwSpi()
{
SPI.setFrequency(10000000);
SPI.begin();
pinMode(CS0, OUTPUT);
pinMode(CS1, OUTPUT);
}
#pragma once
#include <MD_Parola.h>
class MD_ParolaExt : public MD_Parola
{
public:
MD_ParolaExt(MD_MAX72XX::moduleType_t mod, SPIClass &spi, uint8_t csPin, uint8_t numDevices = 1);
size_t printExt(struct tm* timeinfo, const char* format = NULL);
virtual ~MD_ParolaExt() = default;
};
#include <MD_Parola.h>
#include "MD_ParolaExt.h"
size_t MD_ParolaExt::printExt(tm *timeinfo, const char *format)
{
const char* f = format;
if (!f)
{
f = "%c";
}
char buf[64];
size_t written = strftime(buf, 64, f, timeinfo);
if (written == 0) {
return written;
}
return MD_Parola::print(buf);
}
MD_ParolaExt::MD_ParolaExt(MD_MAX72XX::moduleType_t mod, SPIClass &spi, uint8_t csPin, uint8_t numDevices) : MD_Parola(mod, spi, csPin, numDevices)
{
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment