// benötigte Bibliotheken einbinden
#include "Adafruit_NeoPixel.h"
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
// Adresse I2C
#define I2C_ADDRESS 0x3C
// Name des OLED festlegen
SSD1306AsciiWire oled;
// digitaler Pin LED-Ring
#define RING 7
// digitaler Pin des Lautsprechers
#define LAUTSPRECHER 8
// Anzahl der LEDs -> muss an den verwendeten LED-Ring angepasst werden
#define AnzahlLED 32
// LED-Ring -> Name des LED-Rings
Adafruit_NeoPixel LEDRing = Adafruit_NeoPixel(AnzahlLED, RING, NEO_GRB + NEO_KHZ800);
// Status entscheidet, ob das Glücksrad läuft oder gestoppt wird
// false -> Glücksrad läuft beim Start
volatile bool Status = false;
// true -> Lautsprecher ein
// false -> Lautsprecher aus
bool Toene = true;
// true -> zufällige Farbe nach jeder Runde wechseln
// false -> Farbwechsel nach jedem Pixel
bool FarbWechselRunde = false;
// Definition der Farben
int ROT, GRUEN, BLAU;
// Taster am Interrupt-Port definieren
#define TASTER 2
// Variablen für die mit millis() ermittelte Zeit
// damit nur jeweils ein Tasterdruck erkannt wird
static unsigned long GesicherteStartZeit = 0;
unsigned long Startzeit;
int Punkte;
// Zeit zwischen den Bewegungen der LED
int WarteZeit = 100;
void setup()
{
Serial.begin(9600);
// NeoPixel Bibliothek initialisieren
LEDRing.begin();
// setBrightness(0..255)
LEDRing.setBrightness(250);
// pinMode des Tasters mit eingeschaltetem Vorwiderstand
pinMode(TASTER, INPUT_PULLUP);
// Interrupt dem Taster zuordnen und die Funktion LEDSchalten aufrufen
attachInterrupt(digitalPinToInterrupt(TASTER), LEDSchalten, FALLING);
// Zufallsgenerator starten
randomSeed(analogRead(A0));
// OLED starten
Wire.begin();
Wire.setClock(400000L);
oled.begin(&Adafruit128x64, I2C_ADDRESS);
// Schriftart festlegen
oled.setFont(TimesNewRoman16);
}
void loop()
{
// LED-Ring ausschalten
LEDRing.clear();
// zufällige Farbwerte Wechsel nach jeder 360° Drehung
// -> FarbWechselRunde true
if (FarbWechselRunde)
{
ROT = ZufallsFarbe();
GRUEN = ZufallsFarbe();
BLAU = ZufallsFarbe();
}
// wenn Status false -> Glücksrad läuft
if (!Status)
{
if (Toene) tone(LAUTSPRECHER, 1000, 5);
// Start der Drehung mit LED 0
// Ende mit Anzahl der LEDs
for (int i = 0; i < LEDRing.numPixels(); i++)
{
// zufällige Farbwerte: Wechsel nach jeder LED
// -> FarbWechselRunde false
if (!FarbWechselRunde)
{
ROT = ZufallsFarbe();
GRUEN = ZufallsFarbe();
BLAU = ZufallsFarbe();
}
// Farbe für die aktuelle LED
LEDRing.setPixelColor(i, ROT, GRUEN, BLAU);
// LEDs einschalten
LEDRing.show();
/*
Taster gedrückt: Status = true -> Glücksrad stoppen
break -> for-Schleife verlassen
*/
if (Status)
{
if (Toene) tone(LAUTSPRECHER, 1000, 500);
// Punkte ermitteln 32 LEDs, jeweils 4 pro Feld
// 40 Punkte
if (i >= 0 && i <= 3) Punkte = Punkte + 40;
// 100 Punkte
if (i >= 4 && i <= 7) Punkte = Punkte + 100;
// 20 Punkte
if (i > 9 && i <= 12) Punkte = Punkte + 20;
// 60 Punkte
if (i > 12 && i <= 16) Punkte = Punkte + 60;
// 120 Punkte
if (i > 16 && i <= 20) Punkte = Punkte + 120;
// 160 Punkte
if (i > 20 && i <= 24) Punkte = Punkte + 160;
// 80 Punkte
if (i > 24 && i <= 28) Punkte = Punkte + 80;
// 140 Punkte
if (i > 28 && i <= 32) Punkte = Punkte + 140;
// Punktestand OLED anzeigen
oled.setCursor(2, 1);
oled.print("Punktestand:");
oled.setCursor(2, 4);
oled.print(String(Punkte) + " Punkte");
// for-Schleife verlassen
break;
}
// Wartezeit bis zur nächsten LED
delay(WarteZeit);
// aktuell eingeschaltete LEDs ausschalten
LEDRing.setPixelColor(i, 0);
// wenn nur eine LED "laufen" soll, der Schalter EineLED false ist
// if (!EineLED) LEDRing.setPixelColor(i + 1, 0);
}
}
}
void LEDSchalten()
{
// aktuelle Zeit sichern
Startzeit = millis();
/*
bei mehr als 250 Millisekunden Differenz
zwischen der aktuellen und der gesicherten Zeit
-> Status umdrehen
aus false wird true -> Glücksrad stoppen
aus true wird false -> Glücksrad starten
*/
if (Startzeit - GesicherteStartZeit > 250)
{
Status = !Status;
}
GesicherteStartZeit = Startzeit;
}
int ZufallsFarbe()
{
int Farbe = random(0, 255);
return Farbe;
}