int columns[] = {2,3,4,5,6,7,8,9,10}; //declaring all column pins int layers[] = {A0,A1,A2}; //declaring all layer pins void setup() { for(int i = 0; i < (sizeof(columns)/sizeof(int)); i++) { pinMode(columns[i],OUTPUT); // setting all column pins to ouput } for (int i = 0; i < (sizeof(layers)/sizeof(int)); i++) { pinMode(layers[i],OUTPUT); // setting all layer pins to ouput } TurnAllOff(); Serial.begin(9600); // turning all LEDs off } void loop() { TurnAllOn(); delay(2000); TurnAllOff(); CircleAround(5,1); LayerByLayerUp(3); OneByOne(); LayerByLayerDown(3); LayerUpAndDown(3); InAndOut(5); } void TurnAllOn (){ for (int i = 0; i < (sizeof(layers)/sizeof(int)); i++) { digitalWrite(layers[i],LOW); // pulling all layers low } for (int i = 0; i < (sizeof(columns)/sizeof(int)); i++) { digitalWrite(columns[i],HIGH); // pulling all columns high } } void TurnAllOff (){ for (int i = 0; i < (sizeof(columns)/sizeof(int)); i++) { digitalWrite(columns[i],LOW); } for (int i = 0; i < (sizeof(layers)/sizeof(int)); i++) { digitalWrite(layers[i],HIGH); } } void OneByOne (){ int delayTime =100; TurnAllOff(); for (int i = 0; i < (sizeof(layers)/sizeof(int)); i++) { digitalWrite(layers[i],LOW); // pulling a layer low for (int i = 0; i < (sizeof(columns)/sizeof(int)); i++) { digitalWrite(columns[i],HIGH); delay(delayTime);// pulling all columns high digitalWrite(columns[i],LOW); } digitalWrite(layers[i],HIGH); // pulling a layer high } } void CircleAround(int amount, bool showMid){ // amount = no. of times to repeat the pattern int midColumn = columns[4]; // pin of middle column is declared int outerColumns[8] = {columns[0], columns[1], columns[2], columns[5], columns[8], columns[7], columns[6], columns[3]}; //pins of outer columns are declared int delayTime = 80; TurnAllOff(); for(int i = 0; i < amount; i++) { for (int i = 0; i < (sizeof(layers)/sizeof(int)); i++) { digitalWrite(layers[i], LOW); if(showMid) digitalWrite(midColumn, HIGH); } // Outer LEDs: for(int i = 0; i < (sizeof(outerColumns)/sizeof(int)); i++) { int y; if(i >= 4){ y = i-4; //to light opposite column also } else{ y = i+4; } digitalWrite(outerColumns[i], HIGH); digitalWrite(outerColumns[y], HIGH); delay(delayTime); digitalWrite(outerColumns[i], LOW); digitalWrite(outerColumns[y], LOW); } } } void LayerByLayerUp(int amount){ // amount = no. of times to repeat the pattern int delayTime = 100; TurnAllOff(); for (int i = 0; i < amount; i++){ for (int i = 0; i < (sizeof(layers)/sizeof(int)); i++) { digitalWrite(layers[i],LOW); // a layer is grounded for (int i = 0; i < (sizeof(columns)/sizeof(int)); i++) { digitalWrite(columns[i],HIGH); // turn ON all columns in layer } delay(delayTime); for (int i = 0; i < (sizeof(columns)/sizeof(int)); i++) { digitalWrite(columns[i],LOW); // turn OFF all columns in layer } digitalWrite(layers[i],HIGH); // layer is pulled up } } } void LayerByLayerDown(int amount){ int delayTime = 100; TurnAllOff(); for (int i = 0; i < amount; i++){ for (int i = (sizeof(layers)/sizeof(int)); i >= 0; i--) { digitalWrite(layers[i],LOW); // a layer is grounded for (int i = 0; i < (sizeof(columns)/sizeof(int)); i++) { digitalWrite(columns[i],HIGH); // turn ON all columns in layer } delay(delayTime); for (int i = 0; i < (sizeof(columns)/sizeof(int)); i++) { digitalWrite(columns[i],LOW); // turn OFF all columns in layer } digitalWrite(layers[i],HIGH); // layer is pulled up } } } void LayerUpAndDown(int amount){ //to mix both patterns | amount = no. of times to repeat the pattern int delayTime = 100; for (int i = 0; i < amount; i++){ LayerByLayerUp(1); LayerByLayerDown(1); } } void Edges(int amount){ TurnAllOff(); for (int i = 0; i < amount; i++){ for (int i = 0; i < (sizeof(layers)/sizeof(int)); i++) { digitalWrite(layers[i],LOW); if (i == 1){ digitalWrite(columns[0],HIGH); digitalWrite(columns[1],LOW); digitalWrite(columns[2],HIGH); digitalWrite(columns[3],LOW); digitalWrite(columns[4],LOW); digitalWrite(columns[5],LOW); digitalWrite(columns[6],HIGH); digitalWrite(columns[7],LOW); digitalWrite(columns[8],HIGH); } else{ for (int i = 0; i < (sizeof(columns)/sizeof(int)); i++) { if (i == 4){ digitalWrite(columns[i],LOW); } else{ digitalWrite(columns[i],HIGH); } } } for (int i = 0; i < (sizeof(columns)/sizeof(int)); i++) { digitalWrite(columns[i],LOW); } digitalWrite(layers[i],HIGH); } } } void Centre(){ TurnAllOff(); digitalWrite(layers[1],LOW); digitalWrite(columns[4],HIGH); } void InAndOut(int amount){ for (int i = 0; i < amount; i++){ Edges(1000); Centre(); delay(200); } }