Zum Senso: Gehäuse im 3D-Druck erzeugt und aus lasergeschnittenen Arcylteilen gefertigt. Hardware: Arduino Standard, Mp3-Player (DFPlayer mini), LCD-Display 16×2, 4 Tastenfelder jeweils mit individuell ansteuerbarer LED und 4 zusätzliche Bedientasten. Funktionen: Verschiedene Spiele mit Licht- und Soundeffekten und MP3-Player zum Musikabspielen mit verschiedenen Lichteffekten. Besonderheiten: Objektorientierte Software, die speziell mit den beschränkten Fähigkeiten eines normalen Arduino umgehen muss in Bezug auf Speicherkapazität und Rechenleistung. Ergebnis: Absolut direkte Bedienung ohne jegliche Hänger. Reagiert jederzeit auf alle Tastendrücke. Ebenfalls Aufbau einer Menüstruktur, die mit den geringen Ressourcen umgehen kann und eine gute Basis ist für weitere Projekte. Mit dieser Software wurde speziell gezeigt, wie eine Echtzeitfähigkeit mit einem Mikrocontroller erreicht werden kann.
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Den Tasten wird eine programminterne Nummer zugeordnet:
define oben 0
define rechts 1
define unten 2
define links 3
define ESC 4
define Pfeil_links 5
define Pfeil_rechts 6
define Enter 7
// Nur zur Info für LCD-Darstellung: ä:”\xE1″, ö :”\xEF”, ü :”\xF5″, ß:”\xE2″, °:”\xDF”, μ:”\xE4″, Ω:”\xF4″, komplett helles Feld:”\xFF”
// Prototyping:
class Tastenklasse;
class KeySoundSet;
class LEDklasse;
class Menuepunkt;
class Liedwahl;
void leiser();
void lauter();
void soundStop();
void Spiele_Lied(uint8_t Songnumber);
void schreibe(const String& a, const String& b);
void schreibe_loops(uint8_t Zahl);
class Tastenklasse {
private:
int Pinnummer; // die hardwaremäßige Pinnummer der Taste am Arduino
bool Key_pressed; // hier wird der letzte Tastenzustand gespeichert 1=war gedrückt
public:
bool Tastenevent; // Das Ereignis des Drückens der Taste, nicht der zustand des Gedrücktseins !
void Setup(int Pinnummer_) { Pinnummer = Pinnummer_; // Die private Variable Pinnummer wird mit dem Wert der übergebenen Variablen belegt pinMode(Pinnummer, INPUT); // Weil eine Taste angeschlossen ist muss der Eingang natürlich auf INPUT gesetzt werden Key_pressed = false; } void Eventabfrage() { // setzt Key_pressed auf true, wenn die Taste gedrückt ist und Tastenevent auf true, wenn sie bei der letzten Abfrage nicht gedrückt war Tastenevent = false; if (digitalRead(Pinnummer) == 1) { if (! Key_pressed) Tastenevent = true; // wenn die Taste seither nicht gedrückt war: Key_pressed = true; } else Key_pressed = false; } bool pressed() { return (Key_pressed); }
};
class LEDklasse {
private:
int Pinnummer;
bool ist_ein;
int Helligkeit;
public:
void Setup (int Pinnummer_, int Helligkeit_) {
Pinnummer = Pinnummer_;
Helligkeit = Helligkeit_; // Helligkeit ist die aktuell eingestellte Helligkeit
ist_ein = false;
}
void ein() { ist_ein = true; } void aus() { ist_ein = false; } void set_Helligkeit(int Helligkeit_) { Helligkeit = Helligkeit_; } void heller(int Schritt) { Helligkeit += Schritt; if (Helligkeit > 255) Helligkeit = 255; } void dunkler(int Schritt) { Helligkeit -= Schritt; if (Helligkeit < 0) Helligkeit = 0; } void strahle() { Helligkeit = (Helligkeit << 1) + 1; if (Helligkeit > 255) Helligkeit = 255; } void verblasse() { Helligkeit = Helligkeit >> 1; } void set(bool soft_) { if (ist_ein or soft_) analogWrite(Pinnummer, Helligkeit); else analogWrite(Pinnummer, 0); }
};
LEDklasse LED[4];
class KeySoundSet {
private:
uint8_t _ESC, _Arraynummer;
uint8_t Soundset = 190; //Tastensounds: 190 = Liednummer 190..194, 195 = Liednummer 195..199, 200 = Liednummer 200..204 4 Töne und ein “Zong”
uint8_t _Number_of_Sets;
public:
void set(uint8_t ESC_, uint8_t Arraynummer_, uint8_t Number_of_Sets_) {
ESC = ESC;
Arraynummer = Arraynummer;
Number_of_Sets = Number_of_Sets;
}
uint8_t Soundnumber() { return (Soundset); } uint8_t loop(Tastenklasse Tastatur[]) { if (Tastatur[Pfeil_links].Tastenevent) { if (Soundset > 190) Soundset -= 5; } if (Tastatur[Pfeil_rechts].Tastenevent) { if (Soundset < 5 * (_Number_of_Sets - 1) + 190) Soundset += 5; } schreibe("", "Set: " + String((Soundset - 190) / 5 + 1) + " try it!"); for (uint8_t i = 0; i < 4; i++) { if (Tastatur[i].pressed()) LED[i].ein(); else LED[i].aus(); if (Tastatur[i].Tastenevent) Spiele_Lied(Soundset + i); } if (Tastatur[Enter].Tastenevent) Spiele_Lied(Soundset + 4); // Zong auf Enter if (Tastatur[ESC].Tastenevent) return (_ESC); else return (_Arraynummer); }
};
KeySoundSet Tastensound;
class Menuepunkt {
private:
uint8_t _links, _rechts, _ESC, _Enter, Eigene_Menuenummer;
public:
void set(uint8_t links_, uint8_t rechts_, uint8_t ESC_, uint8_t Enter_, uint8_t Eigene_Menuenummer_) { _links = links_; _rechts = rechts_; _ESC = ESC_; _Enter = Enter_; Eigene_Menuenummer = Eigene_Menuenummer_; } uint8_t loop(Tastenklasse Tastatur[]) { if (Tastatur[Pfeil_links].Tastenevent) return (_links); if (Tastatur[Pfeil_rechts].Tastenevent)return (_rechts); if (Tastatur[ESC].Tastenevent) return (_ESC); if (Tastatur[Enter].Tastenevent) return (_Enter); else return (Eigene_Menuenummer); }
};
class Senso_Classic {
private:
uint8_t Key_event[4], Key_pressed[4], _ESC, Eigene_Menuenummer, Spielzustand, Zaehler, Vorgabetaste[50], akt_elem; // Spielzustand 0=Zufallsfolge erzeugen, 1 = spielt vor, 2 = nachspielen;
unsigned long timestamp;
public:
void set(uint8_t ESC_, uint8_t Eigene_Menuenummer_) {
ESC = ESC;
Eigene_Menuenummer = Eigene_Menuenummer_;
Spielzustand = 0;
Zaehler = 0;
akt_elem = 0;
}
uint8_t loop(Tastenklasse Tastatur[]) { Key_event[0] = Tastatur[oben].Tastenevent; Key_event[1] = Tastatur[rechts].Tastenevent; Key_event[2] = Tastatur[unten].Tastenevent; Key_event[3] = Tastatur[links].Tastenevent; Key_pressed[0] = Tastatur[oben].pressed(); Key_pressed[1] = Tastatur[rechts].pressed(); Key_pressed[2] = Tastatur[unten].pressed(); Key_pressed[3] = Tastatur[links].pressed(); if (Spielzustand == 0 and Zaehler == 0) { // Spiel hat noch nicht begonnen for (auto &i : LED) i.set_Helligkeit(255); randomSeed(millis()); // den Randombefehl mit der aktuellen zufälligen Systemzeit setzen (macht diesen wirklich zufällig) for (auto &i : Vorgabetaste) i = random(4); // vorbelegen einer Zufallsfolge Zaehler = 1; // Zaehler gibt vor, wieviele Tasten man sich merken muss Spielzustand = 1; // 1=Abspielen der Zufallsfolge / 2=Nachspielen timestamp = millis(); schreibe_loops(Zaehler); } else { if (Spielzustand == 1 and millis() - 300 > timestamp) for (auto &i : LED) i.aus(); if (Spielzustand == 1 and millis() - 500 > timestamp) { // Abspielen timestamp = millis(); if (akt_elem < Zaehler) { LED[Vorgabetaste[akt_elem]].ein(); Spiele_Lied(Tastensound.Soundnumber() + Vorgabetaste[akt_elem]); akt_elem++; } else { Spielzustand = 2; // Umschalten auf Nachspielen akt_elem = 0; } } else if (Spielzustand == 2) { // Nachspielen for (uint8_t i = 0; i < 4; i++) { // alle LEDs ausschalten if (not Key_pressed[i]) LED[i].aus(); // nur, wenn die Taste losgelassen wurde. } if (Key_event[Vorgabetaste[akt_elem]]) { // es wurde die richtige Taste gedrückt LED[Vorgabetaste[akt_elem]].ein(); Spiele_Lied(Tastensound.Soundnumber() + Vorgabetaste[akt_elem]); akt_elem++; } else { for (uint8_t i = 0; i < 4; i++) { if (Key_event[i] and i != Vorgabetaste[akt_elem]) // Falsch getippt { Spiele_Lied(Tastensound.Soundnumber() +4); delay (2500); Zaehler = 0; akt_elem = 0; Spielzustand = 0; } } } if (akt_elem == Zaehler) { // alle wurden richtig getippt, zurück zum Abspielen Spielzustand = 1; akt_elem = 0; Zaehler++; schreibe_loops(Zaehler); timestamp = millis() + 1000; } } } if (Tastatur[ESC].Tastenevent) { Spielzustand = 0; Zaehler = 0; akt_elem = 0; return (_ESC); } else return (Eigene_Menuenummer); }
};
class Reaktionsspiel {
private:
uint8_t _ESC, Eigene_Menuenummer, Spielzustand, Countdown, Taste; // Spielzustand 0 = Neu gestartet, 1 = Startmodus, 2 = Taste wird vorgegeben, 3 = warte auf Tastendruck;
unsigned long Restzeit, Punkte, Top_Punkte, timestamp;
public:
void set(uint8_t ESC_, uint8_t Eigene_Menuenummer_) {
ESC = ESC;
Eigene_Menuenummer = Eigene_Menuenummer_;
Spielzustand = 0;
Top_Punkte = 0;
}
uint8_t loop(Tastenklasse Tastatur[]) { switch (Spielzustand) { case 0 : for (auto &i : LED) { i.set_Helligkeit(255); i.aus(); } Countdown = 5; Restzeit = 20000; Punkte = 0; timestamp = millis(); Spielzustand = 1; break; case 1: schreibe("Start in " + String(Countdown) + " sek. ", "Punkte:" + String(Punkte) + " Top:" + String(Top_Punkte) + " "); if (millis() >= timestamp + 1000) { Countdown--; timestamp = millis(); } if (Countdown == 0) Spielzustand = 2; break; case 2: randomSeed(millis()); // den Randombefehl mit der aktuellen zufälligen Systemzeit setzen (macht diesen wirklich zufällig) Taste = random(4); schreibe("Rest: " + String(Restzeit) + "ms ", "Punkte:" + String(Punkte) + " Top:" + String(Top_Punkte) + " "); Spiele_Lied(Tastensound.Soundnumber() + Taste); LED[Taste].ein(); timestamp = millis(); Spielzustand = 3; break; case 3: Restzeit -= (millis() - timestamp); // Restzeit wird reduziert um die Zeit, die seit dem letzten Aufruf dieser Methode vergangen ist. timestamp = millis(); schreibe("Rest: " + String(Restzeit) + "ms ", "Punkte:" + String(Punkte) + " Top:" + String(Top_Punkte) + " "); for (int i = 0; i < 4; i++) { if (Tastatur[i].Tastenevent) { if (i == Taste) { // Die richtige Taste wurde gedrückt soundStop(); Punkte++; LED[Taste].aus(); if (Punkte > Top_Punkte) Top_Punkte = Punkte; Spielzustand = 2; } else { // die falsche Taste wurde gedrückt Spiele_Lied(Tastensound.Soundnumber() +4); for (auto &i : LED) i.ein(); delay (2500); for (auto &i : LED) i.aus(); if (Punkte > Top_Punkte) Top_Punkte = Punkte; Spielzustand = 0; } } } if (Restzeit > 1000000) { // Spielzeit ist vorbei (wegen unsigned wird Restzeit nicht negativ, sondern riesengroß) for (auto &i : LED) i.aus(); Spielzustand = 0; } break; } if (Tastatur[ESC].Tastenevent) { for (auto &i : LED) i.aus(); Spielzustand = 0; return (_ESC); } else return (Eigene_Menuenummer); }
};
class Liedwahl {
private:
uint8_t _links, _rechts, _ESC, _Enter;
bool _Lied_spielt = false;
public:
void set(uint8_t links_, uint8_t rechts_, uint8_t ESC_, uint8_t Enter_) {
links = links;
rechts = rechts;
ESC = ESC;
Enter = Enter;
}
uint8_t loop(Tastenklasse Tastatur[]) { if (Tastatur[links].pressed()) leiser(); if (Tastatur[rechts].pressed()) lauter(); if (Tastatur[oben].pressed()) for (auto &i : LED) i.heller(5); if (Tastatur[unten].pressed()) for (auto &i : LED) i.dunkler(5); if (Tastatur[Pfeil_links].Tastenevent) { _Lied_spielt = false; return (_links); } if (Tastatur[Pfeil_rechts].Tastenevent) { _Lied_spielt = false; return (_rechts); } if (Tastatur[ESC].Tastenevent) { soundStop(); if (_Lied_spielt) { _Lied_spielt = false; return (_Enter); } else return (_ESC); } if (Tastatur[Enter].pressed()) { if (not _Lied_spielt) { Spiele_Lied(_Enter); _Lied_spielt = true; } } return (_Enter); }
};
class DiscoSpeedSet {
private:
uint8_t _ESC, _Arraynummer;
public:
unsigned long Discotimer = 200; void set(uint8_t ESC, uint8_t Arraynummer_) {
ESC = ESC;
Arraynummer = Arraynummer;
}
uint8_t loop(Tastenklasse Tastatur[]) { if (Tastatur[Pfeil_links].pressed() and _Discotimer > 0) _Discotimer--; if (Tastatur[Pfeil_rechts].pressed() and _Discotimer < 2000) _Discotimer++; schreibe("set Pause: " + String(_Discotimer) + "ms ", "Nur f\xF5r Typ hard"); if (Tastatur[oben].pressed()) { // obere Taste = heller LED[oben].ein(); for (auto &i : LED) i.heller(5); } else LED[oben].aus(); if (Tastatur[unten].pressed()) { // untere Taste = dunkler LED[unten].ein(); for (auto &i : LED) i.dunkler(5); } if (Tastatur[ESC].Tastenevent) { for (auto &i : LED) i.aus(); return (_ESC); } else return (_Arraynummer); }
};
class DiscoTypeSet {
private:
uint8_t _ESC, _Arraynummer, DiscoTyp, Discolight;
uint16_t Lichtspiele[10] = {0x0F0F, 0xEDB7, 0x6C93, 0x1248, 0xA5A5, 0xF5A0, 0xAA55, 0x2585, 0xA4A1, 0x0000}; // jede Stelle entspricht einem der vier hintereinander abzuspielenden Bilder (rückwärts)
/* 0 0000 4 0100 8 1000 C 1100
1 0001 5 0101 9 1001 D 1101
2 0010 6 0110 A 1010 E 1110
3 0011 7 0111 B 1011 F 1111 */
uint8_t Anzahl_Lichtspiele = 10;
unsigned long _timestamp;
uint8_t Stufe;
public:
bool soft;
void set(uint8_t ESC_, uint8_t Arraynummer_) { _ESC = ESC_; _Arraynummer = Arraynummer_; _timestamp = millis(); Discolight = 0; DiscoTyp = 3; soft = false; Stufe = 0; } uint8_t loop(Tastenklasse Tastatur[]) { if (Tastatur[Pfeil_links].Tastenevent && (DiscoTyp > 0)) { if (DiscoTyp == Anzahl_Lichtspiele) for (auto &i : LED) i.set_Helligkeit(200); // wenn von Soft auf Hard gewechselt wurde, dann Helligkeit einstellen DiscoTyp--; for (auto &i : LED) i.set_Helligkeit(200); } if (Tastatur[Pfeil_rechts].Tastenevent && (DiscoTyp < 2 * Anzahl_Lichtspiele - 1)) { DiscoTyp++; if (DiscoTyp == Anzahl_Lichtspiele) for (auto &i : LED) { i.set_Helligkeit(0); // wenn von Hart auf Soft gewechselt wurde, dann Helligkeit einstellen i.ein(); } } if (DiscoTyp >= Anzahl_Lichtspiele) schreibe("", " Typ: " + String(DiscoTyp - Anzahl_Lichtspiele) + " soft "); else { if (Tastatur[oben].pressed()) { // obere Taste = heller LED[oben].ein(); for (auto &i : LED) i.heller(5); } else LED[oben].aus(); if (Tastatur[unten].pressed()) { // untere Taste = dunkler LED[unten].ein(); for (auto &i : LED) i.dunkler(5); } schreibe("", " Typ: " + String(DiscoTyp) + " hard "); } if (Tastatur[ESC].Tastenevent) { for (auto &i : LED) i.aus(); return (_ESC); } else return (_Arraynummer); } void next_Discolight(unsigned long timestep) { if (DiscoTyp < Anzahl_Lichtspiele) { // hard if (millis() >= timestep + _timestamp) { _timestamp = millis(); if (++Discolight > 3) Discolight = 0; } if ((Lichtspiele[DiscoTyp] >> (4 * Discolight + 3)) & 1) LED[oben].ein(); else LED[oben].aus(); if ((Lichtspiele[DiscoTyp] >> (4 * Discolight + 2)) & 1) LED[rechts].ein(); else LED[rechts].aus(); if ((Lichtspiele[DiscoTyp] >> (4 * Discolight + 1)) & 1) LED[unten].ein(); else LED[unten].aus(); if ((Lichtspiele[DiscoTyp] >> (4 * Discolight + 0)) & 1) LED[links].ein(); else LED[links].aus(); } else // soft { for (auto &i : LED) i.ein(); Stufe ++; if (Stufe < 8) { if ((Lichtspiele[DiscoTyp - Anzahl_Lichtspiele] >> (4 * Discolight + 3)) & 1) LED[oben].strahle(); else LED[oben].verblasse(); if ((Lichtspiele[DiscoTyp - Anzahl_Lichtspiele] >> (4 * Discolight + 2)) & 1) LED[rechts].strahle(); else LED[rechts].verblasse(); if ((Lichtspiele[DiscoTyp - Anzahl_Lichtspiele] >> (4 * Discolight + 1)) & 1) LED[unten].strahle(); else LED[unten].verblasse(); if ((Lichtspiele[DiscoTyp - Anzahl_Lichtspiele] >> (4 * Discolight + 0)) & 1) LED[links].strahle(); else LED[links].verblasse(); } else { Stufe = 0; if (++Discolight > 3) Discolight = 0; } } }
};
void lauter() {
Serial.write(0x7e); Serial.write(0xff); Serial.write(0x04); Serial.write(0x04); Serial.write(0x00); Serial.write(0xef); delay(30);
}
void leiser() {
Serial.write(0x7e); Serial.write(0xff); Serial.write(0x04); Serial.write(0x05); Serial.write(0x00); Serial.write(0xef); delay(30);
}
void soundPlay() {
Serial.write(0x7e); Serial.write(0xff); Serial.write(0x06); Serial.write(0x0d); Serial.write(0x00); Serial.write(0x00); Serial.write(0x00); Serial.write(0xef);
}
void soundStop() {
Serial.write(0x7e); Serial.write(0xff); Serial.write(0x06); Serial.write(0x0e); Serial.write(0x00); Serial.write(0x00); Serial.write(0x00); Serial.write(0xef);
}
// Auf der SD-Karte im Verzeichnis “01” stehen abspielbare Dateien – Beispiel: “000.mp3” (nr=0) oder “017.mp3” (nr=17)
void soundSelect(uint8_t nr) {
Serial.write(0x7e); Serial.write(0xff); Serial.write(0x06); Serial.write(0x0f); Serial.write(0x00); Serial.write(0x01); Serial.write(nr); Serial.write(0xef);
}
void Spiele_Lied(uint8_t Songnumber) {
soundStop();
delay(20);
soundSelect(Songnumber);
delay(20);
soundPlay();
}
String Textzeile1 = ” “, Textzeile2 = ” “;
void schreibe(const String& a, const String& b) {
// lcd.clear();
if (a != Textzeile1) {
lcd.setCursor(0, 0);
lcd.print(a);
}
if (b != Textzeile2) {
lcd.setCursor(0, 1);
lcd.print(b);
}
}
void schreibe_loops(uint8_t Zahl) {
char Text[16] {“Nachspielen “};
Text[13] = (Zahl – Zahl % 10) / 10 + 48;
Text[14] = Zahl % 10 + 48;
schreibe(“”, Text);
}
// Definition unserer globalen Variablen:
Tastenklasse Key[8];
uint8_t Spielzustand = 0, Zaehler = 0, Vorgabetaste[50], akt_elem = 0; // Spiel-1: Spielzustand 0 = spielt vor, 1 = nachspielen
unsigned long timestamp;
Menuepunkt Menue[8];
Liedwahl Lied[17];
Senso_Classic Spiel_Senso_Classic;
Reaktionsspiel Spiel_Reaktion;
DiscoTypeSet DiscoElement;
DiscoSpeedSet Einstellungsmenue_discospeed;
uint8_t akt_Menue = 0;
void setup() { // Hier im setup() wird alles Mögliche konfiguriert:
lcd.init(); // initialisierung das LCD mit I²C-Schnittstelle
lcd.backlight(); // LCD-Hintergrundbeleuchtung einschalten
Serial.begin(9600, SERIAL_8N1); // Serielle Kommunikation mit dem MP3-Player einstellen
// Hardwaremäßige Pinbelegung am Arduino UNO: // Belegung von Anto und Jan
Key[oben].Setup(7); // 7 identisch
Key[rechts].Setup(2); // 2 identisch
Key[unten].Setup(4); // 4 identisch
Key[links].Setup(8); // 9
Key[ESC].Setup(17); // A3 identisch
Key[Pfeil_links].Setup(16); // A2 identisch
Key[Pfeil_rechts].Setup(15); // A1 identisch
Key[Enter].Setup(14); // A0 identisch
// LEDs alle auf PWM-Ausgängen:
LED[oben].Setup(6, 100); // 6 identisch
LED[rechts].Setup(3, 100); // 3 identisch
LED[unten].Setup(5, 100); // 5 identisch
LED[links].Setup(9, 100); // 10
// Initilisierug aller Menüpunkte:
Menue[0].set(0, 1, 0, 3, 0); // Hauptmenü-Spiele spielen set(links, rechts, ESC, Enter, eigene Arraynummer)
Menue[1].set(0, 2, 1, 100, 1); // Hauptmenü-Lieder abspielen
Menue[2].set(1, 2, 2, 5, 2); // Hauptmenü-Einstellungen
Menue[3].set(3, 4, 0, 50, 3); // Spiele spielen-Senso Classic
Menue[4].set(3, 4, 0, 51, 4); // Spiele spielen-Reaktionsspiel
Menue[5].set(5, 6, 2, 98, 5); // Einstellungen-disco Typ
Menue[6].set(5, 7, 2, 99, 6); // Einstellungen-disco speed
Menue[7].set(6, 7, 2, 97, 7); // Einstellung des Tastensoundtyps
Spiel_Senso_Classic.set(3, 50); // Classic Senso spielen set(ESC, eigene Arraynummer)
Spiel_Reaktion.set(4, 51); // reaktionsspiel set(ESC, eigene Arraynummer)
Tastensound.set(7, 97, 2); // Tastensound festlegen set(ESC, eigene Arraynummer, Anzahl verschiedener Soundstiele)
DiscoElement.set(5, 98); // disco Typ festlegen set(ESC, eigene Arraynummer)
Einstellungsmenue_discospeed.set(6, 99); // disco speed-Set speed set(ESC, eigene Arraynummer)
Lied[0].set(100, 101, 1, 100); // Bei den Menüpunkten Lied steht immer die Arraynummer + 100 !
Lied[1].set(100, 102, 1, 101); // Das ist gleichzeitig die Songnummer
Lied[2].set(101, 103, 1, 102);
Lied[3].set(102, 104, 1, 103);
Lied[4].set(103, 105, 1, 104);
Lied[5].set(104, 106, 1, 105);
Lied[6].set(105, 107, 1, 106);
Lied[7].set(106, 108, 1, 107);
Lied[8].set(107, 109, 1, 108);
Lied[9].set(108, 110, 1, 109);
Lied[10].set(109, 111, 1, 110);
Lied[11].set(110, 112, 1, 111);
Lied[12].set(111, 113, 1, 112);
Lied[13].set(112, 114, 1, 113);
Lied[14].set(113, 115, 1, 114);
Lied[15].set(114, 116, 1, 115);
Lied[16].set(115, 116, 1, 116);
timestamp = millis();
}
void loop() {
for (auto &i : Key) i.Eventabfrage(); // Über alle Tasten (setzt die Tastenevents):
for (auto &i : LED) i.set(DiscoElement.soft); // LEDs ansteuern auf den im letzten Durchlauf gewählten Zustand
if (akt_Menue < 50) akt_Menue = Menue[akt_Menue].loop(Key); // allgemeine Menüs
else if (akt_Menue == 50) akt_Menue = Spiel_Senso_Classic.loop(Key); // Senso_Classic
else if (akt_Menue == 51) akt_Menue = Spiel_Reaktion.loop(Key); // Reaktionsspiel
else if (akt_Menue == 97) akt_Menue = Tastensound.loop(Key); // Tastensounds auswählen
else if (akt_Menue == 98) akt_Menue = DiscoElement.loop(Key); // Disco Typ // Ab hier alles, bei dem das Discolicht läuft
else if (akt_Menue == 99) akt_Menue = Einstellungsmenue_discospeed.loop(Key); // Disco speed
else akt_Menue = Lied[akt_Menue – 100].loop(Key); // MP3-Player // Alle akt_Menue über 100 gehören den absielbaren Liedern.
if (akt_Menue >= 98) DiscoElement.next_Discolight(Einstellungsmenue_discospeed._Discotimer); // Discolicht anzeigen
String ENTER_TO_PLAY=” Enter to play “;
switch (akt_Menue) { // Die Displayansteuerung findet hier statt, damit die Texte im Programm und nicht im Datenspeicher sind, der sonst überläuft:
case 0: schreibe (” Hauptmenue “, ” Spiele spielen “); break;
case 1: schreibe (” Hauptmenue “, “Lieder abspielen”); break;
case 2: schreibe (” Hauptmenue “, ” Einstellungen “); break;
case 3: schreibe (“Spiel ausw\xE1hlen “, ” Senso Classic “); break;
case 4: schreibe (“Spiel ausw\xE1hlen “, ” Reaktionsspiel “); break;
case 5: schreibe (” Einstellungen “, “W\xE1hle disco Typ “); break;
case 6: schreibe (” Einstellungen “, “set disco speed “); break;
case 7: schreibe (” Einstellungen “, ” Tastensounds “); break;
case 50: schreibe (” Senso Classic “, “”); break;
case 51: schreibe(“”, “”); break;
case 97: schreibe (“W\xE1hle Tastent\xEFne”, “”); break;
case 98: schreibe (“W\xE1hle disco Typ”, “”); break;
case 99: schreibe (“”, “”); break;
case 100: schreibe (ENTER_TO_PLAY, ” Mashup Germany “); break;
case 101: schreibe (ENTER_TO_PLAY, “Bohemian Rapsodi”); break;
case 102: schreibe (ENTER_TO_PLAY, ” J\xE1germeister “); break;
case 103: schreibe (ENTER_TO_PLAY, ” Monster “); break;
case 104: schreibe (ENTER_TO_PLAY, ” Bommerlunder “); break;
case 105: schreibe (ENTER_TO_PLAY, ” Coconutsong “); break;
case 106: schreibe (ENTER_TO_PLAY, ” Unity “); break;
case 107: schreibe (ENTER_TO_PLAY, “We will rock 01 “); break;
case 108: schreibe (ENTER_TO_PLAY, ” Teenagers “); break;
case 109: schreibe (ENTER_TO_PLAY, “We are the champ”); break;
case 110: schreibe (ENTER_TO_PLAY, “We will rock you”); break;
case 111: schreibe (ENTER_TO_PLAY, ” Killer Queen “); break;
case 112: schreibe (ENTER_TO_PLAY, ” Bites the dust “); break;
case 113: schreibe (ENTER_TO_PLAY, ” Bicycle race “); break;
case 114: schreibe (ENTER_TO_PLAY, “Crazy … thing “); break;
case 115: schreibe (ENTER_TO_PLAY, “Dont stop me now”); break;
case 116: schreibe (ENTER_TO_PLAY, ” Bottomed girls “); break;
}
}