Domino Clock

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 :slight_smile:
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.