#define DATA_PIN 8 // Pin connected to DS of 74HC595
#define LATCH_PIN 9 // Pin connected to STCP of 74HC595
#define CLOCK_PIN 10 // Pin connected to SHCP of 74HC595
// How many of the shift registers
#define NUM_SHIFT_REGS 8
#define true HIGH
#define false LOW
const uint8_t numOfRegisterPins = NUM_SHIFT_REGS * 8;
bool registers[numOfRegisterPins];
void setup() {
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
clearRegisters();
writeRegisters();
}
bool toggle = false;
void loop() {
blinkInnerYellow();
runInnerRed();
blinkInnerGreenThrice();
blinkSecondYellow();
blinkSecondYellow();
blinkSecondYellow();
runOuterGreen();
blinkLast();
blinkLast();
blinkLast();
}
void blinkInnerYellow() {
write(0,HIGH);
write(1,HIGH);
write(2,HIGH);
write(3,HIGH);
write(4,HIGH);
write(5,HIGH);
write(6,HIGH);
write(7,HIGH);
delay(300);
write(0,LOW);
write(1,LOW);
write(2,LOW);
write(3,LOW);
write(4,LOW);
write(5,LOW);
write(6,LOW);
write(7,LOW);
delay(300);
}
void runInnerRed(){
write(8,HIGH);
delay(200);
write(8,LOW);
write(9,HIGH);
delay(200);
write(9,LOW);
write(10,HIGH);
delay(200);
write(10,LOW);
write(11,HIGH);
delay(200);
write(11,LOW);
write(12,HIGH);
delay(200);
write(12,LOW);
write(13,HIGH);
delay(200);
write(13,LOW);
write(14,HIGH);
delay(200);
write(14,LOW);
write(15,HIGH);
delay(200);
write(15,LOW);
}
void blinkInnerGreenThrice(){
write(16,HIGH);
write(17,HIGH);
write(18,HIGH);
write(19,HIGH);
delay(200);
write(16,LOW);
write(17,LOW);
write(18,LOW);
write(19,LOW);
delay(200);
write(16,HIGH);
write(17,HIGH);
write(18,HIGH);
write(19,HIGH);
delay(200);
write(16,LOW);
write(17,LOW);
write(18,LOW);
write(19,LOW);
delay(200);
write(16,HIGH);
write(17,HIGH);
write(18,HIGH);
write(19,HIGH);
delay(200);
write(16,LOW);
write(17,LOW);
write(18,LOW);
write(19,LOW);
delay(200);
}
void blinkSecondYellow() {
write(20,HIGH);
write(21,HIGH);
write(22,HIGH);
write(23,HIGH);
write(24,HIGH);
write(26,HIGH);
write(27,HIGH);
write(28,HIGH);
write(29,HIGH);
delay(500);
write(20,LOW);
write(21,LOW);
write(22,LOW);
write(23,LOW);
write(24,LOW);
write(26,LOW);
write(27,LOW);
write(28,LOW);
write(29,LOW);
delay(500);
}
void runOuterGreen(){
write(32,HIGH);
delay(200);
write(32,LOW);
write(33,HIGH);
delay(200);
write(33,LOW);
write(34,HIGH);
delay(200);
write(34,LOW);
write(35,HIGH);
delay(200);
write(35,LOW);
write(32,HIGH);
delay(200);
write(32,LOW);
write(33,HIGH);
delay(200);
write(33,LOW);
write(34,HIGH);
delay(200);
write(34,LOW);
write(35,HIGH);
delay(200);
write(35,LOW);
write(32,HIGH);
delay(200);
write(32,LOW);
write(33,HIGH);
delay(200);
write(33,LOW);
write(34,HIGH);
delay(200);
write(34,LOW);
write(35,HIGH);
delay(200);
write(35,LOW);
}
void blinkLast(){
write(25,HIGH);
write(36,HIGH);
write(37,HIGH);
write(38,HIGH);
write(39,HIGH);
write(40,HIGH);
write(41,HIGH);
write(42,HIGH);
write(43,HIGH);
write(44,HIGH);
write(45,HIGH);
write(46,HIGH);
write(47,HIGH);
write(48,HIGH);
write(49,HIGH);
write(50,HIGH);
delay(300);
write(25,LOW);
write(36,LOW);
write(37,LOW);
write(38,LOW);
write(39,LOW);
write(40,LOW);
write(41,LOW);
write(42,LOW);
write(43,LOW);
write(44,LOW);
write(45,LOW);
write(46,LOW);
write(47,LOW);
write(48,LOW);
write(49,LOW);
write(50,LOW);
delay(300);
}
void clearRegisters() {
// Reset all register pins
for (int i = numOfRegisterPins; i >= 0; i--) {
registers[i] = LOW;
}
}
void setRegisterPin(int index, int value) {
// Set an individual pin HIGH or LOW
registers[index] = value;
}
void writeRegisters() {
// Set and display registers
digitalWrite(LATCH_PIN, LOW);
for (int i = numOfRegisterPins; i >= 0; i--) {
digitalWrite(CLOCK_PIN, LOW);
digitalWrite(DATA_PIN, registers[i]);
digitalWrite(CLOCK_PIN, HIGH);
}
digitalWrite(LATCH_PIN, HIGH);
}
void write(int pinNumber, bool mode)
{
registers[pinNumber] = mode;
writeRegisters();
}