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.
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.
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.
#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.
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:
#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.
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));
}
}
Um die Unterschiede der verschiedenen Typen der GL55xx-Serie gleichzeitig zu testen, wird der folgende Aufbau verwendet:
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);
}
zurück