#define ROW1 11 //red
#define ROW2 12 //green
#define ROW3 13 //blue
#define INTERVAL 500UL
void setup() {
// put your setup code here, to run once:
for (unsigned char i = 2; i <= ROW3; ++i)
pinMode(i, OUTPUT);
digitalWrite(ROW2, true);
digitalWrite(ROW3, true);
}
char c{};
bool direction = 0; //0 - forward, 1 - backward
unsigned long timestamp = INTERVAL;
void loop() {
// put your main code here, to run repeatedly:
if (c && !(c % 9)) {
for (unsigned char i = 1; i < 9; ++i)
digitalWrite(i + 2, false);
digitalWrite(ROW1 + c / 9 - 1, true);
digitalWrite(ROW1 + c / 9, false);
}
if (c != 26 && (c + 1) % 9 == 0) {
digitalWrite(ROW1 + (c + 1) / 9 - 1, false);
digitalWrite(ROW1 + (c + 1) / 9, true);
for (unsigned char i = 0; i < 9 - direction; ++i)
digitalWrite(i + 2, true);
}
digitalWrite(c % 9 + 2, !direction);
if (c / 9) {
digitalWrite(ROW1 + c / 9, true);
for (unsigned char i = c % 9 + 2 + !direction; i < ROW1 + c / 9; ++i)
digitalWrite(i, i < ROW1);
for (char i = ROW1 + c / 9 - 1; i >= c % 9 + 2 + !direction; --i)
digitalWrite(i, i >= ROW1);
digitalWrite(ROW1 + c / 9, false);
}
if (millis() >= timestamp) {
if ((c == 26 && digitalRead(10)) || (!c && !digitalRead(2))) {
c += 1 - 2 * direction;
direction = !direction;
}
c = (c + 1 - 2 * direction) % 27;
timestamp = millis() + INTERVAL;
}
}