constexpr int horizontal_pins[] = {8, 9, 10, 11};
constexpr int vertical_pins[] = {2, 3, 4, 5, 6};
constexpr int max_x = 4;
constexpr int max_y = 5;
constexpr int button_pins[] = {1, 7, 12, 13}; // UP, LEFT, RIGHT, DOWN
int x = 0, y = 0;
struct Coordinates {
int x;
int y;
};
Coordinates check_walk(int x, int y) {
delay(100); // Debounce delay
if (digitalRead(button_pins[0]) == LOW) { // UP button
x--;
} else if (digitalRead(button_pins[3]) == LOW) { // DOWN button
x++;
}
if (digitalRead(button_pins[1]) == LOW) { // LEFT button
y--;
} else if (digitalRead(button_pins[2]) == LOW) { // RIGHT button
y++;
}
// Ensure x and y stay within bounds
x = constrain(x, 0, max_x - 1);
y = constrain(y, 0, max_y - 1);
return {x, y};
}
void walk(int x, int y) {
// Turn off all pins first
for (int i = 0; i < max_x; i++) {
digitalWrite(horizontal_pins[i], LOW);
}
for (int i = 0; i < max_y; i++) {
digitalWrite(vertical_pins[i], LOW);
}
// Activate the current pins
digitalWrite(horizontal_pins[x], HIGH);
digitalWrite(vertical_pins[y], HIGH);
}
void init_pins(const int list[], int size, int mode = OUTPUT) {
for (int i = 0; i < size; i++) {
pinMode(list[i], mode);
}
}
void starting() {
for (int i = 0; i < max_x; i++) {
delay(250);
digitalWrite(horizontal_pins[i], HIGH);
delay(250);
digitalWrite(horizontal_pins[i], LOW);
}
for (int i = 0; i < max_y; i++) {
delay(250);
digitalWrite(vertical_pins[i], HIGH);
delay(250);
digitalWrite(vertical_pins[i], LOW);
}
}
void setup() {
init_pins(horizontal_pins, max_x);
init_pins(vertical_pins, max_y);
init_pins(button_pins, 4, INPUT_PULLUP);
starting();
for(int i=0;i<max_x;i++){
for(int j=0;j<max_y;j++){
delay(150);
walk(i,j);
}
}
x=1;
y=2;
walk(x,y);
}
void loop() {
Coordinates new_coords = check_walk(x, y);
if (x != new_coords.x || y != new_coords.y) {
x = new_coords.x;
y = new_coords.y;
walk(x, y);
}
}