AndiHub

Code-Outlet von Andreas Bahr, Zürich

ShinyLight

Der moderne Ersatz für die Lava-Lampe - In seiner einfachsten Form

ShinyLight im Glas

Ein Wochenend-Projekt

Die NeoPixel Produktlinie von Adafruit wecken die Lust selbst einmal mit diesen neumodischen RGB-LEDs zu arbeiten. Das vorliegende Projekt habe ich innerhalb weniger Stunden realisieren können, die Dokumentation der NeoPixel und deren Treiber/Library ist Tiptop.

Hardware

Die Hardware besteht aus einem Netzteil 5V/2A DC, einem klassischen Arduino Nano / Clone und 1 Meter NeoPixel-Schlauch, angeschlossen an Pin D6. Der von mir verwendete Schlauch enthält 60 RGB-LEDs pro Meter.

Adafruit NeoPixel Überguide

Die offizielle Dokumentation für die Produktlinie (in englischer Sprache)

Adafruit NeoPixel Überguide

Arduino-Script

Das vorliegende Script erzeugt zufällige Werte für eine anzuzeigende Farbe, und verändert diese in 250 kleinen Schritten hin zu der nächsten zufällig ausgewählten Farbe. Zusätzlich werden die LEDs von unten nach oben auf grössere Helligkeit eingestellt.

Die Gesamt-Helligkeit der LEDs, und damit auch deren Stromverbrauch, werden am Beginn des Scripts mit dem Befehl "strip.setBrightness(150);" eingestellt, gültige Werte sind 0-255.

RGB versus HSV Farbraum

Es war für mich eine interessante Lektion festzustellen, dass das Ansteuern der RGB-LEDs mit RGB-Werten zu sehr unattraktiven Farben führt. Nutzt man hingegen das HSV-Farbmodell, profitiert man von den auf diese LEDs optimierten Algorithmen der Library, und hat zusätzlich Kontrolle über Helligkeit & Farbsättigung.

Info zu HSV: Wikipedia: HSV-Farbraum

/* ShinyLight
 * HSV: color, saturation and value (brightness)
 * Version 3: Morphing von Farbe zu Farbe
 * Hardware: 1m NeoPixel & Arduino Nano
 * Info zu HSV: https://de.wikipedia.org/wiki/HSV-Farbraum
 * --------------------------
 * Copyleft 2019 Andreas Bahr
 * --------------------------
 * NeoPixel nicht unter Spannung anschliessen
 * Zuerst den strom für NeoPixel, dann den Arduino
 */


// der "treiber" von adafruit
#include <Adafruit_NeoPixel.h>

#define LED_PIN 6     // NeoPixel an pin "D6"
#define LED_COUNT 60 // anzahl led im NeoPixel-strip

// Neopixel deklaration & konfiguration
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// das ding mit dem namen "strip" ist jetzt das NeoPixel...


// startup code
void setup() {
  strip.begin();              // den adafruit-code "starten"
  strip.show();              // alle led's einmal ansteuern
  strip.setBrightness(150); // helligkeit, max = 255
}

// "das programm"
void loop() {
  int j;
  int diff;
  long hue;
  long randomHue;
  long lastHue = 0;
  randomSeed(analogRead(0)); // zufallszahlen initialisieren

  do {
    // zufällige farbe wählen
    randomHue = random(0, 65536);
    j = 0; diff = 0;

    do {
      // aktuelle farbe berechnen
      if(randomHue == lastHue) {
        hue = randomHue;
      } else {
        diff = diff - ((lastHue - randomHue) / 250);
        hue = lastHue + diff;
      }
      
      // saturation 0-255
      for(int i = 0; i < strip.numPixels() / 2; i++) {
        strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(hue, i * (255 / (strip.numPixels() / 2)), 255)));
      }
  
      // brightness 0-255
      for(int i = strip.numPixels(); i > strip.numPixels() / 2; i--) {
        strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(hue, 255, 255 - (i * (255 / (strip.numPixels() / 2))))));
      }
      strip.show();
      delay(20);

      j++;
    } while(j < 250);

    lastHue = randomHue;

  } while(true); // endlos-schleife
}