Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

Fotowiderstand

8 - Fotowiderstand

Kurzinformationen

LDR

Das Akronym LDR steht für light dependent resistor (lichtabhängiger Widerstand) oder kurz Fotowiderstand. Auf einer Keramikschicht ist eine dünne Schicht fotosensitiven Materials (CdS - Cadmium Sulfid, CdSe - Cadmium Selenid) aufgebracht. Die Elektroden sind mit kammartigen sich gegenüberstehenden Metallflächen verbunden; das Ganze ist in Kunstharz vergossen.

Spektrale Empfindlichkeit

Fotowiderstände besitzen je nach verwendetem Material unterschiedliche Lichtempfindlichkeiten; die höchste Empfindlichkeit liegt bei den meisten LDRs im Bereich von 530 nm - 600 nm.

Erholungszeit

Der Widerstand eines LDR ändert sich bei einem Übergang von hell zu dunkel langsamer (mit ca. 200 kOhm pro Sekunde) als von dunkel zu hell.

Dunkelwiderstand

Der Dunkelwiderstand liegt je nach Bauform zwischen ca. 120 kOhm und 5 MOhm.

Übung 1 - Kennlinienaufnahme verschiedener LDR

In der folgenden Übung wird als Lichtquelle eine 10mm LED mit 13500 mcd mit einem Vorwiderstand von 470 Ohm an 4,8V eingesetzt. Alternativ kann auch eine Taschenlampe oder Schreibtischlampe verwendet werden. Für die Versuchsreihe wird ein völlig abgedunkelter Raum benötigt (Dunkelkammer, Raum ohne Fenster). Ein Mikrocontroller wird in der ersten Übung nicht benötigt.

Kennlinienaufnahme LDR
Material
  • 4x  LDR, versch. Typen
  • 1x  Multimeter
  • 2x  Kabel mit Abgreifklemmen
Aufgaben
  • Schließe den LDR an ein Multimeter an; wähle den Bereich Widerstandsmessung.
  • Stelle eine Lichtquelle 10 cm entfernt vom LDR auf.
  • Schalte die Lichtquelle ein und bestimme den Widerstand des LDR. Notiere den Wert.
  • Wiederhole die Schritte bei 20 cm, 30 cm, 40 cm und 50 cm Abstand.
  • Trage die Messwerte in eine Wertetabelle ein und erstelle den Graph. Abszisse: Abstand, Ordinate: Widerstandswert (Programm Excel).
  • Wiederhole die Messungen mit den anderen LDRs.
Abbildung 1 - Versuchsaufbau zur Aufnahme der Kennlinie eines LDR. Alternativ zur LED kann auch eine Taschenlampe o.ä. verwendet werden. Wichtig ist, dass die optische Achse sich während der Versuchsdurchführung nicht ändert.

Messwerte

Tabelle 1 - Für vier verschiedene LDRs wurde der Widerstand in Ohm in Abhängigkeit zum Abstand von einer Lichtquelle aufgenommen.

Graphische Auswertung

Die vier Kennlinien bestätigen, dass bei einer höheren Mäanderzahl die Empfindlichkeit eines LDR zunimmt. LDR3 und LDR4 sind von der Oberfläche identisch, nur die Mäanderzahl ist beim LDR4 deutlich höher. LDR 1 und LDR2 unterscheiden sich ebenfalls etwas in der Mäanderzahl; LDR1 ist empfindlicher als LDR2. Alle LDRs sind CdS-Sensoren.

Übung 2 - Dunkelwiderstand bestimmen

Zur Bestimmung des Dunkelwiderstandes wird der LDR auf dem Steckbrett in eine lichtundurchlässige Pappröhre gesteckt, die oben verschlossen ist. Bevor die Messung beginnt, muss mit dem Oszilloskop der Spannungswert am Ausgang der Energiequelle gemessen und als Referenzwert in die Programmzeile 30 übernommen werden. Als Dunkelwiderstand wird der Widertstandswert 5s nach Abdunkelung genommen.

Dunkel-widerstand

Aufgaben

  • Baue die Schaltung nach der Skizze auf.
  • Übertrage das Programm ldr1.bas in den BASCOM Editor und speichere es ab.
  • Starte das Programm.
  • Miss die Spannung der Energiequelle und trage den Wert in Programmzeile 30 ein.
  • Miss die Dunkelwiderstände.

Material

  • 1x  Steckbrett
  • 1x  Nullkraftsockel
  • 1x  USB-UART Adapter
  • 1x  Netzteil
  • 1x  ATmega8A oder ähnlich
  • 1x  Programm BASCOM
  • 1x  Programm CoolTerm
  • div. Steckdrähte
  • USB-Oszilloskop
  • 1x  Widerstand, 6,8 MOhm
  • 2x  verschiedene LDR

Schaltskizze

Das Programm ldr1.bas

Die Messungen

Die nachfolgenden Abbildungen zeigt fünf Messwerte für einen LDR. In der ersten Spalte steht der vom ADC gelieferte Rohwert (liegt hier immer zwischen 0 und 1023), in Spalte 2 erscheint die in einen Spannungswert umgerechnete Voltangabe.

Zur Berechnung des Dunkelwiderstandes wird der Spannungswert 5 Sekunden nach Verdunkelung des LDR genommen.

Berechnung des Dunkelwiderstandes

Die von mir ermittelten Dunkelwiderstände liegen zwischen 3,2 MOhm und 6,3 MOhm. Dies deckt sich mit den Angaben in den Datenblättern.

Übung 3 - Lüftersteuerung

In vielen Hotels gibt es Bäder oder Räume ohne Fenster, bei denen, wenn man sie betritt und einen Lichtschalter betätigt, das Licht angeht und nach einer gewissen Zeit auch ein Ventilator anspringt.

In dieser Übung wird eine solche Steuerung praktisch umgesetzt.

Ein Schiebeschalter schaltet eine LED an, wenn die Umgebungshelligkeit gering  ist; sonst bleibt sie dunkel. Nach einer Verzögerungszeit soll sich dann ein Lüfter/Ventilator dazuschalten.

Wird der Schiebeschalter in die Ausgangsstellung zurückgeschoben, erlischt die LED und der Lüfter/Ventilator läuft noch eine gewisse Zeit nach.

Den für diese Übung notwendigen Lüfter/Ventilator kann man für wenig Hartgeld im Internet kaufen.

Versuchs-aufbau

Aufgabe

  • Erstelle eine Schaltung und ein Programm dazu, das, sobald ein Schalter auf ON gestellt wird, ein Licht (LED) einschaltet und nach einer Zeit t auch einen Lüfter. Wird der Schalter auf AUS gestellt, geht das Licht aus und nach einer Zeit t auch der Lüfter.

Material

  • 1x  Schiebeschalter
  • 1x  LED, rot
  • 1x  LDR
  • 1x  Lüfter
  • 1x  Widerstand, 470 Ohm
  • 1x  Widerstand, 10 kOhm
  • 1x  ATmega 8
  • 1x  Steckbrett
  • diverse Steckdrähte
  • 1x  Netzteil
  • 1x  Programmer
  • 1x  USB-Verbindungskabel

 

Schaltskizze

Das Programm ldr_luefter.bas

Der hier vorgestellte Programmvorschlag weist Schwächen auf, die man sehr schnell herausbekommt, wenn man das Programm praktisch erprobt oder es Programmzeile für Programmzeile durcharbeitet.

Eine bessere Lösung erzielt man mit einem timer0-Interrupt, der den Controller während der allgemeinen Programmausführung nicht blockiert, wie ein wait-Befehl (Übung 4).

Der Widerstand von 10 kOhm im LDR-Schaltkreis muss ggf. an die Realsituation und den verwendeten LDR neu angepasst werden. Hilfreich ist dafür die Kennlinie des LDR (Datenblatt).

Wie arbeitet das Programm ldr_luefter.bas

Zeilen 16 - 21

Die Ports PB.0 und PB.1 werden als Ausgänge deklariert; sie steuern die LED und den Lüfter. Der Analog-Digital-Wandler (ADC) wird in der folgenden Programmzeile definiert und in Zeile 19 gestartet. Informationen zu den einzelnen Parametern gibt es über die umfassende Hilfe in BASCOM.

In Zeile 21 wird die Variable Wert deklariert, die den Rückgabewert des ADC aufnimmt.

 

Zeilen 23 - 35

In dieser Endlosschleife werden die Entscheidungen für die jeweilige Steuerung getroffen. Mit dem  Rückgabewert des ADC, abgelegt in der Variablen Wert, und dem Zustand am Eingang PB.2 wird das weitere Vorgehen entschieden.

  • 1. Möglichkeit: Schalter in Position 1 und hohe Lichtintensität vom LDR gemessen (Wert < 400)
    Es wird in das Unterprogramm An_hell verzweigt.
  • 2. Möglichkeit: Schalter in Position 1 und niedrige Lichtintensität (Wert > 400)
    Es wird das Unterprogramm An_dunkel aufgerufen.
  • 3. Möglichkeit: Schalter in Position 0
    Lüfter und Licht sind ausgeschaltet.

Die ersten beiden Unterprogramme sorgen dafür, dass das Licht aus und der Lüfter eingeschaltet bzw.  Licht und Lüfter eingeschaltet werden. Das dritte Unterprogramm schaltet Licht und Lüfter aus.

Übung 4 - Lüftersteuerung mit timer0

Der Aufbau ist in dieser Übung der gleiche wie in Übung 3, nur das Programm wird verändert. Die Veränderung im Verhalten der Schaltung erkennt man daran, dass

  • die LED sofort angeht, wenn sich das Umgebungslicht verdunkelt und
  • die Nachlaufzeit des Lüfters konstant ist und nur von dem voreingestellten Wert abhängt.

Versuchs-aufbau

Aufgabe

  • Erstelle eine Schaltung und ein Programm dazu, das, sobald ein Schalter auf ON gestellt wird, ein Licht (LED) einschaltet und nach einer Zeit t auch einen Lüfter. Wird der Schalter auf AUS gestellt, geht das Licht aus und nach einer Zeit t auch der Lüfter.

Material

  • 1x  Schiebeschalter
  • 1x  LED, rot
  • 1x  LDR
  • 1x  Lüfter
  • 1x  Widerstand, 470 Ohm
  • 1x  Widerstand, 10 kOhm
  • 1x  ATmega 8
  • 1x  Steckbrett
  • diverse Steckdrähte
  • 1x  Netzteil
  • 1x  Programmer
  • 1x  USB-Verbindungskabel

 

Vorbemerkung

Bei einem interrupt-gesteuerten Programm läuft die sogenannte Interrupt-Service-Routine (ISR) parallel zum eigentlichen Hauptprogramm. Immer dann, wenn ein Interrupt ausgelöst wird, verzweigt das Programm zur ISR, führt den dort befindlichen (möglichst kurzen) Programmcode aus, kehrt anschließend in das Hauptprogramm zurück und setzt dort seine Arbeit fort.

Wie ein timer0-Interrupt in BASCOM aufgerufen wird, kann über die programminterne Hilfe über das Suchwort timer0 oder config timer0 nachgeschlagen werden. Weitere Informationen zum timer0 gibt es in der Rubrik Grundlagen unter Timer - Teil 1 und Timer - Teil2.

Das Programm ldr_luefter2.bas

Wie arbeitet das Programm ldr_luefter2.bas?

Die Reaktionsmöglichkeiten der vorliegenden Schaltung lassen sich in vier Positionen aufteilen:

  • Ist Schalter = 0 und flag = 0 (Anfangszustand), steht alles still: LED = 1, Lüfter = 0.
  • Ist Schalter = 1 und die Umgebungshelligkeit > 400, dann
    LED = 0 (Licht an),  Lüfter = 1 nach 10 s.
  • Ist Schalter = 1 und die Umgebungshelligkeit < 400, dann
    LED = 1 (Licht aus), Lüfter = 1 nach 10 s.
  • Ist Schalter = 0 und flag = 1 (Schalter von 1 auf 0), dann
    LED = 1 (Licht aus) und Lüfter = 0 nach 10 s.

Drei dieser vier Optionen erscheinen im Hauptprogramm in den Entscheidungsabfragen

IF ... THEN... END IF.

Nur für den Fall, dass Taster = 0 ist, verbleibt das Programm in einer Endlosschleife WHILE ... WEND.

Innerhalb der Entscheidungsabfragen wird der Ventilator zu- oder abgeschaltet, das Flag auf 1 gesetzt, um zu signalisieren, dass der Schalter in der Position 1 ist und die Variable Sekunde, die in der ISR hochgezählt wird, auf 0 zurückgesetzt.

Ist zum Beispiel Schalter = 1 und LDR < 400, dann wird LED = 1 (Zeile 45) oder die LED ausgeschaltet, da die Umgebungshelligkeit sehr groß ist und zusätzliches Licht nicht benötigt wird.

In der folgenden Entscheidungsabfrage wird überprüft, ob der Wert in der Variablen Sekunde größer als der Wert der Variablen Zeitverzoegerung ist. Der im Hintergrund arbeitende timer0 startet mit Sekunde = 0, wenn der Schalter von 0 auf 1 gesetzt wird.

Seine Zählgeschwindigkeit hängt vom eingestellten Systemtakt (hier: 8 MHz) und Prescaler (hier: 256) ab. Daraus ergibt sich eine Frequenz von 31250 Hz. Der Vorzähler ist auf 95 eingestellt, das heißt, dass der timer0 nicht von 0 bis 255, sondern von 95 bis 255 zählt; das sind 160 Clicks. Daraus folgt, dass mit einer Frequenz von 195,31 Hz (31250 / 160) oder alle 5,2 ms ein timer0-Interrupt ausgelöst wird, der das Programm in die Routine Timer_isr verzweigen lässt und dort die Variable Zaehler um 1 erhöht. Nach 200 Interrupts ist ca. 1 Sekunde (200*5,2 ms = 1040 ms = 1,04 s) vergangen und die Variable Sekunde wird um 1 erhöht.

Wenn der Wert der Variablen Sekunde größer ist als der Wert der Variablen Zeitverzoegerung (hier: 10), dann reagiert das Programm und schaltet den Lüfter ein, setzt das Flag auf 1 und die Sekunden auf 0 zurück.

Weiter geht´s mit dem Kapitel LCD Anzeige

Kommentar schreiben

Kommentare

  • olaf (Sonntag, 10. Dezember 2017 08:35)

    wow...die mit Abstand beste Site, die ich bisher zu diesem Thema gesehen habe :-))
    Vielen Dank dafür. Hilft super beim Erklären!!

  • David Eisenblätter (Sonntag, 11. Februar 2018 13:38)

    Sehr schön erklärt, und zufällig heute, wo ich nochmal nach einer detailierten Gedankenstütze diesbezüglich gesucht habe!

    Vielen vielen Dank!

    David.

Bitte geben Sie den Code ein
* Pflichtfelder
Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf