Glücks­rad LED-Ring

#include "Adafruit_NeoPixel.h"

// digitaler Pin LED-Ring
#define RING 7

// digitaler Pin des Lautsprechers
#define LAUTSPRECHER 8

// Anzahl der LEDs -> muss an den verwendeten Neopixel-Ring angepasst werden
#define AnzahlLED 16

// 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-Pin definieren
#define TASTER 3

// Variablen für die mit millis() ermittelte Zeit
// damit nur jeweils ein Tasterdruck erkannt wird
static unsigned long GesicherteStartZeit = 0;
unsigned long Startzeit;

// Zeit zwischen den Bewegungen der LED
int WarteZeit = 50;

void setup()
{
  // NeoPixel Bibliothek initialisieren
  LEDRing.begin();

  // setBrightness(0..255)
  LEDRing.setBrightness(250);

  // Eingangspegel auf HIGH setzen
  pinMode(TASTER, INPUT_PULLUP);

  // Interrupt dem Taster zuordnen und die Funktion LEDSchalten aufrufen
  attachInterrupt(digitalPinToInterrupt(TASTER), LEDSchalten, FALLING);

  // Zufallsgenerator starten
  randomSeed(analogRead(A0));
}

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);
        break;
      }

      // Wartezeit bis zur nächsten LED
      delay(WarteZeit);

      // aktuell eingeschaltete LEDs ausschalten
      LEDRing.setPixelColor(i, 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;
}

Letzte Aktualisierung: Jul 25, 2023 @ 18:52