This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| de:examples:sensor:photoresistor [2012/01/17 16:28] – wittkoepper | de:examples:sensor:photoresistor [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Fotowiderstand ====== | ||
| + | |||
| + | // | ||
| + | |||
| + | ===== Theorie ===== | ||
| + | |||
| + | [{{ : | ||
| + | [{{ : | ||
| + | |||
| + | Ein Fotowiderstand ist ein Sensor, dessen elektrischer Widerstand sich je nach einfallender Lichtintensität verändert. Je intensiver das Licht ist, desto mehr freie Ladungsträger werden gebildet, und umso geringer wird dadurch der Widerstand des Bauteils. Durch das keramische Basismaterial führen zwei externe Metallkontakte des Widerstands zur lichtempfindlichen Membran, dessen Widerstand abhängig von der Geometrie und den Materialeigenschaften ist. Da lichtempfindliches Material durch die schmale, kurvige Spur zwischen den Elektroden bereits einen hohen Widerstand hat, kann der niedrigste totale Widerstand schon bei durchschnittlichen Lichtintensitäten erreicht werden. Der Fotowiderstand reagiert ähnlich dem menschlichen Auge nur auf bestimmte Wellenlängen, | ||
| + | |||
| + | ^ Farbe ^ Wellenlängen (nm) ^ | ||
| + | | Violett | ||
| + | | Blau | 450 – 500 | | ||
| + | | Grün | 500 – 570 | | ||
| + | | Gelb | 570 – 590 | | ||
| + | | Orange | ||
| + | | Rot | 610 – 700 | | ||
| + | |||
| + | Der Fotowiderstand arbeitet innerhalb eines bestimmten, festgelegten Temperaturbereichs. Soll der Sensor bei anderen Temperaturen genutzt werden, müssen präzise Umrechnungen durchgeführt werden, da die Widerstandseigenschaften des Sensors abhängig von der Umgebungstemperatur sind. | ||
| + | |||
| + | Zur Kennzeichnung der Lichtintensität wird die Beleuchtungsstärke (E) genutzt. Diese zeigt die Menge Licht an, die auf eine bestimmte Oberfläche trifft. Die Maßeinheit ist Lux (lx), wobei 1 Lux dem konstanten Lichtfluss von einem 1 Lumen entspricht, welcher auf eine Oberfläche von 1m² strahlt. In der Realität fällt Licht jedoch eigentlich nie gleichmäßig auf eine Oberfläche weshalb die Beleuchtungsstärke meistens als Durchschnittswert ermittelt wird. Unten sind ein paar Beispiele von Beleuchtungsstärken dargestellt: | ||
| + | |||
| + | Vergleichswerte von Beleuchtungsstärken: | ||
| + | |||
| + | ^ Umgebung | ||
| + | | Vollmond | ||
| + | | Abenddämmerung | ||
| + | | Auditorium | ||
| + | | Klassenraum | ||
| + | | Sonnenaufgang / -untergang| 400 | | ||
| + | | OP-Saal (Krankenhaus) | ||
| + | | direktes Sonnenlicht | ||
| + | |||
| + | ===== Übung ===== | ||
| + | |||
| + | Das Sensormodul aus dem HomeLab verfügt über einen VT935G Fotowiderstand. Ein Pin des Widerstands ist an der +5 V Stromversorgung angeschlossen, | ||
| + | |||
| + | Der Sensor VT935G ist nicht als spezifisches Messinstrument gedacht. Er soll vielmehr dazu dienen, Informationen über die allgemeinen Lichtverhältnisse (z. B. befindet sich eine eingeschaltete Lampe im Raum oder nicht) anzugeben. Dazu muss nur der Widerstand des Sensors in einem halbdunklen Raum gemessen und ins Programm eingetragen werden. Daraufhin kann man die gemessenen Werte vergleichen und feststellen ob es heller oder dunkler ist. | ||
| + | |||
| + | Die nun folgende Aufgabe ist ein wenig komplexer, da die Beleuchtungsstärke auch in Lux gemessen wird. Hierzu werden eine Annäherungsformel sowie Gleitkomma-Variablen angewendet. In C sind Gleitkomma-Variablen //float-// und // | ||
| + | |||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Das Datenblatt des Sensors beinhaltet eine Annäherungsformel für den Zusammenhang zwischen Beleuchtungsstärke und elektrischem Widerstand. Wie im logarithmisch skalierten Graphen rechts dargestellt, | ||
| + | |||
| + | |||
| + | log(a/b) = log(a) - log(b) | ||
| + | |||
| + | Die Relation wird durch den Anstieg des Y-Faktors (Steigung der Geraden) beschrieben, | ||
| + | |||
| + | log(E< | ||
| + | E< | ||
| + | |||
| + | So erhält man die Formel zur Berechnung der Beleuchtungsstärke bei gegebenem Widerstand. Da der Widerstand nicht direkt von Microcontroller gemessen werden kann befindet sich der Fotowiderstand im Spannungsteiler. Die Output-Spannung des Spannungsteilers wird durch den ADC zu einer spezifischen Variable konvertiert. Zur Bestimmung des Widerstands muss diese Output-Spannung (U< | ||
| + | |||
| + | U< | ||
| + | |||
| + | Mit Hilfe der Formel für Spannungsteiler (siehe Kapitel über Spannungsteiler) kann der Widerstand des Fotowiderstands (R< | ||
| + | |||
| + | R< | ||
| + | |||
| + | In der folgenden Berechnung von Spannung und Widerstand, werden die gegebenen Werte eingesetzt und die Indizes entfernt: | ||
| + | |||
| + | U = 5 * (ADC / 1024) \\ \\ | ||
| + | R = (10 * 5) / U - 10 \\ \\ | ||
| + | |||
| + | Die Beleuchtungsstärke kann dann mittels der folgenden vereinfachten Konversion genutzt werden: | ||
| + | |||
| + | E = 10< | ||
| + | = 10< | ||
| + | = (18.5< | ||
| + | |||
| + | Durch die Berechnung der Konstante vor der Variable des Feldes R, bleibt folgender Ausdruck: | ||
| + | |||
| + | E = 255,84 * R< | ||
| + | |||
| + | Die dargestellten Formeln sind jedoch nur im Zusammenhang mit Fotowiderständen des HomeLab Sensor-Moduls nützlich. Wird ein Schaltkreis mit anderen Komponenten bestückt, müssen die Variablen verändert werden. | ||
| + | Nachfolgend ist der Quellcode eines Beispielprogramms dargestellt, | ||
| + | |||
| + | In diesem Beispielprogramm werden die Variablen für Spannung, Widerstand und Beleuchtungsstärke als //double// Gleitkomma-Variablen definiert. Die Variablen, welche nun als Gleitkomma-Variablen genutzt werden, müssen immer eine Dezimalstelle beinhalten (diese kann auch einfach 0 sein, so verarbeitet der Compiler es korrekt). Wird die Funktion //sprintf// genutzt, um die Gleitkomma-Variable in Text zu konvertieren, | ||
| + | |||
| + | <code c> | ||
| + | // | ||
| + | // Beispielprogramm des Fotowiderstands aus dem Sensormodul des HomeLab | ||
| + | // Der angenäherte Wert der Beleuchtungsstärke wird auf dem LCD dargestellt. | ||
| + | // | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // | ||
| + | // Hauptprogramm. | ||
| + | // | ||
| + | int main(void) | ||
| + | { | ||
| + | char text[16]; | ||
| + | unsigned short adc_value; | ||
| + | double voltage, resistance, illuminance; | ||
| + | |||
| + | // Initialisiere LCD | ||
| + | lcd_alpha_init(LCD_ALPHA_DISP_ON); | ||
| + | |||
| + | // Lösche LCD. | ||
| + | lcd_alpha_clear(); | ||
| + | |||
| + | // Name des Programms | ||
| + | lcd_alpha_write_string(" | ||
| + | |||
| + | // Einrichten des ADC | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | |||
| + | // Endlosschleife. | ||
| + | while (true) | ||
| + | { | ||
| + | // Durchschnittlichen Wert des Fotoresistors auslesen | ||
| + | adc_value = adc_get_average_value(1, | ||
| + | |||
| + | // Input-Spannung am ADC berechnen | ||
| + | voltage = 5.0 * ((double)adc_value / 1024.0); | ||
| + | |||
| + | // Widerstand des Fotoresistors im Spannungsteiler berechnen | ||
| + | resistance = (10.0 * 5.0) / voltage - 10.0; | ||
| + | |||
| + | // Beleuchtungsstärke in lux berechnen | ||
| + | illuminance = 255.84 * pow(resistance, | ||
| + | |||
| + | // Beleuchtungsstärke in Text konvertieren | ||
| + | sprintf(text, | ||
| + | |||
| + | // Darstellung auf dem LCD | ||
| + | lcd_alpha_goto_xy(0, | ||
| + | lcd_alpha_write_string(text); | ||
| + | |||
| + | // Verzögerung 500 ms | ||
| + | sw_delay_ms(500); | ||
| + | } | ||
| + | } | ||
| + | </ | ||