LDR Module

Module Licht

LDRs sind eine einfache Lösung, um auf Helligkeitsänderungen zu reagieren. Lass uns einen Blick auf entsprechende Arduino Module werfen.

LDR Module

LDR-Sensormodule ermöglichen es, mithilfe eines lichtabhängigen Widerstandes (LDR) die Helligkeit des Umgebungslichts zu messen. Wenn du mehr über LDRs als solche lernen möchtest, dann sieh dir das LDR-Tutorial in der Reihe über elektrische Schaltungen an. Wir haben bereits einen LDR in einem früheren Tutorial verwendet, um einen einfachen Dämmerungsschalter zu bauen. In diesem Tutorial werfen wir einen Blick auf zwei Module, die mit einem LDR ausgestattet sind. Das erste ist ein Schwellwertmodul. Es erlaubt die Einstellung eines Helligkeitsschwellwerts mittels eines Potentiometers und hat einen digitalen Ausgang, der aktiv wird, sobald die Lichtstärke unter dem Schwellwert liegt. Das zweite ist ein analoges Modul. Es handelt sich dabei im Grunde um eine einfache Spannungsteilerschaltung mit einem LDR. Wir werden uns diese beiden Module ansehen und eine verbesserte Version des Dämmerungsschalters bauen. Auf geht's, lass uns direkt loslegen.

Schwellwertmodule

Betrachten wir zunächst das Schwellwertmodul. Wie viele Arduino-Module ist auch dieses von verschiedenen Herstellern erhältlich. Such einfach kurz nach 'Arduino LDR Modul' und du wirst sicher eines finden, das genauso aussieht wie das von mir verwendete. Das Modul ist mit einem LDR, einem Potentiometer zur Einstellung des Schwellwerts und einem analogen Komparator (LM399) ausgestattet. Letzterer stellt fest, ob die Helligkeit unter dem eingestellten Schwellwert liegt, und schaltet den digitalen Ausgang entsprechend um. Dies macht die Nutzung dieses Moduls besonders einfach. Theoretisch könnte man es sogar ohne ein Arduino verwenden, da es bereits die ganze Arbeit erledigt.

Fangen wir damit an, das Modul an das Arduino anzuschließen. Die Schaltung ist auf dem Bild unten dargestellt. Die mit GND und VCC gekennzeichneten Stromversorgungsanschlüsse müssen mit den GND und 5V Pins des Arduino verbunden werden. Als Nächstes müssen wir den digitalen Ausgang des Moduls mit einem der Pins des Arduinos verbinden. Ich habe Pin 9 gewählt. Zusätzlich habe ich eine LED an Pin 8 angeschlossen. Wir werden diese LED einschalten, sobald die Helligkeit unter den Schwellwert fällt. Anschluss des LDR-Schwellenwertmoduls

In unserem Arduino-Programm gibt es nur wenig zu tun. In der setup-Prozedur stellen wir die korrekten Pin-Modi ein. Wir benutzen Pin 8 als digitalen Ausgang, um unsere LED zu steuern und Pin 9 als digitalen Eingang, um den Ausgangswert des Moduls auszulesen. In der "loop"-Prozedur prüfen wir kontinuierlich, ob der Ausgang des Moduls HIGH ist. Wenn ja, liegt die Beleuchtungsstärke unterhalb des Schwellwerts. In diesem Fall schalten wir die LED mit digitalWrite ein. Wenn nicht, schalten wir die LED aus.

void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, INPUT);
}

void loop() {
  if(digitalRead(9)) {
    digitalWrite(8, HIGH);
  } else {
    digitalWrite(8, LOW);  
  }
}

Sobald du den Code auf den Arduino hochgeladen hast, solltest du in der Lage sein, die LED einzuschalten, indem du den LDR abdeckst. Möglicherweise musst du den Schwellwert durch Drehen des Potentiometers anpassen. Das Video unten zeigt unseren Dämmerungsschalter in Aktion.

Es gibt ein Problem mit unserem einfachen Dämmerungsschalter. Wie am Ende des Videos gezeigt, ist der Ausgang instabil, wenn die Helligkeit dicht am eingestellten Schwellwert liegt. Die LED beginnt zu flackern. Wenn es sich um eine Straßenlaterne oder eine Lampe in deinem Haus handeln würde, wäre das ziemlich nervtötend. Was können wir dagegen tun? Nun, wir hatten das gleiche Problem bereits mit dem Temperaturschwellwertmodul. Es kann gelöst werden, indem verschiedene Schwellenwerte für das Ein- und Ausschalten der LED festgelegt werden. Dies wird auch Hysterese genannt. Leider bietet unser Modul nicht die Möglichkeit, einen zweiten Schwellwert einzustellen. Es verfügt auch nicht über einen analogen Ausgang, der es uns ermöglichen würde, dies zu implementieren.

Was sind unsere Optionen? Nun, wir können dieses Problem nicht richtig lösen, da wir nur den digitalen Ausgang haben. Es gibt einige Behelfslösungen, die je nach Anwendungsfall funktionieren könnten. Ohne stufenweise Änderung der Lichtintensität besteht überhaupt kein Problem. Bei einer Lichtschranke zum Beispiel sollte die Helligkeit nie so dicht am Schwellenwert liegen. Es sollte zwei verschiedene Zustände geben, und man kann einen geeigneten Schwellenwert dazwischen wählen. Damit dies richtig funktioniert, benötigt man eine ausreichend helle Lichtquelle für die Lichtschranke, die sich klar vom Umgebungslicht unterscheiden lässt. Wenn es eine allmähliche Veränderung gibt (z. B. Sonnenuntergang und Sonnenaufgang), brauchen wir eine andere Lösung. Am einfachsten ist es, den Ausgabewert mit einer wirklich langsamen Geschwindigkeit zu lesen, z. B. alle 15 Minuten. Auf diese Weise wird die LED nicht schnell flackern, da ihr Zustand sich nur alle 15 Minuten aktualisiert. Der kritische Helligkeitswert bleibt wahrscheinlich keine 15 Minuten lang bestehen. Nicht zuletzt kann man sich weitere kreative Lösungen ausdenken. Wir könnten z. B. detektieren, dass die Ausgabe nicht stabil ist, indem wir prüfen, ob der Ausgangspegel für eine bestimmte Zeitspanne gleich bleibt. Wir reagieren nur, wenn die Ausgabe lange genug stabil war.
Hier ist ein Codebeispiel, das prüft, ob der Zustand für mindestens eine Sekunde stabil ist:

void setup() {
  pinMode(8, OUTPUT);
  pinMode(9, INPUT);
}

int counter = 0;
int targetState = LOW;

void loop() {
  if(digitalRead(9) == targetState) {
    counter ++;
  } else {
    targetState = digitalRead(9);
    counter = 0;  
  }

  if(counter > 100) {
    if(targetState) {
      digitalWrite(8, HIGH);
    } else {
      digitalWrite(8, LOW);  
    }
  }
  delay(10);
}

Das Ergebnis ist im Video zu sehen. Wir erhalten zwar kein schnelles Flackern mehr, aber der LED-Zustand ist immer noch nicht stabil. Wenn man die Ausgangs-LED auf dem Modul genau beobachtet, kann man sehen, dass die meisten Zustandswechsel ignoriert werden. Wenn der Ausgang jedoch gerade lange genug stabil ist, um durch unsere Überprüfung zu gelangen, ändert auch die Haupt-LED ihren Zustand. Wir können dies verhindern, indem wir die Zeit, die der Ausgang stabil sein muss, erhöhen. Wenn wir es übertreiben, haben wir am Ende eine komplexe Lösung, die sich im Grunde ähnlich verhält wie die viel einfachere Version, bei der wir den Ausgangswert nur alle 15 Minuten überprüfen. Schauen wir uns an, wie man das mit einem analogen LDR-Modul ordentlich lösen kann.

Analoge Module

Das analoge KY-018 Lichtsensormodul ist mit einem LDR, einem 10 kΩ Widerstand sowie einem Analogausgang ausgestattet. Um es mit dem Arduino zu verbinden, schließe 5V an den mittleren Pin und GND an - an. Der analoge Ausgang S muss mit einem analogen Eingang des Arduino verbunden werden. Ich habe für diese Aufgabe A0 gewählt. Die LED bleibt weiterhin mit Pin 8 verbunden. Anschließen des analogen LDR Moduls

Wie im Schaltbild des LDR-Moduls direkt neben dem Anschlussplan zu sehen ist, ist die Schaltung des Moduls so einfach, dass sie leicht auf einer Lochrasterplatine aufgebaut werden kann. Das haben wir so gemacht, als wir einen LDR für unseren Dämmerungsschalter im Tutorial analoge Eingänge verwendet haben. Wir können den Code auch von dort übernehmen, wenn wir einige Anpassungen vornehmen. Auf dem Modul sind LDR und R1, verglichen mit der Schaltung, die wir im Tutorial über analoge Eingänge aufgebaut haben, miteinander vertauscht. Die Folge ist, dass wir nun eine niedrigere Spannung und damit einen niedrigeren ADC-Wert für helleres Licht erhalten. Im ursprünglichen Code haben wir die LED eingeschaltet, wenn der ADC-Wert unter einem bestimmten Schwellenwert lag. Bei diesem Modul müssen wir die LED einschalten, wenn der ADC-Wert über einem bestimmten Schwellenwert liegt. Hier ist der angepasste Code:

void setup() {
  pinMode(8, OUTPUT);
}

void loop() {
  int intensity = analogRead(A0);
  if(intensity > 150) {
    digitalWrite(8, HIGH);
  } else {
    digitalWrite(8, LOW);  
  }
}

Du kannst dir das Verhalten unserer Schaltung in dem Video unten anschauen. Wie man am Ende des Videos sehen kann, ergibt sich das gleiche instabile Verhalten auch beim analogen Modul. Diesmal haben wir jedoch mehr Informationen. Der ADC-Messwert sagt uns, dass die Helligkeit in der Nähe des Schwellwerts liegt. Wir haben auch die Freiheit, einen anderen Schwellwert für das Wiedereinschalten der LED zu wählen und auf diese Weise eine Hysterese zu implementieren.

Lass uns sehen, welche Anpassungen dafür notwendig sind. Wir wollen die LED nun nicht mehr im else-Block ausschalten, sondern wir führen stattdessen eine neue if-Bedingung für den zweiten Schwellwert ein. In meinem Fall habe ich einen Schwellwert von 150 für das Einschalten der LED und einen Schwellwert von 100 für das Ausschalten der LED verwendet. Wenn der ADC-Wert im unsicheren und möglicherweise instabilen Bereich zwischen den beiden Schwellwerten liegt, tun wir einfach nichts und bleiben im alten Zustand.
Der fertige Code für den verbesserten Dämmerungsschalter sieht wie folgt aus:

void setup() {
  pinMode(8, OUTPUT);
}

void loop() {
  int intensity = analogRead(A0);
  if(intensity > 150) {
    digitalWrite(8, HIGH);
  }
  
  if(intensity < 100) {
    digitalWrite(8, LOW);  
  }
}

Wie im unten gezeigten Video zu sehen ist, gibt es kein Flackern mehr. Wenn das Licht gedimmt wird, schaltet sich die LED irgendwann ein, aber sie erlischt nicht mehr aufgrund geringfügiger Helligkeitsschwankungen. Damit die LED ausgeht, muss die Helligkeit über den zweiten Schwellenwert steigen. Wir haben also endlich eine saubere Lösung, und wenn sich die Helligkeit schnell ändert, erhalten wir außerdem eine sofortige Reaktion. Wir müssen nicht erst einige Sekunden oder gar 15 Minuten warten.

Wenn das Verhalten immer noch nicht stabil ist, passe die Schwellwerte an und achte darauf, dass die beiden Schwellwerte nicht zu nahe beieinander liegen.

Vorheriger Beitrag Nächster Beitrag