Glücks­rad LED-Ring OLED

// 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(0));

  // 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;
}