Hmm i sort of get that but I finally worked out the code a bit:
This is at least with the way I figured it out, probably still not very efficient but better than the old "seperate definition for every minute of the hour"
#include <Time.h>
//Data Lines to the hour stone
int hlatchPin = 3;
int hclockPin = 4;
int hdataPin = 5;
//Data Lines to the decimal minute stone
int dlatchPin = 6;
int dclockPin = 7;
int ddataPin = 8;
//Data Lines to the single minute stone
int mlatchPin = 9;
int mclockPin = 10;
int mdataPin = 11;
int h = 0;
int m = 0;
int mins = 0;
int d = 0;
int previousHours = 0;
int previousMins = 0;
//I found it easiest to make a seperate data array for each shift register
byte dataArray1[12];
byte dataArray2[12];
byte dataArray3[12];
void setup() {
pinMode(hlatchPin, OUTPUT);
pinMode(hclockPin, OUTPUT);
pinMode(hdataPin, OUTPUT);
pinMode(dlatchPin, OUTPUT);
pinMode(dclockPin, OUTPUT);
pinMode(ddataPin, OUTPUT);
pinMode(mlatchPin, OUTPUT);
pinMode(mclockPin, OUTPUT);
pinMode(mdataPin, OUTPUT);
dataArray1[1] = 0; dataArray2[1] = 0; dataArray3[1] = 0;
dataArray1[2] = 0; dataArray2[2] = 0; dataArray3[2] = 0;
dataArray1[3] = 0; dataArray2[3] = 0; dataArray3[3] = 0;
dataArray1[4] = 0; dataArray2[4] = 0; dataArray3[4] = 0;
dataArray1[5] = 0; dataArray2[5] = 0; dataArray3[5] = 0;
dataArray1[6] = 0; dataArray2[6] = 0; dataArray3[6] = 0;
dataArray1[7] = 0; dataArray2[7] = 0; dataArray3[7] = 0;
dataArray1[8] = 0; dataArray2[8] = 0; dataArray3[8] = 0;
dataArray1[9] = 0; dataArray2[9] = 0; dataArray3[9] = 0;
dataArray1[10] = 0; dataArray2[10] = 0; dataArray3[10] = 0;
dataArray1[11] = 0; dataArray2[11] = 0; dataArray3[11] = 0;
dataArray1[12] = 0; dataArray2[12] = 0; dataArray3[12] = 0;
}
void loop() {
h = hourFormat12();
m = minute();
if(previousHours != h) {
digitalWrite(hlatchPin, LOW);
shiftOut(hdataPin, hclockPin, MSBFIRST, dataArray1[h]);
shiftOut(hdataPin, hclockPin, MSBFIRST, dataArray2[h]);
shiftOut(hdataPin, hclockPin, MSBFIRST, dataArray3[h]);
digitalWrite(hlatchPin, HIGH);
previousHours = h;
}
if(previousMins != m) {
mins = m;
if(mins >= 10) {
d = 0;
while(mins >= 10) {
mins = mins - 10;
d = d + 1;
}
digitalWrite(dlatchPin, LOW);
shiftOut(ddataPin, dclockPin, MSBFIRST, dataArray1[d]);
shiftOut(ddataPin, dclockPin, MSBFIRST, dataArray2[d]);
shiftOut(ddataPin, dclockPin, MSBFIRST, dataArray3[d]);
digitalWrite(dlatchPin, HIGH);
digitalWrite(mlatchPin, LOW);
shiftOut(mdataPin, mclockPin, MSBFIRST, dataArray1[mins]);
shiftOut(mdataPin, mclockPin, MSBFIRST, dataArray2[mins]);
shiftOut(mdataPin, mclockPin, MSBFIRST, dataArray2[mins]);
digitalWrite(mlatchPin, HIGH);
}
else {
digitalWrite(dlatchPin, LOW);
shiftOut(ddataPin, dclockPin, MSBFIRST, 0);
shiftOut(ddataPin, dclockPin, MSBFIRST, 0);
shiftOut(ddataPin, dclockPin, MSBFIRST, 0);
digitalWrite(dlatchPin, HIGH);
digitalWrite(mlatchPin, LOW);
shiftOut(mdataPin, mclockPin, MSBFIRST, dataArray1[mins]);
shiftOut(mdataPin, mclockPin, MSBFIRST, dataArray2[mins]);
shiftOut(mdataPin, mclockPin, MSBFIRST, dataArray3[mins]);
digitalWrite(mlatchPin, HIGH);
}
previousMins = m;
}
}
The hardware hookup i have to draw together as I did most on the go. The pin out from the shift registers i got to figure out because the wiring is a mess ![]()
But to keep it short:
Each stone has its own dedicated data, clock and latch pin. And contains 3 shift registers.
Anyways ill post the circuit this afternoon / evening / some time soon.