M5Stamp Pico Mate #3 – Simon says

In diesem Beitrag möchte ich dir zeigen, wie du das Geschicklichkeitsspiel „Simon says“ am M5Stamp Pico Mate mit ein paar Taster und einer RGB LED programmierst.

M5Stamp Pico Mate - Spiel "Simon say's"
M5Stamp Pico Mate – Spiel „Simon say’s“

Den M5Stamp Pico Mate habe ich dir bereits im gleichnamigen Beitrag Vorstellung des M5Stamp Pico vorgestellt. Im Beitrag M5Stamp Pico Mate #1: Taster programmieren habe ich dir bereits gezeigt, wie du einen Taster am M5Stamp programmieren kannst und das Signal im Code auswertest.

Was ist „Simon says“?

Beim Geschicklichkeitsspiel „Simon says“ geht es darum das Mitspieler eine Aktion nachmachen, was der aktuelle Spielleiter sagt, das kann zbsp. sein „Simon sagt, stehe auf einem Bein!“

Seite „Simon says (Spiel)“. In: Wikipedia – Die freie Enzyklopädie. Bearbeitungsstand: 3. September 2021, 04:13 UTC. URL: https://de.wikipedia.org/w/index.php?title=Simon_says_(Spiel)&oldid=215280317 (Abgerufen: 26. Januar 2022, 10:09 UTC)

Dieses Spielprinzip adaptieren wir auf eine RGB LED und der Spieler soll die passend farbige Taste betätigen in welche die RGB LED aufleuchtet. D.h. wenn die RGB LED rot aufleuchtet, muss die Taste mit der roten Kappe betätigt werden usw.

Benötigte Ressourcen für dieses Spiel

Für den Aufbau des Spieles benötigst du:

Pinout des M5Stamp Pico Mate

Hier nochmal das Pinout des Pico Mate.

Pinout des M5Stamp Pico Mate
Pinout des M5Stamp Pico Mate

Aufbau der Schaltung

Für den Aufbau verwende ich fünf Printtaster (mit farbigen Kappen) in der Größe 12 mm x 12 mm und natürlich noch eine RGB LED.

BauteilPin am M5Stamp Pico Mate
Taster, rotG22
Taster, grünG18
Taster, blauG19
Taster, gelbG21
RGB LED Typ SK6812G27
8fach RGB StripeG26
Anschluss der Bauteile an den M5Stamp Pico Mate
Aufbau der Schaltung "Simon say's" am M5Stamp Pico Mate
Aufbau der Schaltung „Simon say’s“ am M5Stamp Pico Mate

Programmieren von „Simon says“ in der Arduino IDE

Wir haben in diesem kleinen Spiel vier farbige Taster (rot, grün, blau und gelb) jeder dieser Taster repräsentiert eine Farbe in welcher die RGB LED aufleuchten kann. Daher definieren wir uns zunächst die möglichen Farben in einem Array entweder über RGB Werte oder als HTMLColorCode.

// Bibliothek zum ansteuern der RGB LED
#include <FastLED.h>

// Pin an welchem die LED angeschlossen ist
#define INTERN_RGB_DATA_PIN 27
#define RGB_STRIPE_DATA_PIN 26

// Anzahl der verbauten LEDs
#define NUM_LEDS 9

// Taster
#define tasterRot 22
#define tasterGruen 18
#define tasterBlau 19
#define tasterGelb 21

// Ein Objekt definieren mit den LEDs
CRGB leds[NUM_LEDS];

// aktueller Index der Farbe
int currentColorIndex = 0;
// maximale Anzahl der Farben
const int NUM_COLORS = 4;
// ein Array mit Farben
CRGB colors[NUM_COLORS] = {CRGB::Red, CRGB::Green, CRGB::Blue, CRGB::Yellow};

// Index der LEDs welche die verbleibenden "Leben" repräsentieren
int currentLeds = NUM_LEDS;
// Pause zwischen den Farbwerten
int pause = 3000;

void setup() {
  //beginn der seriellen Kommunikation mit 9600 baud
  Serial.begin(9600);
  // definieren das eine RGB LED vom Typ SK6812 am INTERN_RGB_DATA_PIN angeschlossen ist
  FastLED.addLeds<SK6812, INTERN_RGB_DATA_PIN, GRB>(leds, 0, 1);
  // definieren das 8 weitere RGB LEDs vom Typ WS2812B am Pin RGB_STRIPE_DATA_PIN angeschlossen ist
  FastLED.addLeds<WS2812B, RGB_STRIPE_DATA_PIN, GRB>(leds, 1, 9);

  // Helligkeit der LEDs auf 9 setzen (max. 10)
  FastLED.setBrightness(9);

  // Taster als Eingang über den internen 10kOhm Widerstand
  pinMode(tasterRot, INPUT_PULLUP);
  pinMode(tasterGruen, INPUT_PULLUP);
  pinMode(tasterBlau, INPUT_PULLUP);
  pinMode(tasterGelb, INPUT_PULLUP);

  // initialisieren des Spieles
  startGame();
}

//Initialisiert das Spiel
void startGame() {
  // zurücksetzen des Wertes für die verbleibenden "Leben"
  currentLeds = NUM_LEDS;
  // eine Schleife von 1 bis currentLeds,
  // wobei die LEDs in die Farbe rot gefärbt werden
  for (int i = 1; i < currentLeds; i++) {
    leds[i] = CRGB::Red;
  }
  FastLED.show();
  // Pause auf 3000 ms setzen
  pause = 3000;
  // zurücksetzen der Farbe
  resetColor();
}

void loop() {
  // Auswerten der Taster und der Farben
  if (digitalRead(tasterRot) == LOW) {
    testBtnIndex(0);
  } else if (digitalRead(tasterGruen) == LOW) {
    testBtnIndex(1);
  } else if (digitalRead(tasterBlau) == LOW) {
    testBtnIndex(2);
  } else if (digitalRead(tasterGelb) == LOW) {
    testBtnIndex(3);
  }
}

// Testet ob der betätigte Taster zur aktuellen Farbe passt.
void testBtnIndex(int index) {
  if (currentColorIndex == index) {
    //setzen einer neuen Farbe
    resetColor();
  } else {
    // Taster passt NICHT und es wird ein "Leben" abgezogen"
    fail();
  }
}

// zieht von der Variable "currentLeds" einen ab und zeigt den aktuellen Wert auf
// dem LED Stripe an
void fail() {
  Serial.println("fail");
  // zieht einen von der Variable ab
  currentLeds--;
  // Wenn der Wert größer als 1 ist dann...
  if (currentLeds > 1) {
    // Alle LEDs auf schwarz setzen
    for (int i = 1; i <= NUM_LEDS; i++) {
      leds[i] = CRGB::Black;
    }
    // anzeigen
    FastLED.show();

    // alle LED bis zum aktuellen "Leben" auf rot setzen
    for (int i = 1; i < currentLeds; i++) {
      leds[i] = CRGB::Red;
    }
    FastLED.show();
    resetColor();
  } else {
    // Wenn alle "Leben" aufgebraucht sind dann...
    endGame();
  }
}

// Beendet das Spiel, da alle "Leben" aufgebraucht wurden.
void endGame() {
  int p = 125;

  for (int i = 1; i <= NUM_LEDS; i++) {
    leds[i] = CRGB::Red;
    FastLED.show();
    delay(p);
  }


  for (int i = NUM_LEDS; i >= 1; i--) {
    leds[i] = CRGB::Black;
    FastLED.show();
    delay(p);
  }

  for (int i = 1; i <= NUM_LEDS; i++) {
    leds[i] = CRGB::Red;
    FastLED.show();
    delay(p);
  }

  startGame();
}

// Zieht von dem initialen Wert der Pause (3000) 20ms ab
// und zeigt eine neue Farbe.
// Somit erfolgt ein immer schnellerer Wechsel der Farbe
void resetColor() {
  pause = pause - 25;
  displayRandomColor();
}

// Zeigt eine zufällige Farbe aus dem definierten Array der Farben an.
void displayRandomColor() {
  // zunächst die aktuelle LED abdunkeln
  leds[0] = CRGB::Black;
  FastLED.show();
  delay(pause);

  // ermitteln einer Zufallszahl von 0 bis [anzahl Farben im Array]
  currentColorIndex = random(0, NUM_COLORS);
  leds[0] = colors[currentColorIndex];
  Serial.println(currentColorIndex);
  FastLED.show();
}

Hier nun das Video zum Spiel „Simon say’s“.

M5Stamp Pico Mate - Game "Simon say's"
Dieses Video ansehen auf YouTube.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht.