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.
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:
- 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.
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.
Bauteil | Pin am M5Stamp Pico Mate |
---|---|
Taster, rot | G22 |
Taster, grün | G18 |
Taster, blau | G19 |
Taster, gelb | G21 |
RGB LED Typ SK6812 | G27 |
8fach RGB Stripe | G26 |
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”.
1 thought on “M5Stamp Pico Mate #3 – Simon says”