Das Farbenspiel ist ein einfaches Reaktionsspiel. Es kann genauso gut von nur einer Person als auch von mehreren
gespielt werden. Grundsätzlich besteht das Spiel aus vier Tastern, die jeweils andere Farbe haben, und einer RGB-Leuchtdiode.
Die Regeln sind simpel. Mit der RGB-Leuchtdiode wird vorgegeben, welcher Taster gedrückt werden soll. Leuchtet z.B. die
Leuchtdiode rot auf, so muss der rote Taster betätigt werden. Gespielt wird mit vier Farben: Blau, Gelb, Grün und Rot. Die
Schwierigkeit des Spiels besteht darin, den Taster in einer vorgegebenen Zeit zu betätigen. Gelingt es nicht, wird das Spiel
unterbrochen. In diesem Fall leuchtet eine zweite RGB-Leuchtdiode, die Status-LED, rot auf. Auf einer 7-Segmentanzeige kann
man dann anschließend den Spielzähler, der anzeigt, wie viele gelungene Versuche man absolviert hat, ablesen. Falls mehrere
Personen an dem Spiel teilnehmen, kann auf diesem Wege der Gewinner ermittelt werden. Gewonnen hat der Spieler, bei dem der
Zähler den höchsten Stand erreicht hat.
RGB-Leuchtdioden
Bei einer RGB-LED handelt es sich um eine Kombination aus 3 LEDs. Jede einzelne Leuchtdiode hat eine andere Farbe: Rot,
Grün und Blau. Jede diesen Leuchtdioden kann separat angesteuert werden. Je nachdem, welche einzelne Leuchtdiode zugeschaltet
wurde und mit welcher Intensität sie leuchtet, gibt die RGB-LED als Ergebnis eine andere Farbe aus. Beispielsweise ergeben die
Leuchtdioden Rot und Grün eine gelbe Farbe der RGB-LED.
// *****************************************************************************************
// Farbenspiel mit RGB-LED
// Arduino UNO
// IDE 1.8.16
// *****************************************************************************************
#include<TM1637Display.h> // Display Bibliothek
#define CLK 3
#define DIO 4
TM1637Display display(CLK, DIO);
#define Taster_Start A4 // Analoger Eingang A4
#define Schalter_Level A5 // Analoger Eingang A5
#define Taster_Rot 10 // Digitale Eingänge Taster
#define Taster_Gruen 11
#define Taster_Gelb 12
#define Taster_Blau 13
#define RGB2_rot 5 // Info RGB-LED
#define RGB2_gruen 6
#define RGB1_rot 7 // Spiel RGB-LED
#define RGB1_gruen 8
#define RGB1_blau 9
bool Verloren;
void setup() { // SetUp
display.setBrightness(20); // Anzeige Helligkeit
display.clear();
pinMode (Schalter_Level, INPUT_PULLUP); // Eingänge
pinMode (Taster_Start, INPUT_PULLUP);
pinMode (Taster_Rot, INPUT_PULLUP);
pinMode (Taster_Gruen, INPUT_PULLUP);
pinMode (Taster_Gelb, INPUT_PULLUP);
pinMode (Taster_Blau, INPUT_PULLUP);
pinMode (RGB1_gruen, OUTPUT); // Ausgänge
pinMode (RGB1_rot, OUTPUT);
pinMode (RGB1_blau, OUTPUT);
pinMode (RGB2_gruen, OUTPUT);
pinMode (RGB2_rot, OUTPUT);
}
void loop() { // Hauptprogramm
int Level = 300; // Level Umschaltung
if (digitalRead (Schalter_Level) == LOW) {
Level = 150;
}
if (digitalRead (Taster_Start) == LOW) { // Spiel Start
Alles_Aus (); // Alle LEDs aus
Display_Ausgabe (0); // 7-Segmentanzeige nullen
int Zaehler = -1; // Zähler Startwert
Verloren = false; // "Verloren" Vorbelegung
for (int i = 0; i < 5; i++) { // Grüne LED blinkt
digitalWrite (RGB2_gruen, HIGH);
delay (200);
digitalWrite (RGB2_gruen, LOW);
delay (500);
}
while (!Verloren) { // Spielschleife Start
Alles_Aus (); // Alle LEDs aus
delay (40); // Wartezeit für AUS-Zustand
int Farbe = random (1,5); // Neue farbe via Zufall
Zaehler ++; // Zähler inkrementieren
Display_Ausgabe (Zaehler); // Zählerstand anzeigen
bool Richtige_Taste = false; // Hilfsvariable "Richtige_Taste"
for (int i = 0; i < Level; i++) { // Abfrage Schleife Start
switch (Farbe) {
case 1: {
digitalWrite (RGB1_blau, HIGH); // Spiel RGB-LED ein
if (digitalRead (Taster_Blau) == LOW) { // Richtige Taste betätigt?
Richtige_Taste = true; // Hilfsvariable auf TRUE
}
break;
}
case 2: {
digitalWrite (RGB1_rot, HIGH);
digitalWrite (RGB1_gruen, HIGH);
if (digitalRead (Taster_Gelb) == LOW) {
Richtige_Taste = true;
}
break;
}
case 3: {
digitalWrite (RGB1_gruen, HIGH);
if (digitalRead (Taster_Gruen) == LOW) {
Richtige_Taste = true;
}
break;
}
case 4: {
digitalWrite (RGB1_rot, HIGH);
if (digitalRead (Taster_Rot) == LOW) {
Richtige_Taste = true;
}
break;
}
}
Verloren = true; // "Verloren" mit TRUE vorbelegen
if (Richtige_Taste) { // Richtige Taste betätigt?
Verloren = false; // Ja. Spiel geht weiter.
}
delay (5); // Wartezeit
}
}
}
if (Verloren) { // Falsche Taste oder zu spät
digitalWrite (RGB2_rot, HIGH); // Spiel Aus, rote LED an.
}
}
void Display_Ausgabe (int Zaehler) { // Aktuellen Zählerstand anzeigen
String Ausgabe = String (Zaehler); // Zahl in String umwandeln
display.showNumberDecEx(Ausgabe.toInt(), 0b00000000, false, 4, 4); // Ausgabe Display
}
void Alles_Aus () { // Hilfsprogramm alle LEDs aus
digitalWrite (RGB1_rot, LOW);
digitalWrite (RGB1_gruen, LOW);
digitalWrite (RGB1_blau, LOW);
digitalWrite (RGB2_rot, LOW);
digitalWrite (RGB2_gruen, LOW);
}
// *****************************************************************************************
Das Spiel wird mit dem Taster S5 gestartet. Gleich nachdem der Taster betätigt wurde, leuchtet die Leuchtdiode
RGB-LED2 fünf Mal grün auf. Direkt danach geht das Programm in eine Endlosschleife (while (!Verloren)), die nur dann verlassen
werden kann, wenn die Variable „Verloren“ auf TRUE geht. Dies geschieht dann, wenn der Spieler es nicht geschafft hat, den
vorgegebenen Taster in dem festgelegten Zeitintervall zu betätigen. Sonst wird nach jedem richtigen Tastendruck via Zufall eine
neue Farbe gewählt und damit dem Spieler eine neue Aufgabe gestellt.
Jeder erfolgreiche Tastendruck wird von dem Spielzähler (Variable Zähler) erfasst. Der Zählerstand wird dann jeweils um
1 inkrementiert. Der aktuelle Zählerstand wird auf einer 7-Segmentanzeige angezeigt.
Mit der Variable „Level“ wird das Zeitintervall, in dem der richtige Taster gedrückt werden muss, festgelegt. Die Variable
„Level“ bestimmt Anzahl der Durchläufe der FOR-Schleife, die nach jedem Durchlauf mit delay(5) kurz angehalten wird. Die Variable
„Level“ kann mit dem Taster S6 bestimmt werden. In der Ausführung stehen zwei Spiellevel zur Verfügung. Bei Bedarf können mit
weiteren Schaltern mehrere Spiellevels eingeführt werden.
In dem Beispiel sind die Taster S5 und der Schalter S6 an die analogen Eingänge des Arduino angeschlossen. Sie werden im
Programm als digitalen Eingänge behandelt und ausgewertet.