zurück

Experimente mit RGB-LEDs

04.05.2018

RGB-LEDs sind spezielle LEDs, welche in drei verschiedenen Farben leuchten können, wobei jede Farbe ein separaten PIN besitzt, der unabhängig von den anderen Farben angesteuert werden kann. Der vierte PIN ist dann eine gemeinsame Anode bzw. Kathode (je nach Bauform).

Einzelne RGB-LED (5mm, klar)
Abb.: Einzelne RGB-LED (5mm, klar)

Die Kurzbezeichnung "RGB" steht für die drei Grundfarben rot, grün und blau. Sinngemäß setzt sich das RGB-Licht aus rotem, grünem und blauem Licht zusammen. Mit diesen drei Grundfarben lassen sich alle anderen Lichtfarben mischen, je nachdem mit wieviel Intensität man die einzelnen LED-Farben leuchten lässt.

Farbmischung der Lichtfarben rot, grün und blau
Abb.: Farbmischung der Lichtfarben rot, grün und blau
Vergrößerung einer RGB-LED
Abb.: Vergrößerung einer RGB-LED: Man kann die drei getrennten Farb-LEDs erkennen.
PINs der verwendeten RGB-LED
Abb.: PINs der verwendeten RGB-LED: hier mit einer gemeinsamen Kathode.

Verwendete Bauteile

Aufbau

Aufbau der Schaltung
Abb.: Aufbau der Schaltung

Sketches

Im ersten Experiment sind den Farb-Komponenten jeweils ein Taster zugeordnet und beim Drücken leuchtet oder erlischt die entsprechende Farbe. So kann man die Farb-Komponenten und deren direkte Mischfarben ausprobieren:

/**
* © 2018 Christian Grieger
* GNU GENERAL PUBLIC LICENSE
*
* Manual color component switch for single RGB LED (common cathode)
*/

#define PIN_LED_RED    9
#define PIN_LED_GREEN 10
#define PIN_LED_BLUE  11

#define PIN_BUTTON_RED   5
#define PIN_BUTTON_GREEN 6
#define PIN_BUTTON_BLUE  7

#define BUTTON_DEBOUNCE_INTERVAL 250 // in milliseconds

byte    ledPins[3] = {PIN_LED_RED, PIN_LED_GREEN, PIN_LED_BLUE};
byte buttonPins[3] = {PIN_BUTTON_RED, PIN_BUTTON_GREEN, PIN_BUTTON_BLUE};
byte  rgbValues[3] = {0, 0, 0};
unsigned long lastButtonPressed;

void setup()
{
    for(byte i=0; i<3; i++) {
        pinMode(ledPins[i], OUTPUT);
        pinMode(buttonPins[i], INPUT);
        digitalWrite(ledPins[i], LOW);
    }
}

void loop()
{
    if ((millis() - lastButtonPressed) >= BUTTON_DEBOUNCE_INTERVAL) {
        for(byte i=0; i<3; i++) {
            if (digitalRead(buttonPins[i]) == HIGH) {
                rgbValues[i]++;
                rgbValues[i]%=2;
                digitalWrite(ledPins[i], rgbValues[i]);
                lastButtonPressed = millis();
                break;
            }
        }
    }
}

Im zweiten Experiment werden die Mikrotaster nicht angesteuert, dafür rotieren die einzelnen Farb-Komponenten mittels eines Sinus-Funktion in allen möglichen Intensitäten durch und vermitteln so das gesamte Farbspektrum der RGB-LED.

/**
* © 2018 Christian Grieger
* GNU GENERAL PUBLIC LICENSE
*
* Color rotation for single RGB LED (common cathode)
*/

#define PIN_RED    9
#define PIN_GREEN 10
#define PIN_BLUE  11

#define ROTATE_STEP  0.005
#define COLOR_OFFSET 0.005

byte    ledPins[3] = {PIN_RED, PIN_GREEN, PIN_BLUE};
float rgbValues[3] = {0.0, 0.0, 0.0};

void setup()
{
    for(byte i=0; i<3; i++) {
        pinMode(ledPins[i], OUTPUT);
    }
}

void loop()
{
    for(byte i=0; i<3; i++) {
        rgbValues[i] += (ROTATE_STEP + i*COLOR_OFFSET);
        if (rgbValues[i] > 2*PI) {
            rgbValues[i] = 0.0;
        }
        analogWrite(ledPins[i], 127 + round(sin(rgbValues[i])*127));
    }

    delay(20);
}