Vom Steckbrett zur Platine: Simon Says Spiel bauen – Teil 1
Komponenten und Zubehör
| Komponente | Menge | Hinweise |
|---|---|---|
| Arduino UNO | 1 | |
| Steckbrett (Full Size) | 1 | |
| LED (generisch) | 4 | Grün, Rot, Gelb, Blau |
| SparkFun Taster 12 mm | 4 | Zu den LEDs passend |
| Summer (Buzzer) | 1 | |
| Jumper-Kabel (generisch) | 12 | |
| Widerstand 10 kΩ | 4 | Pull-Down für Taster (optional, INPUT_PULLUP genutzt) |
| Widerstand 330 Ω | 4 | Vorwiderstände für LEDs |
| USB-A auf B Kabel | 1 |
Apps und Online-Dienste
- Arduino IDE
Über dieses Projekt
Einführung
Jeder kennt das klassische „Simon Says“-Spiel: Man muss eine Folge von Lichtern nachahmen, indem man die dazu gehörigen Tasten drückt. Für Hackster Live präsentierten wir ein PCB-Design-Tool namens Upverter. Dies ist ein spaßiges, einfaches Projekt, um es zu erstellen und in eine Platine umzuwandeln. Unten finden Sie das Basisprojekt mit Hardware und Code.
Das Projekt besteht aus drei Teilen:
- Teil 1: Simon Says Spiel aufbauen (dieser Artikel)
- Teil 2: PCB-Design basierend auf dem Simon Says Spiel mit Upverter
- Teil 3: Eigene PCB fräsen aus dem Upverter-Design per CNC
Was Sie in dieser Serie lernen
- Grundlegendes Projekt auf Steckbrett aufbauen
- PCB in Upverter designen
- Eigene PCB mit CNC-Maschine fräsen
Software
Falls nicht vorhanden: Arduino IDE hier herunterladen (neueste Version für Ihr OS).
Hardware-Aufbau
Ich nutzte das Beispiel aus SparkFun's Inventor's Kit als Inspiration und passte es leicht an. Siehe Fritzing-Diagramm unten.
Code
Das Schöne an diesem Spiel: viele Variationen sind möglich. Ich nutzte SparkFuns Hardware-Beispiel als Basis und schrieb den Code von Grund auf neu. Wenn Sie keinen eigenen Code schreiben möchten, nutzen Sie meinen unten, passen SparkFuns Code an oder suchen Sie nach anderen Simon-Says-Codes, die zu Ihrer Hardware passen.
Mein Code enthält detaillierte Kommentare und Debug-Serial-Ausgaben, damit Sie im Serial Monitor sehen, was während des Spiels passiert. Sehen Sie sich das Video des laufenden Spiels an!
Simon Says Spiel Video
Hinweis: Im Video ist die Gewinnbedingung auf 5 richtige Lichter in Folge gesetzt. Das lässt sich ändern, um das Spiel schwerer zu machen – ich wollte das Video kurz halten :).
Jetzt sind Sie bereit, Ihr Steckbrett in eine PCB zu verwandeln! Erfahren Sie wie in Breadboard to PCB Teil 2 – PCB designen mit Upverter.
Code
Simon Says Arduino Code Arduino
int ledArray[] = {12, 9, 5, 2}; // ledArray[0]=Grün, [1]=Rot, [2]=Gelb, [3]=Blau
int buttonArray[] = {13, 10, 6, 3}; // buttonArray[0]=Grün, [1]=Rot, [2]=Gelb, [3]=Blau
int pinCount = 4;
int buzzer = 8;
int ledState = 0;
int gameState = 0;
#define NUMBERTOWIN 5 // Anzahl richtiger Lichter zum Gewinnen – anpassbar
int gameValues[NUMBERTOWIN];
int roundNum = 0;
unsigned long previousMillis = 0;
unsigned long interval1 = 500; // Blinkintervall im Pre-Game
// Funktionsdeklarationen
void setLed(int ledNum);
void displayClue(int roundNum);
boolean waitForInput(int buttonNum);
void setup() {
Serial.begin(9600);
Serial.println("setup");
for (int Pin = 0; Pin < pinCount; Pin++) {
pinMode(ledArray[Pin], OUTPUT);
}
for (int Pin = 0; Pin < pinCount; Pin++) {
pinMode(buttonArray[Pin], INPUT_PULLUP); // interner Pull-Up
}
randomSeed(analogRead(0)); // zufälliger Seed aus unverbundenem Analogpin
}
void loop() {
if (gameState == 0) {
int button0 = digitalRead(buttonArray[0]);
int button1 = digitalRead(buttonArray[1]);
int button2 = digitalRead(buttonArray[2]);
int button3 = digitalRead(buttonArray[3]);
// Kein Taster gedrückt (INPUT_PULLUP → HIGH = nicht gedrückt)
if (button0 && button1 && button2 && button3) {
pre_game();
} else {
Serial.println("button Pressed");
setLed(-1); // alle LEDs aus
roundNum = 0;
delay(1000);
gameState = 1;
}
}
if (gameState == 1) gamePlay();
if (gameState == 2) { // Gewonnen
delay(500);
winning_sound();
winDisplay(); winDisplay(); winDisplay();
loseDisplay();
Serial.println("winDisplay");
delay(1000);
gameState = 0;
}
if (gameState == 3) { // Verloren
delay(500);
losing_sound();
loseDisplay(); loseDisplay(); loseDisplay();
Serial.println("loseDisplay");
delay(1000);
gameState = 0;
}
}
void pre_game() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval1) {
if (ledState == 0) { Serial.println("pre green"); setLed(0); ledState = 1; }
else if (ledState == 1) { Serial.println("pre red"); setLed(1); ledState = 2; }
else if (ledState == 2) { Serial.println("pre yellow"); setLed(2); ledState = 3; }
else if (ledState == 3) { Serial.println("pre blue"); setLed(3); ledState = 0; }
previousMillis = currentMillis;
}
}
void gamePlay() {
Serial.println("gamePlay");
for (int i = 0; i < NUMBERTOWIN; i++) {
gameValues[i] = floor(random(0, 4));
Serial.println(gameValues[i], DEC);
}
Serial.print("Starting Round "); Serial.println(roundNum, DEC);
for (int r = 0; r < NUMBERTOWIN; r++) {
displayClue(roundNum);
for (int i = 0; i <= roundNum; i++) {
Serial.print("Waiting for input "); Serial.print(i+1, DEC);
Serial.print(" of "); Serial.print(roundNum+1, DEC); Serial.println();
if (waitForInput(gameValues[i])) {
if (i == roundNum) {
Serial.println("Correct");
if (roundNum == NUMBERTOWIN - 1) {
Serial.println("You Win!");
gameState = 2;
return;
} else {
Serial.println("Continue");
}
}
} else {
Serial.println("You Lose!");
gameState = 3;
return;
}
}
roundNum++;
delay(1000);
}
}
void setLed(int ledNum) {
if (ledNum < 0) {
for (int i = 0; i < pinCount; i++) digitalWrite(ledArray[i], LOW);
} else {
for (int i = 0; i < pinCount; i++) {
digitalWrite(ledArray[i], (i == ledNum) ? HIGH : LOW);
}
}
}
void displayClue(int roundNum) {
setLed(-1);
for (int i = 0; i <= roundNum; i++) {
setLed(gameValues[i]);
delay(750);
setLed(-1);
delay(250);
}
}
boolean waitForInput(int buttonNum) {
while (true) {
int button0 = digitalRead(buttonArray[0]);
int button1 = digitalRead(buttonArray[1]);
int button2 = digitalRead(buttonArray[2]);
int button3 = digitalRead(buttonArray[3]);
// INPUT_PULLUP: LOW = gedrückt
if (!button0 || !button1 || !button2 || !button3) {
delay(250); // Entprellung
if (buttonNum == 0) { digitalWrite(ledArray[0], HIGH); delay(250); digitalWrite(ledArray[0], LOW); }
else if (buttonNum == 1) { digitalWrite(ledArray[1], HIGH); delay(250); digitalWrite(ledArray[1], LOW); }
else if (buttonNum == 2) { digitalWrite(ledArray[2], HIGH); delay(250); digitalWrite(ledArray[2], LOW); }
else if (buttonNum == 3) { digitalWrite(ledArray[3], HIGH); delay(250); digitalWrite(ledArray[3], LOW); }
if (buttonNum == 0 && button0 == 0) { Serial.println("0 Pressed"); return true; }
else if (buttonNum == 1 && button1 == 0) { Serial.println("1 Pressed"); return true; }
else if (buttonNum == 2 && button2 == 0) { Serial.println("2 Pressed"); return true; }
else if (buttonNum == 3 && button3 == 0) { Serial.println("3 Pressed"); return true; }
else { return false; }
}
}
}
void winDisplay() {
for (int i = 0; i < 4; i++) {
digitalWrite(ledArray[i], HIGH); delay(75); digitalWrite(ledArray[i], LOW); delay(75);
}
for (int i = 2; i >= 0; i--) {
digitalWrite(ledArray[i], HIGH); delay(75); digitalWrite(ledArray[i], LOW); delay(75);
}
}
void winning_sound() {
Serial.println("buzzer1");
tone(buzzer, 294, 250); delay(200);
tone(buzzer, 294, 250); delay(200);
tone(buzzer, 294, 250); delay(200);
tone(buzzer, 392, 500); delay(500);
tone(buzzer, 392, 250); delay(200);
tone(buzzer, 440, 250); delay(200);
tone(buzzer, 392, 250); delay(200);
tone(buzzer, 440, 250); delay(200);
tone(buzzer, 494, 500);
}
void loseDisplay() {
for (int i = 0; i < 4; i++) digitalWrite(ledArray[i], HIGH);
delay(200);
for (int i = 0; i < 4; i++) digitalWrite(ledArray[i], LOW);
delay(200);
}
void losing_sound() {
Serial.println("losing_sound");
tone(buzzer, 98, 250); delay(250);
tone(buzzer, 93, 250); delay(250);
tone(buzzer, 87, 250); delay(250);
}
Schaltpläne
simon_says_fritzing_Yb8EdKPqD4.fzz
Herstellungsprozess
- Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
- Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
- 37-LED-Roulette-Spiel mit Arduino Nano bauen – Europäisches Layout
- DIY Arduino USB Gaming Controller – Bauen Sie Ihren eigenen High-Performance Gamepad
- Interaktives Joystick-Spiel mit Arduino & LED-Feedback
- Tragbarer Entfernungsmesser – Arduino Nano DIY-Kit mit HC-SR04, 18650-Akku und 3D-gedrucktem Gehäuse
- Pixel Chaser: Interaktives One-Tap-LED-Spiel mit Arduino Nano
- Kupfer-Galvanik-Projekt: Intelligentes System mit Arduino UNO bauen
- Luftfahrtfertigung für kleine Werkstätten: Ein praxisnaher Leitfaden
- Kompletter Leitfaden zur 4-Lagen-PCB-Fertigung: Schritt-für-Schritt-Prozess