RGB Fade (Farbwechsel)

Das „RGB Fade“ Programm macht schöne Farbwechsel der RGB LED und zeigt

Die Farbmischung wirkt schöner wenn man einen Diffusor über die LED legt (Butterbrotpapier oder ähnliches) anstatt direkt in die LED zu schauen.

RGB_Fade.ino
/**
 * Dieses Programm wechselt in zufälliger Folge die Helligkeitswerte der 3 Farben der RGB LED.
 * Dadurch mischen sich theoretisch alle möglichen Farbverläufe irgendwann einmal zusammen.
 * Es entsteht ein schöner Farbeffekt.
 * In dieser Funktion ist neu:
 * - Verwendung der Zufallsfunktion random()
 * - Verwendung von Unterfunktionen mit Übergabeparameter
 * - Die do{} while() Schleife
 * - manipulieren von Zählerständen
 */
 
const int red = 9;    // Pin für rot in RGB LED
const int green = 10; // Pin für grün in RGB LED
const int blue1 = 5;  // Pin für erstes blau in RGB LED
const int blue2 = 6;  // Pin für zweites blau in RGB LED
 
long randnum;  // Variable für den Zufallswert
int redBRT;    // Helligkeitswert rot (BRT = brightness)
int greenBRT;  // Helligkeitswert grün
int blue1BRT;  // Helligkeitswert blau1
int blue2BRT;  // Helligkeitswert blau2
 
void setup () {
  pinMode (red, OUTPUT);
  pinMode (green, OUTPUT);
  pinMode (blue1, OUTPUT);
  pinMode (blue2, OUTPUT);
  randomSeed (analogRead (0));  // Initialisieren der random() Funktion mit einem Wert des nicht angeschlossenen analogen Port A0
}
 
/* Die fade() Funktion erhöht bzw. verringert die PWM Frequenz vom aktuellen Wert zum erzeugten Zufallswert.
 Dadurch entsteht der Effekt des "fading in/out" also aufblenden und abblenden der Helligkeit.
 Übergabeparameter:
 int pin: enthällt den Ausgangspin der verändert werden soll
 int brt: enthällt den aktuellen Ausgangswert der Helligkeit des Pin
 */
int fade (int pin, int brt) { // Übergabe der zwei Werte
  randnum = random (0,256);   // erzeugt einen Zufallswert zwischen 0 (inklusive der 0) und 255 (obere Grenze muss 1 höher sein als Maximalwert)
  do {                        // Start der do{} while() Schleife
    if (brt < randnum) {      // Wenn aktueller Helligkeit kleiner als neuer maximaler Helligkeitswert (aufblenden)
      brt++;                  // erhöhe Helligkeitswert um eins. Langform: "brt=brt+1". Möglich ist auch "brt+=1"
    } 
    else {                    // Wenn aktueller Helligkeit größer als neuer maximaler Helligkeitswert (abblenden)
      brt--;                  // verringere Helligkeitswert um eins. Langform: "brt=brt-1". Möglich ist auch "brt-=1"
    }
    analogWrite (pin, brt);   // setzt neuen Helligkeitswert
    delay (10);               // Pause in Millisekunden. Diese Zeit verändert die Geschwindigkeit mit der auf- und abgeblendet wird
  }
  while (brt != randnum);     // Bedingung der do() Schleife: Mache das do() solange bis Bedingung erfüllt ist (hier: aktuelle Helligkeit = Zufallszahl)
  return brt;                 // Rückgabewert der Funktion fade(). Der Wert dieser Variable wird zurückgegeben.
}
 
void loop () {
  redBRT = fade (red, redBRT);  // Aufruf der fade() Funktion mit Übergabeparameter. Parameter 1: aktueller Port, Parameter 2: aktueller Helligkeitswert
                                // Der Rückgabewert der fade() Funktion wird in der Variable vor dem Aufruf gespeichert.
  blue1BRT = fade (blue1, blue1BRT);  // gleicher Aufruf wie oben nur unterschiedliche Parameter
  greenBRT = fade (green, greenBRT);  // s.o.
  blue2BRT = fade (blue2, blue2BRT);  // s.o.
}