… or DS3231 part II 🙂 (see also part III and IV – the story goes on with interrupts)
The next step after testing if it works at all was to display ful time, and especially seconds. So 4 digits offered by TM1637 based module (let’s call it part I) was not enough. I used 8 digits 7 segment display based on MAX7219.
For the code, apart from DS3231 library mentioned in previous post, I used also Eberhard Fahle LedControl library.
The code for full 8 digits (including hundredts of seconds) and displaying via serial, how long does it take to refresh every 10 milisecond (1/100 second) the time:
#include "LedControl.h"
#include <Wire.h>
#include <DS3231.h>
/*
Now we need a LedControl to work with.
pin 12 is connected to the DataIn
pin 10 is connected to the CLK
pin 11 is connected to LOAD
*/
LedControl lc=LedControl(12,10,11,1);
DS3231 Clock;
/* we always wait a bit between updates of the display */
unsigned long delaytime=10;
unsigned long m;
void ReadDS3231()
{
static int oldsecond;
static long oldmillis;
int second,minute,hour,hlast,mlast,slast,tens,hundreds;
bool PM, h12;
second=Clock.getSecond();
if ( second != oldsecond ) {
oldmillis = millis();
oldsecond = second;
}
minute=Clock.getMinute();
hour=Clock.getHour(h12, PM);
slast = second % 10;
mlast = minute % 10;
hlast = hour % 10;
second = (second - slast) / 10;
minute = (minute - mlast) / 10;
hour = (hour - hlast) / 10;
tens = (millis()-oldmillis)/100;
hundreds = ((millis()-oldmillis)/10)%10;
lc.setDigit(0,7,hour,false);
lc.setDigit(0,6,hlast,true);
lc.setDigit(0,5,minute,false);
lc.setDigit(0,4,mlast,true);
lc.setDigit(0,3,second,false);
lc.setDigit(0,2,slast,true);
lc.setDigit(0,1,tens,false);
lc.setDigit(0,0,hundreds,false);
}
void setup() {
/*
The MAX72XX is in power-saving mode on startup,
we have to do a wakeup call
*/
Wire.begin();
lc.shutdown(0,false);
/* Set the brightness to a medium values */
lc.setIntensity(0,6);
/* and clear the display */
lc.clearDisplay(0);
Serial.begin(9600);
}
void loop() {
m=millis();
ReadDS3231();
Serial.println(millis()-m,DEC);
delay(delaytime-m); //start with delaytime and change
// to delaytime - m only once you assure m < delaytime
}
In my case m was almost all time equal 4, so we still had to delay a while to display next 0.01 second.
If you prefer to stick to full seconds and skip in-procedure time checking the code could be much shorter:
#include "LedControl.h"
#include <Wire.h>
#include <DS3231.h>
/*
Now we need a LedControl to work with.
pin 12 is connected to the DataIn
pin 11 is connected to LOAD
pin 10 is connected to the CLK
*/
LedControl lc=LedControl(12,10,11,1);
DS3231 Clock;
/* we always wait a bit between updates of the display */
unsigned long delaytime=1000;
void ReadDS3231()
{
int second,minute,hour,hlast,mlast,slast;
bool PM, h12;
second=Clock.getSecond();
minute=Clock.getMinute();
hour=Clock.getHour(h12, PM);
slast = second % 10;
mlast = minute % 10;
hlast = hour % 10;
second = (second - slast) / 10;
minute = (minute - mlast) / 10;
hour = (hour - hlast) / 10;
lc.setDigit(0,5,hour,false);
lc.setDigit(0,4,hlast,true);
lc.setDigit(0,3,minute,false);
lc.setDigit(0,2,mlast,true);
lc.setDigit(0,1,second,false);
lc.setDigit(0,0,slast,false);
delay(delaytime);
}
void setup() {
/*
The MAX72XX is in power-saving mode on startup,
we have to do a wakeup call
*/
Wire.begin();
lc.shutdown(0,false);
/* Set the brightness to a medium values */
lc.setIntensity(0,6);
/* and clear the display */
lc.clearDisplay(0);
}
void loop() {
ReadDS3231();
}
So this was a kind of intermediate step. In next one and fourth one we shall use timer interrupts. Go on.

3 thoughts on “DS3231 MAX7219 8digits”