Introduction: ESP8266 Wall Clock 2.0

After the publish of https://www.instructables.com/id/ESP8266-Wall-Cloc... , which may be called the 1.0 version, I found some problem, though it still working, it seemed overloading my wifi router, and stop it from working, so I changed the SSID to some free source and saved my router. I cannot investigate the root cause but the display was designed multiplexing at high speed which mean it sent request to fetch the NTP clock at same speed that may overloaded the router.

I start look for some display doesn't need multiplexing and found MAX7219 with 8 x 8 dot matrix display could worked, because I have several pieces to try on.

Step 1: Schematic

Compared with version 1.0, this is the most simplest version ever, I like to show you the schematic, I'm not sure if any instructabler had simillar connection, but I have tried and it worked. The led matrix are connected in daisy chain, be noted that new add led matrix extends to the left, connect the rightmost led matrix to the esp8266, I need five pieces but I have only 4 now, a minor change in the code can accommodate it.

Step 2: Code 1

I will not post all the code as usual, because the code is not written by me, I even didn't know who are the first one wrote the code, I just modify it to suit my need, I'm pleased to show you the modified parts.

1. header files

#include <ESP8266WiFi.h>

#include <WifiUDP.h>
#include <MaxMatrix.h>

#include <NTPClient.h>

2. character map

This map can be found from MAX7912 instructable code, I included some parts herebelow:

const unsigned char CH[ ] PROGMEM = {
3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space

1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !

3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "

5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #

4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, //........};

Step 3: Code 2

3. Define NTP properties

#define NTP_OFFSET 60 * 60 // In seconds
#define NTP_INTERVAL 60 * 1000 // In miliseconds

#define NTP_ADDRESS "....." // change this to whatever pool is closest (see ntp.org)

4. Setup the NTP UDP client

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);

int data = 0;// DIN pin of MAX7219 module

int load = 1;// CS pin of MAX7219 module

int clk = 2;// CLK pin of MAX7219 module

int maxInUse = 4; //change this variable to set how many MAX7219's you'll use

MaxMatrix m(data, load, clk, maxInUse); // define module

byte buffer[10];

const char* ssid = " "; // insert your own ssid

const char* password = " "; // and password

byte ten, th;

int hours, minutes, seconds;

Step 4: Code 3

5 void setup() {

timeClient.begin(); // Start the NTP UDP client
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {

delay(500);

}

delay(1000);

}

6. void loop() {

hours=minutes=seconds=0;

if (WiFi.status() == WL_CONNECTED) //Check WiFi connection status {

// update the NTP client and get the UNIX UTC timestamp

timeClient.update();

unsigned long epochTime = timeClient.getEpochTime(); // get the hour, minute and second:

hours = (epochTime % 86400L) / 3600 + 7; // (GMT+8 time zone)

if (hours >= 24) //if you find 25, 26, 27....... hours shown

hours-=24;

minutes = (epochTime % 3600 / 60);

seconds = (epochTime % 60);

} else { // attempt to connect to wifi again if disconnected

WiFi.begin(ssid, password);

delay(1000);

}

displayTime(hours,minutes,seconds); //display routine

delay(10000); //Send a request to update every 10 sec (= 10,000 ms)

}

Step 5: Code 4

7. void displayTime(int hrs, int mins, int secs) { //this is my modified parts

m.init();
th = byte(hrs%10+48); //extract byte by byte of hour, minute and second

ten = byte(hrs/10+48); //convert int to byte must add 48 to correct display

printCharWithShift(ten, 100); //display routine

printCharWithShift(th, 100);

printStringWithShift(":", 100); // print " : " between hour, minute and second

if (mins < 0) {

printStringWithShift("0", 100); //add leading zero

th = byte(mins%10+48);

printCharWithShift(th, 100);

} else {

th = byte(mins%10+48);

ten = byte(mins/10+48);

printCharWithShift(ten, 100);

printCharWithShift(th, 100);

}

printStringWithShift(":", 100); //this " : " has been modified in the character map

if (secs < 10) {

printStringWithShift("0", 100); //add leading zero

//th = byte(secs%10+48); //uncomment for five led matrix

//printCharWithShift(th, 100); //uncomment for five led matrix

} else {

th = byte(secs%10+48);

ten = byte(secs/10+48);

printCharWithShift(ten, 100);

// printCharWithShift(th, 100); //uncomment for five led matrix

}

}

Step 6: Code 5

8. Display routines (these routines can be found in MAX7219 instructable code)

void printCharWithShift(char c, int shift_speed) {
if (c < 32) return;

c -= 32;

memcpy_P(buffer, CH + 7*c, 7);

m.writeSprite(maxInUse*8, 0, buffer);

m.setColumn(maxInUse*8 + buffer[0], 0);

for (int i=0; i<buffer[0]+1; i++) {

delay(shift_speed);
m.shiftLeft(false, false);

}

}

void printStringWithShift(char* s, int shift_speed) {

while (*s != 0) {

printCharWithShift(*s, shift_speed);

s++;

}

}

Step 7: Waiting for the Fifth Piece

As shown in the video, the time scroll to the left every 10 second, I hope it may not overloading the router.