Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

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

Ü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:

Was Sie in dieser Serie lernen

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.

Vom Steckbrett zur Platine: Simon Says Spiel bauen – Teil 1
Vom Steckbrett zur Platine: Simon Says Spiel bauen – Teil 1

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

  1. Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
  2. Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
  3. 37-LED-Roulette-Spiel mit Arduino Nano bauen – Europäisches Layout
  4. DIY Arduino USB Gaming Controller – Bauen Sie Ihren eigenen High-Performance Gamepad
  5. Interaktives Joystick-Spiel mit Arduino & LED-Feedback
  6. Tragbarer Entfernungsmesser – Arduino Nano DIY-Kit mit HC-SR04, 18650-Akku und 3D-gedrucktem Gehäuse
  7. Pixel Chaser: Interaktives One-Tap-LED-Spiel mit Arduino Nano
  8. Kupfer-Galvanik-Projekt: Intelligentes System mit Arduino UNO bauen
  9. Luftfahrtfertigung für kleine Werkstätten: Ein praxisnaher Leitfaden
  10. Kompletter Leitfaden zur 4-Lagen-PCB-Fertigung: Schritt-für-Schritt-Prozess