Arduino Tic Tac Toe mit MAX7219 LED-Matrix und Karton-Gehäuse
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino UNO | 1 |
| MAX7219 LED-Dot-Matrix | 1 |
| Membran-Tastenfeld (Keypad) | 1 |
Benötigte Werkzeuge
- Heißklebepistole
Apps und Onlinedienste
- Arduino IDE
Über dieses Projekt
Hallo Hackster-Community! Ich bin Simone Adobs und dies ist mein drittes Projekt auf Hackster. Erstmals habe ich ein Gehäuse aus Karton, Papier und Heißkleber gebaut, das Arduino und die Komponenten aufnimmt.
Ich hoffe, es gefällt euch – ich habe einige Stunden darin investiert! Jetzt geht's los.
Wie funktioniert das Tic Tac Toe?
Ganz einfach: Drückt man eine Zahl auf dem Keypad, schaltet der Arduino das entsprechende Feld auf der LED-Matrix an.
- Kann ich den Spieler wechseln? Ja, nach jedem Zug wechselt Arduino automatisch zum nächsten Spieler.
- Erkennt Arduino einen Gewinn? Bei Gewinn zeigt die Matrix:
- „1“ für Spieler 1
- „2“ für Spieler 2
- Neustart per Taste? Drückt man die „0“ auf dem Keypad, startet Arduino neu (Watchdog-Reset).
Wie erkenne ich, welcher Spieler dran ist?
Obwohl die Matrix nur rot leuchtet, hat jeder Spieler ein eigenes 2×2-LED-Muster:
- Spieler 1: „\“ (Diagonale von links oben nach rechts unten)
- Spieler 2: „/“ (Diagonale von rechts oben nach links unten)
Bei Fragen, Anregungen oder Code-Erklärungen gerne kommentieren. Wenn euch das Projekt gefällt, hinterlasst ein Like und schaut euch meine anderen Projekte an!
Versucht, ein eigenes Gehäuse zu bauen oder meins anzupassen – und schickt mir ein Foto!
Einen SCHÖNEN TAG noch!
Simone aus Italien <3
Code
#include
#include
#include
#include
#define Reset_AVR() wdt_enable(WDTO_30MS); while(1) {}
LedControl lc = LedControl(12, 10, 11, 1);
bool player1 = true;
bool q1=false, q2=false, q3=false, q4=false, q5=false, q6=false, q7=false, q8=false, q9=false;
int row, col, rowPlays, colPlays, result, player, winner;
char hexaKeys[4][3] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
int plays[3][3] = {{0,0,0}, {0,0,0}, {0,0,0}};
byte rowPins[4] = {8, 7, 6, 5};
byte colPins[3] = {4, 3, 2};
Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, 4, 3);
void setup() {
lc.shutdown(0, false);
lc.setIntensity(0, 0);
lc.clearDisplay(0);
}
void loop() {
int customKey = customKeypad.getKey();
painting(customKey);
win(result);
if (winner == 1) {
lc.clearDisplay(0);
while (winner == 1) {
char customKey = customKeypad.getKey();
if (customKey == '0') Reset_AVR();
// Anzeige "1" für Spieler 1
lc.setLed(0,1,4,true); lc.setLed(0,2,5,true); lc.setLed(0,3,6,true);
lc.setLed(0,4,7,true); lc.setLed(0,4,6,true); lc.setLed(0,4,5,true);
lc.setLed(0,4,4,true); lc.setLed(0,4,3,true); lc.setLed(0,4,2,true);
lc.setLed(0,4,1,true); lc.setLed(0,4,0,true); lc.setLed(0,5,0,true);
lc.setLed(0,6,0,true); lc.setLed(0,3,0,true); lc.setLed(0,2,0,true);
}
} else if (winner == 2) {
lc.clearDisplay(0);
while (winner == 2) {
char customKey = customKeypad.getKey();
if (customKey == '0') Reset_AVR();
// Anzeige "2" für Spieler 2
lc.setLed(0,2,0,true); lc.setLed(0,3,0,true); lc.setLed(0,4,0,true);
lc.setLed(0,5,0,true); lc.setLed(0,2,1,true); lc.setLed(0,2,2,true);
lc.setLed(0,2,3,true); lc.setLed(0,2,4,true); lc.setLed(0,3,4,true);
lc.setLed(0,4,4,true); lc.setLed(0,5,4,true); lc.setLed(0,5,5,true);
lc.setLed(0,5,6,true); lc.setLed(0,5,7,true); lc.setLed(0,4,7,true);
lc.setLed(0,3,7,true); lc.setLed(0,2,7,true);
}
}
}
int round_player() {
if (player1) { player1 = false; result = 1; }
else { player1 = true; result = 2; }
return result;
}
void win(int player) {
if (plays[0][0]==player && plays[0][1]==player && plays[0][2]==player) winner = player;
else if (plays[1][0]==player && plays[1][1]==player && plays[1][2]==player) winner = player;
else if (plays[2][0]==player && plays[2][1]==player && plays[2][2]==player) winner = player;
else if (plays[0][0]==player && plays[1][0]==player && plays[2][0]==player) winner = player;
else if (plays[0][1]==player && plays[1][1]==player && plays[2][1]==player) winner = player;
else if (plays[0][2]==player && plays[1][2]==player && plays[2][2]==player) winner = player;
else if (plays[0][0]==player && plays[1][1]==player && plays[2][2]==player) winner = player;
else if (plays[0][2]==player && plays[1][1]==player && plays[2][0]==player) winner = player;
}
void switch_on_led(int col, int row, int colPlays, int rowPlays) {
if (player1) {
lc.setLed(0, col, row, true);
lc.setLed(0, col+1, row-1, true); // Muster "\"
} else {
lc.setLed(0, col, row-1, true);
lc.setLed(0, col+1, row, true); // Muster "/"
}
plays[rowPlays][colPlays] = round_player();
}
void painting(int bottone) {
switch (bottone) {
case 49: // '1'
if (!q1) { switch_on_led(0, 7, 0, 0); q1 = true; }
break;
case 50: // '2'
if (!q2) { switch_on_led(3, 7, 0, 1); q2 = true; }
break;
case 51: // '3'
if (!q3) { switch_on_led(6, 7, 0, 2); q3 = true; }
break;
case 52: // '4'
if (!q4) { switch_on_led(0, 4, 1, 0); q4 = true; }
break;
case 53: // '5'
if (!q5) { switch_on_led(3, 4, 1, 1); q5 = true; }
break;
case 54: // '6'
if (!q6) { switch_on_led(6, 4, 1, 2); q6 = true; }
break;
case 55: // '7'
if (!q7) { switch_on_led(0, 1, 2, 0); q7 = true; }
break;
case 56: // '8'
if (!q8) { switch_on_led(3, 1, 2, 1); q8 = true; }
break;
case 57: // '9'
if (!q9) { switch_on_led(6, 1, 2, 2); q9 = true; }
break;
case 48: // '0' - Reset
Reset_AVR();
break;
}
}
Schaltplan
Herstellungsprozess
- Monitor-Ambilight selbst bauen mit Arduino Nano & WS2812B LEDs
- Klassisches Pong-Spiel auf Arduino UNO mit OLED-Display bauen – Schritt-für-Schritt-Tutorial
- Riesige Lego-Minifigur als Animatronic-Operation-Game mit Arduino bauen
- Arduino Audio-Frequenz-Detektor – Lauteste Schallpeaks mit hochsensiblem Modul messen
- Selbstbau-Tamagotchi: Digitales Haustier mit Arduino
- Intelligenter kabelloser Lichtschalter-Controller: Arduino-basierter Fernschalter-Manipulator
- Intelligente, bewegungsaktivierte Wasserpistole mit Arduino Nano
- Zuverlässigen Arduino-Countdown-Timer mit SparkFun 7-Segment-Display bauen
- Sprachgesteuerte Haushaltsgeräte: Bluetooth-Steuerung mit Google Assistant
- Arduino-Sonnenblume: Elektronischer Sonnen-Tracker selbst bauen