Zum Inhalt springen
Leuchtende Ostereier mit Arduino Titelbild

Leuchtende Ostereier mit Arduino

    Bald ist es wieder so weit. Fleißige Osterhasen hoppeln durch die Wohnung und den Garten und verstecken allerlei ovale Überraschungen. Natürlich können diese emsigen Tiere nicht alles alleine machen und so könnten wir ihnen mit ein paar bunt leuchtenden RGB-Ostereiern unter die Arme (Pfoten?) greifen.

    Leuchtende Ostereier mit Arduino bestehen aus WS2812 LED-Ringen. Ihre Farben lassen sich über Potentiometer einstellen. Darüber hinaus können unterschiedliche Animationen auf den LEDs dargestellt werden. Ein lustiges Projekt für die ganze Familie – und den Osterhasen :-D

    Bauteile

    Schaltung

    Leuchtende Ostereier mit Arduino Schaltung

    Die Schaltung besteht wie gesagt aus drei WS2812-RGB-LED-Ringen. Sie sind jeweils mit dem 5V+ und GND verbunden. Der D-OUT (Daten-Output) des ersten Rings ist mit dem D-IN (Daten-Input) des zweiten Ringes verbunden, der D-OUT des zweiten Rings mit dem D-IN des Dritten. Der D-IN des ersten Ringes ist über einen Widerstand (220 Ohm) mit dem digitalen Output-Pins des Arduino-Boards verbunden.


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    Vier Potentiometer sind jeweils mit äußeren Beinchen mit dem 5V+ und dem GND verbunden. Ihr mittleres Beinchen (Abgriff) ist mit den analogen Input-Pins A0, A1, A2 und A3 verbunden.

    Darüber hinaus gibt es noch einen größeren Elektrolyt-Kondensator (ab 500µF), der den 5V+ und dem GND verbunden ist. Hierbei ist auf die richtige Polung zu achten.

    Code: Leuchtende Ostereier mit Arduino

    Der Code lässt sich einfach auf das Arduino-Board übertragen und schon geht es los :-)

    #include <Adafruit_NeoPixel.h>
    #ifdef __AVR__
    #endif
    
    #define LED_PIN    6
    #define LED_COUNT 36 // 3x 12 WS2812 LEDs pro Ring
    
    Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
    
    int potPin1 = A0;
    int potPin2 = A1;
    int potPin3 = A2;
    int potPin4 = A3;
    
    void setup() {
      strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
      strip.show();            // Turn OFF all pixels ASAP
      strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
    }
    
    void loop() {
      int pot1 = analogRead(potPin1);
      if (pot1 < 200) {
        colorWipe(strip.ColorHSV(map(analogRead(potPin2), 0, 1024, 0, 65536)), 50, 0, 12);
        colorWipe(strip.ColorHSV(map(analogRead(potPin3), 0, 1024, 0, 65536)), 50, 12, 24);
        colorWipe(strip.ColorHSV(map(analogRead(potPin4), 0, 1024, 0, 65536)), 50, 24, 36);
      } else if (pot1 < 400) {
        theaterChase(strip.ColorHSV(map(analogRead(potPin2), 0, 1024, 0, 65536)), strip.ColorHSV(map(analogRead(potPin3), 0, 1024, 0, 65536)), strip.ColorHSV(map(analogRead(potPin4), 0, 1024, 0, 65536)), 50);
      } else if (pot1 < 600) {
        rainbow(10);
      } else if (pot1 < 800) {
        theaterChaseRainbow(50);
      } else {
        for (int i = 0; i < LED_COUNT; i++) {
          strip.setPixelColor(i, strip.Color(0,   0,   0));
        }
        strip.show();
      }
    }
    
    void colorWipe(uint32_t color, int wait, int firstLED, int lastLED) {
      for (int i = firstLED; i < lastLED; i++) { // For each pixel in strip...
        strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
        strip.show();                          //  Update strip to match
        if ((analogRead(potPin1) < 0) || (analogRead(potPin1) > 200)) break;
      }
    }
    
    void theaterChase(uint32_t color1, uint32_t color2, uint32_t color3, int wait) {
      for (int b = 0; b < 3; b++) { //  'b' counts from 0 to 2...
        strip.clear();         //   Set all pixels in RAM to 0 (off)
        // 'c' counts up from 'b' to end of strip in steps of 3...
        for (int c = b; c < 12; c += 3) {
          strip.setPixelColor(c, color1); // Set pixel 'c' to value 'color'
          strip.setPixelColor(c + 12, color2); // Set pixel 'c' to value 'color'
          strip.setPixelColor(c + 24, color3); // Set pixel 'c' to value 'color'
        }
        strip.show(); // Update strip with new contents
        delay(wait);  // Pause for a moment
        if ((analogRead(potPin1) < 200) || (analogRead(potPin1) > 400)) break;
      }
    }
    
    // Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
    void rainbow(int wait) {
      for (long firstPixelHue = 0; firstPixelHue < 5 * 65536; firstPixelHue += 256) {
        for (int i = 0; i < strip.numPixels(); i++) { // For each pixel in strip...
          int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
          strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
        }
        strip.show();
        delay(wait);
        if ((analogRead(potPin1) < 400) || (analogRead(potPin1) > 600)) break;
      }
    }
    
    // Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.
    void theaterChaseRainbow(int wait) {
      int firstPixelHue = 0;     // First pixel starts at red (hue 0)
      for (int a = 0; a < 30; a++) { // Repeat 30 times...
        for (int b = 0; b < 3; b++) { //  'b' counts from 0 to 2...
          strip.clear();         //   Set all pixels in RAM to 0 (off)
          for (int c = b; c < strip.numPixels(); c += 3) {
            int      hue   = firstPixelHue + c * 65536L / strip.numPixels();
            uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
            strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
          }
          strip.show();                // Update strip with new contents
          delay(wait);                 // Pause for a moment
          if ((analogRead(potPin1) < 600) || (analogRead(potPin1) > 800)) break;
          firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
        }
      }
    }

    Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!

    • Die beliebtesten Arduino-Projekte von StartHardware
    • Inklusive Schaltplan, Beschreibung und Code
    • Arduino-Schnellstart-Kapitel
    • Kompakter Programmierkurs


    Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht.

     

    Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.