Fotowiderstand (LDR) GL55xx

Fotowiderstand der GL55xx-Serie
Abb.: Fotowiderstand der GL55xx-Serie

Ein Fotowiderstand oder LDR (von engl. "Light Dependent Resistor") ist ein lichtempfindliches elektrisches Bauelement. Die lichtempfindliche Schicht besteht bei der GL55xx-Serie aus Cadmiumsulfid (Chemische Formel: CdS), welche etwa die gleiche Farbempfindlichkeitskurve wie das menschliche Auge oder Fotofilme hat. Cadmiumsulfid weist bei einer Wellenlänge von 520nm die maximale Empfindlichkeit auf.

Technische Daten

Detaillierter Aufbau des GL55xx
Abb.: Detaillierter Aufbau des GL55xx
Empfindlichkeit des GL55xx
Abb.: Empfindlichkeit des GL55xx in Abhängigkeit der Wellenlänge des Lichtes λ
Abmessungen des GL55xx
Abb.: Abmessungen des GL55xx

Die verschiedenen Typen der GL55xx-Serie haben gewöhnlich eine Spannungsfestigkeit von 150V, eine Reaktionszeit von 20-30ms und einen Betriebstemperaturbereich zwischen -30°C und +70°C. Einige andere Werte unterscheiden sich jedoch, wie folgende Tabelle zeigt:

Typ Lichtwiderstand² Dunkelwiderstand³
GL5516 5-10 kΩ 0,5 MΩ
GL5528 10-20 kΩ 1 MΩ
GL5537-1 20-30 kΩ 2 MΩ
GL5537-2 30-50 kΩ 3 MΩ
GL5539 50-100 kΩ 5 MΩ
GL5549 100-200 kΩ 10 MΩ

²) getestet mit einer Standard-Lichtquelle bei 10 Lux.
³) 10 Sekunden, nachdem das 10-Lux-Licht ausgeschaltet wurde.

Verwendete Bauteile

Ex 1.: LED bei Dunkelheit einschalten

Schaltplan und Aufbau

Zu beachten ist bei der Schaltung, dass der LDR keinen Kurzschluss verursachen kann, in diesem Fall also mit einem Pulldown-Widerstand von 10kΩ verschaltet wird.

Schaltplan
Aufbau der Schaltung auf dem Breadboard
Abb.: Aufbau der Schaltung auf dem Breadboard.

Arduino-Sketch

#define PIN_LDR A0
#define PIN_LED 9

#define LDR_SENSITIVITY      10
#define LDR_DARK_THRESHOLD  800
#define LDR_LIGHT_THRESHOLD 900

void setup()
{
    pinMode(PIN_LDR, INPUT);
    pinMode(PIN_LED, OUTPUT);
}

void loop()
{
    static int ldrValue = 0;
    static int lastBrightness = 0;
    static bool isLedActive = false;

    ldrValue = analogRead(PIN_LDR);
    if (abs(ldrValue - lastBrightness) >= LDR_SENSITIVITY) {
        lastBrightness = ldrValue;
    }

    if (isLedActive) {
        if (lastBrightness > LDR_LIGHT_THRESHOLD) {
            isLedActive = false;
            digitalWrite(PIN_LED, LOW);
        }
    } else {
        if (lastBrightness < LDR_DARK_THRESHOLD) {
            isLedActive = true;
            digitalWrite(PIN_LED, HIGH);
        }
    }
}

Nach dem Hochladen des Sketches leuchtet die LED auf, sobald es dunkel genug wird und erlischt wieder, wenn genug Helligkeit von außen auf dem LDR trifft.

Video: Live-Demonstration der Funktionalität des LDR

Ex 2: Graphische Auswertung mit "Processing"

Die gemessene Helligkeit am LDR kann man auch nach Processing übertragen und dort in Echtzeit mit einem Graphen visualisieren. Zunächst benötigt man einen Arduino-Sketch, der die gemessenen Daten am LDR über die serielle Schnittstelle ausgibt:

Arduino-Sketch

#define PIN_SENSOR A0

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    Serial.println(analogRead(PIN_SENSOR));
    delay(10);
}

In Processing wird nun der serielle Port (mit übereinstimmender Baudrate) geöffnet und die Werte ausgelesen. Sie werden nun nur noch auf das Ausgabe-Fenster angepasst und dann als kleine Punkte visualisiert. Zusätzlich wird der empfangene Wert als Zahl oben auf dem Ausgabefenster dargestellt.

Processing-Sketch

Der folgende Processing-Sketch nimmt ASCII-kodierte Zeichenketten (Strings) von der seriellen Schnittstelle mit einem Wertebereich von 0-1023 entgegen. Dabei wird davon ausgegangen, dass diese Werte mit einem "\n" voneinander getrennt sind.

import processing.serial.*;

Serial myPort;
int xPos = 1, yPos = 0;
String sensorValue;

void setup ()
{
    size(640, 400);
    background(0);
    stroke(255);
    textSize(15);

    myPort = new Serial(this, Serial.list()[0], 9600);
    myPort.clear();
    myPort.bufferUntil('\n');
}

// everything happens in the serialEvent()
void draw ()
{
    circle(xPos, yPos, 1);

    fill(0);
    stroke(0);
    rect(0, 0, width, 25);

    stroke(255);
    fill(127);
    text("Sensor value = " + sensorValue.toString(), 5, 20);

    if (xPos >= width) {
        xPos = 0;
        background(0);
    } else {
        xPos++;
    }
}

void serialEvent (Serial myPort)
{
    sensorValue = myPort.readStringUntil('\n');
    if (sensorValue != null) {
        yPos = height-int(map(float(sensorValue), 0, 1023, 1, height-25));
    }
}
Ausgabe der Helligkeit in Processing
Abb.: Ausgabe der gemessenen Helligkeit des LDR in Processing

Ex 3: Typen-Vergleich

Um die Unterschiede der verschiedenen Typen der GL55xx-Serie gleichzeitig zu testen, wird der folgende Aufbau verwendet:

Schaltplan

Schaltplan

Arduino-Sketch

Die Rohdaten der LDRs werden kommasepariert an die serielle Konsole geschickt und dann mit dem Plotter der Arduino-IDE ausgegeben.

#define PIN_GL5516_1 A0
#define PIN_GL5516_2 A1
#define PIN_GL5528   A2
#define PIN_GL5537   A3
#define PIN_GL5539   A4
#define PIN_GL5549   A5

void setup()
{
    Serial.begin(9600);
    pinMode(PIN_GL5516_1, INPUT);
    pinMode(PIN_GL5516_2, INPUT);
    pinMode(PIN_GL5528, INPUT);
    pinMode(PIN_GL5537, INPUT);
    pinMode(PIN_GL5539, INPUT);
    pinMode(PIN_GL5549, INPUT);
}

void loop()
{
    Serial.print("GL5516a:");
    Serial.print(analogRead(PIN_GL5516_1));
    Serial.print(",");
    Serial.print("GL5516b:");
    Serial.print(analogRead(PIN_GL5516_2));
    Serial.print(",");
    Serial.print("GL5528:");
    Serial.print(analogRead(PIN_GL5528));
    Serial.print(",");
    Serial.print("GL5537:");
    Serial.print(analogRead(PIN_GL5537));
    Serial.print(",");
    Serial.print("GL5539:");
    Serial.print(analogRead(PIN_GL5539));
    Serial.print(",");
    Serial.print("GL5549:");
    Serial.println(analogRead(PIN_GL5549));

    delay(150);
}
Ausgabe auf dem seriellen Plotter der Arduino-IDE
Abb.: Ausgabe auf dem seriellen Plotter der Arduino-IDE
zurück