Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

M5Stamp Pico Mate #3 – Simon says

Posted on 7. März 202210. März 2024 by Stefan Draeger

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“?
  • Benötigte Ressourcen für dieses Spiel
  • Pinout des M5Stamp Pico Mate
  • Aufbau der Schaltung
  • Programmieren von „Simon says“ in der Arduino IDE

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:

  • einen M5Stamp Pico Mate*,
    • ein USB-Typ-C Datenkabel*,
    • einen ESP32 Downloader*,
  • vier 12 mm x12 mm Taster*,
  • vier verschiedenfarbige Kappen für die Taster*,
  • ein 400 Pin Breadboard*,
  • diverse Breadboardkabel*, männlich – männlich, 20 cm

Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!

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 HTML Color Code.

// 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 auf YouTube ansehen.

1 thought on “M5Stamp Pico Mate #3 – Simon says”

  1. Pingback: M5Stamp Pico Mate #4: OLED Display anschließen - Technik Blog

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}