Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
de:examples:sensor:photoresistor [2010/11/26 08:48] – angelegt Wemberde:examples:sensor:photoresistor [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Fotowiderstand ====== ====== Fotowiderstand ======
  
-//Necessary knowledge: [HW] [[en:hardware:homelab:sensor]], [HW] [[en:hardware:homelab:lcd]], [ELC] [[en:electronics:voltage_divider]], [AVR] [[en:avr:adc]], [LIB] [[en:software:homelab:library:adc]], [LIB] [[en:software:homelab:library:module:lcd_alphanumeric]], [PRT] [[en:examples:setup:windows]]//+//Notwendiges Wissen: [HW] [[en:hardware:homelab:sensor]], [HW] [[en:hardware:homelab:lcd]], [ELC] [[en:electronics:voltage_divider]], [AVR] [[en:avr:adc]], [LIB] [[en:software:homelab:library:adc]], [LIB] [[en:software:homelab:library:module:lcd_alphanumeric]], [PRT] [[en:examples:setup:windows]]//
  
 ===== Theorie ===== ===== Theorie =====
  
-[{{  :examples:sensor:photoresistor:sensor_photoresistor.jpg?150|A photoresistor}}] +[{{  :examples:sensor:photoresistor:sensor_photoresistor.jpg?150|Ein Fotowiderstand}}] 
-[{{  :examples:sensor:photoresistor:sensor_photoresistor_designator.png?150|Electrical symbol for a photoresistor}}]+[{{  :examples:sensor:photoresistor:sensor_photoresistor_designator.png?150|Elektrisches Symbol für einen Fotowiderstand}}]
  
-Ein Fotowiderstand ist ein Sensor, dessen elektrischer Widerstand sich je nach Lichtintensität verändert. Um so intensiver das Licht ist, um zu mehr freie Ladungsträger werden gebildet, und daher sinkt der Widerstand des ElementsZwei externe Metallkontakte des Widerstands reichen durch das keramische Basismaterial zur lichtempfindlichen Membran, dessen Widerstand abhängig von der Geometrie und den Materialeigenschaften ist. Da lichtempfindliches Material selbst ein hohen Widerstand mit einer schmalenkurvigen Spur zwischen den Elektroden hat wird der niedrigste totale Widerstand schon bei durchschnittlichen Lichtintensitäten erreicht. Ähnlich zum menschlichen Auge, ist der Fotowiderstand nur für bestimmte Wellenlängen empfindlichdies muss bedacht werden, wenn man einen Fotowiderstand auswähltEs kann sonst sein, dass der Widerstand nicht auf die Lichtquelle reagiert. Folgendes ist eine vereinfachte Tabelle von Wellenlängen des sichtbaren Lichts unterteilt in Farben: +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 BauteilsDurch 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 schmalekurvige Spur zwischen den Elektroden bereits einen hohen Widerstand hat, kann der niedrigste totale Widerstand schon bei durchschnittlichen Lichtintensitäten erreicht werdenDer Fotowiderstand reagiert ähnlich dem menschlichen Auge nur auf bestimmte Wellenlängen, was bei der Auswahl eines solchen Bauteils bedacht werden mussAndernfalls kann es vorkommen, dass der Widerstand nicht auf die in der Anwendung genutzte Lichtquelle reagiert. Nachfolgend ist eine Tabelle abgebildet, welche vereinfacht die Wellenlängen des sichtbaren Lichts mit den entsprechenden Farben darstellt       
-:         +
  
 ^ Farbe            ^ Wellenlängen (nm)  ^ ^ Farbe            ^ Wellenlängen (nm)  ^
Line 19: Line 18:
 | Rot          | 610 – 700                  | | Rot          | 610 – 700                  |
  
-Es gibt einen bestimmten Temperaturbereich für einen Fotowiderstand. Wenn man den Sensor bei anderen Temperaturen nutzen will, müssen präzise Umrechnungen gemacht werden, da die Widerstandseigenschaften des Sensors abhängig von der Umgebungstemperatur ist+Der Fotowiderstand arbeitet innerhalb eines bestimmten, festgelegten TemperaturbereichsSoll 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
  
-Um Lichtintensität zu bemessen wird die Beleuchtungsstärke (E) genutzt, diese zeigt die Menge an Licht die eine bestimmte Oberfläche erreicht. Die Messeinheit ist Lux (lx), wobei 1 lux der konstante Lichtfluss von einem 1 Lumen entspricht, welcher auf eine Fläche von 1m² einstrahlt. In der Realität fällt jedoch Licht kaum gleichmäßig auf eine Oberfläche und daher ist die Beleuchtungsstärke meistens ein Durchschnittswert. Unterhalb sind ein paar Beispiele von Beleuchtungsstärken:+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 wirdUnten sind ein paar Beispiele von Beleuchtungsstärken dargestellt:
        
- +Vergleichswerte von Beleuchtungsstärken:
-Werte von Beleuchtungsstärken zum Vergleich:+
  
 ^ Umgebung             ^ Beleuchtungsstärke (lx) ^ ^ Umgebung             ^ Beleuchtungsstärke (lx) ^
Line 31: Line 29:
 | Auditorium             | 10            | Auditorium             | 10           
 | Klassenraum             | 30            | Klassenraum             | 30           
-| Sonnenaufgang             | 400          |  +| Sonnenaufgang / -untergang| 400          |  
-| OP (Krankenhaus)          | 500 - 1000   +| OP-Saal (Krankenhaus)     | 500 - 1000   
 | direktes Sonnenlicht     | 10000        |  | direktes Sonnenlicht     | 10000        | 
  
 ===== Übung ===== ===== Übung =====
-Das Sensor-Modul von HomeLab hat einen VT935G Fotowiderstand. Ein Pin des Widerstands ist am +5 V angeschlossen der zweite an Kanal 1 (Pin PF1) des ADC. Zwischen diesem Pin und der Erde ist ein 10 kΩ angeschlossen, welcher einen Spannungsteiler mit dem Fotowiderstand erzeugt. 
-Da der elektrische Widerstand des Fotowiderstands sich mit der Lichtintensität verkleinert, wird die gemessene Spannung am Pin des Microcontrollers mit dem Ansteigen der Lichtstärke größer. Man sollte bedenken, dass der Fotowiderstand im HomeLab am meisten auf orangefarbenes und gelbes Licht reagiert. 
  
-Der Sensor VT935G sollte kein spezifisches Messinstrument seinEs ist mehr ein Gerätwelches die allgemeinen Lichtverhältnisse angibt - Gibt es eine Lampe im Raum oder nicht. +Das Sensormodul aus dem HomeLab verfügt über einen VT935G FotowiderstandEin Pin des Widerstands ist an der +5 V Stromversorgung angeschlossender zweite an Kanal 1 (Pin PF1) des ADCZwischen diesem Pin und der Masse ist ein 10 kΩ Widerstand angeschlossen, welcher zusammen mit dem Fotowiderstand einen Spannungsteiler erzeugt. Da sich der elektrische Widerstand des Fotowiderstands mit einfallender Lichtintensität verkleinertwird die gemessene Spannung am Pin des Mikrocontrollers mit dem Ansteigen der Lichtstärke größer. Hierbei sollte bedacht werden, dass der Fotowiderstand des HomeLab am stärksten auf oranges und gelbes Licht reagiert.
-In diesem Fall müsste man nur den Widerstand des Sensors in einem halb-dunklen Raum messendies in ein Programm eintragen und die gemessenen Werte vergleichen - ist es heller oder dunkler.+
  
-Die Aufgabe hier, ist ein wenig komplexerda die Beleuchtungsstärke in Lux gemessen wirdDafür gibt es eine Annäherungsformel und Gleitkomma-VariablenIn C-Sprache sind Gleitkomma-Variablen //float-// und //double-//-Typ Variablen, welche genutzt werden können um Brüche darzustellenDer Nachteil ist ein erhöhtes Nutzen von Ressourcen. Computer haben spezielle Hardware um Gleitkomma-Variablen zu berechnen, in den 8-Bit AVR Microcontrollern wird die Berechnung von Software gemacht, was viel Zeit und Speicher benötigt. Falls die Nachteile nicht kritisch sind, sind Gleitkomma-Variablen es aber wert, genutzt zu werden.+Der Sensor VT935G ist nicht als spezifisches Messinstrument gedacht. Er soll vielmehr dazu dienenInformationen über die allgemeinen Lichtverhältnisse (z. Bbefindet sich eine eingeschaltete Lampe im Raum oder nicht) anzugebenDazu 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 //double-//-Typ Variablen, welche zur Darstellung von Brüchen genutzt werden können. Nachteilig ist jedoch, dass während der Nutzung dieser Variablen viele Ressourcen in Anspruch genommen werden müssen. Während Computer spezielle Hardware zur Berechnung von Gleitkomma-Variablen besitzen, wird diese bei den 8-Bit AVR Microcontrollern mittels einer Software durchgeführt, wodurch viel Zeit und Speicher benötigt wird. Sofern die Nachteile jedoch nicht entscheidend sind, lohnt es sich, Gleitkomma-Variablen zu verwenden.
  
-[{{  :examples:sensor:photoresistor:sensor_photoresistor_vt935g_slope.png?260|Relationship between resistance (R) of VT935G and intensity of light (E)}}] 
  
-Es gibt eine Annäherungsformel für den Zusammenhang zwischen Beleuchtungsstärke und elektrischen Widerstand im Datenblatt des Sensors. Wie man im Graphen (rechts) siehtin einer logarithmischen Skala, ist der Widerstand und die Beleuchtungsstärke fast linear abhängigund bilden eine Lineare Funktion auf Grund der folgenden Konversion:+[{{  :examples:sensor:photoresistor:sensor_photoresistor_vt935g_slope.png?260|Verhältnis zwischen Widerstand (R) des VT935G und Lichtintensität (E)}}] 
 + 
 +Das Datenblatt des Sensors beinhaltet eine Annäherungsformel für den Zusammenhang zwischen Beleuchtungsstärke und elektrischem Widerstand. Wie im logarithmisch skalierten Graphen rechts dargestelltsind Widerstand und Beleuchtungsstärke nahezu linear abhängig und bilden eine lineare Funktion, wenn folgende Konversion angewendet wird:
  
  
 log(a/b) = log(a) - log(b) log(a/b) = log(a) - log(b)
  
-Die Relation wird durch das Steigen des Faktor charakterisiert, welcher 0,9 für den VT935G Sensor istWir haben auch Daten für einen Punkt auf der Linie: Widerstand 18.5 kΩ (R<sub>A</sub>) bei 10 lx Beleuchtungsstärke (E<sub>A</sub>). Daher haben wir die Koordinaten von einem Punkt und die Steigung der Gerade, daher können wir jeden anderen Punkt berechnen. D.h. wenn der Widerstand (R<sub>B</sub>) am Sensor gemessen wird, ist es möglich die Beleuchtungsstärke E<sub>B</sub>) mit der Formel der Geraden zu berechnen. +Die Relation wird durch den Anstieg des Y-Faktors (Steigung der Geraden) beschrieben, welcher für den VT935G Sensor den Wert 0,9 hatDarüber hinaus ist ein Punkt auf dieser Geraden bekanntDer Widerstand beträgt 18.5 kΩ (R<sub>A</sub>) bei 10 lx Beleuchtungsstärke (E<sub>A</sub>). Mittels dieser Koordinaten und der Steigung der Geraden lässt sich nun jeder beliebige Punkt berechnen. Das bedeutet, wird der Widerstand (R<sub>B</sub>) am Sensor gemessen, ist es möglich die Beleuchtungsstärke E<sub>B</sub>wie folgt mit der Formel der Geraden zu berechnen.
-Finden von  E<sub>B</sub> mit der Geraden-Formel:+
  
 log(E<sub>B</sub>) = log(R<sub>A</sub>/R<sub>B</sub>) / γ + log(E<sub>A</sub>) \\ \\ log(E<sub>B</sub>) = log(R<sub>A</sub>/R<sub>B</sub>) / γ + log(E<sub>A</sub>) \\ \\
 E<sub>B</sub> = 10<sup>log(R<sub>A</sub>/R<sub>B</sub>) / γ + log(E<sub>A</sub>)</sup> E<sub>B</sub> = 10<sup>log(R<sub>A</sub>/R<sub>B</sub>) / γ + log(E<sub>A</sub>)</sup>
  
-Dies gibt uns die Formel um die Beleuchtungsstärke zu berechnen, wenn der Widerstand gegeben istDer Widerstand kann nicht direkt von Microcontroller gemessen werden. Dafür ist der Fotowiderstand in einem Spannungsteiler. Die Output-Spannung des Spannungsteilers wird vom ADC zu einer spezifischen Variable konvertiert. Um den Widerstand zu finden, muss die Output-Spannung vom (U<sub>2</sub>Spannungsteiler zuerst berechnet werden, mit dem ADC WertMan muss auch die Vergleichs-Spannung vom Konverter berücksichtigen. +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<sub>2</sub>zunächst mittels des ADC-Wertes berechnet werden. Dabei muss auch die Vergleichs-Spannung des Konverters berücksichtigt werden. Folgende Formel wird zur Berechnung verwendet:
-Die Formel ist Folgende:+
  
 U<sub>2</sub> = U<sub>ref</sub> * (ADC / 1024) U<sub>2</sub> = U<sub>ref</sub> * (ADC / 1024)
  
-Aus der Formel für Spannungsteiler (siehe Kapitel über Spannungsteiler) kann der Widerstand des Fotowiderstands (R<sub>1</sub>gefunden werden:+Mit Hilfe der Formel für Spannungsteiler (siehe Kapitel über Spannungsteiler) kann der Widerstand des Fotowiderstands (R<sub>1</sub>ermittelt werden:
  
 R<sub>1</sub> = (R<sub>2</sub> * U<sub>1</sub>) / U<sub>2</sub> - R<sub>2</sub> R<sub>1</sub> = (R<sub>2</sub> * U<sub>1</sub>) / U<sub>2</sub> - R<sub>2</sub>
  
-In der folgenden Berechnung von Spannung und Widerstand, werden die gegebenen Werte eingetragen und die Indizes entfernt:+In der folgenden Berechnung von Spannung und Widerstand, werden die gegebenen Werte eingesetzt und die Indizes entfernt:
  
 U = 5 * (ADC / 1024) \\ \\ U = 5 * (ADC / 1024) \\ \\
 R = (10 * 5) / U - 10 \\ \\ R = (10 * 5) / U - 10 \\ \\
  
-Um die Beleuchtungsstärke des Lichts zu finden, kann eine vereinfachte Konversion genutzt werden:+Die Beleuchtungsstärke kann dann mittels der folgenden vereinfachten Konversion genutzt werden:
  
 E = 10<sup>log(18.5/R) / 0.9 + 1</sup> = 10<sup>log(18.5/R) * 10/9</sup> * 10<sup>1</sup> = \\ \\ E = 10<sup>log(18.5/R) / 0.9 + 1</sup> = 10<sup>log(18.5/R) * 10/9</sup> * 10<sup>1</sup> = \\ \\
Line 78: Line 73:
 = (18.5<sup>10/9</sup> / R<sup>10/9</sup>) * 10 = 18.5<sup>10/9</sup> * 10 * R<sup>-10/9</sup> = (18.5<sup>10/9</sup> / R<sup>10/9</sup>) * 10 = 18.5<sup>10/9</sup> * 10 * R<sup>-10/9</sup>
  
-Durch Berechnen der Konstante vor der Variable des Felds R, bleicht folgender Ausdruck:+Durch die Berechnung der Konstante vor der Variable des Feldes R, bleibt folgender Ausdruck:
  
 E = 255,84 * R<sup>-10/9</sup> E = 255,84 * R<sup>-10/9</sup>
  
-Diese Formeln helfen nur, wenn man ein Fotowiderstand des HomeLab Sensor-Moduls nutztFalls ein Schaltkreis mit anderen Komponenten genutzt wird, müssen die Variablen verändert werden. +Die dargestellten Formeln sind jedoch nur im Zusammenhang mit Fotowiderständen des HomeLab Sensor-Moduls nützlichWird ein Schaltkreis mit anderen Komponenten bestückt, müssen die Variablen verändert werden. 
-Es folgt ein Quellcode eines Beispielprogramms, welches die Beleuchtungstärke misst, mit dem ADC berechnet und die Beleuchtungsstärke am LCD darstellt. Bevor das Programm kompiliert wird, müssen die Einstellungen für die Gleitkomma-Variablen in das Projekt geschrieben werden. Wie das funktioniert, wird im Kapitel über die Softwareinstallation erklärt. +Nachfolgend ist der Quellcode eines Beispielprogramms dargestellt, welches die Beleuchtungstärke mit Hilfe des ADC misst und berechnet und auf dem LCD darstellt. Bevor das Programm kompiliert wird, müssen die Einstellungen für die Gleitkomma-Variablen im Projekt festgelegt werden. Dieser Schritt wird in dem Kapitel über die Installation der Software erläutert.
- +
-Im Beispielprogramm werden Variablen für die Spannung, Widerstand und Beleuchtungsstärke als //double// Gleitkomma-Variablen definiert. Die Variablen, welche nun als Gleitkomma-Variablen genutzt werden, müssen nun immer ein Dezimalpunkt enthalten (es geht auch einfach 0, da der Kompiler es korrekt versteht)Wenn man //sprintf// nutzt um die Gleitkomma-Variable zu Text konvertiert, muss man "%f" Format nutzen. Dies kann man durch Integer und Dezimalstellen erweitern. Z.B.: "%3.2", welches nun immer 3 Integer und 2 Dezimalstellen angibt. +
-In the example program variables of voltage, resistance and intensity are defined using type +
  
 +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, muss das "%f" Format genutzt werden, welches durch Nutzung von ganzen Zahlen und Dezimalstellen erweitert werden kann. So gibt "%3.2" beispielsweise immer 3 ganze Zahlen und 2 Dezimalstellen an.
  
 <code c> <code c>
 // //
-// The example program of the photoresistor of the module of sensors of the HomeLab +// Beispielprogramm des Fotowiderstands aus dem Sensormodul des HomeLab 
-// Approximate value of the intensity of light is displayed on the LCD.+// Der angenäherte Wert der Beleuchtungsstärke wird auf dem LCD dargestellt.
 // //
 #include <stdio.h>  #include <stdio.h> 
Line 101: Line 94:
  
 // //
-// Main program.+// Hauptprogramm.
 // //
 int main(void) int main(void)
Line 109: Line 102:
  double voltage, resistance, illuminance;  double voltage, resistance, illuminance;
  
- // Initializing the LCD+ // Initialisiere LCD
  lcd_alpha_init(LCD_ALPHA_DISP_ON);   lcd_alpha_init(LCD_ALPHA_DISP_ON); 
  
- // Clearing the LCD.+ // Lösche LCD.
  lcd_alpha_clear();  lcd_alpha_clear();
  
- // Name of the program+ // Name des Programms
  lcd_alpha_write_string("Luxmeter");  lcd_alpha_write_string("Luxmeter");
  
- // Setting the ADC+ // Einrichten des ADC
  adc_init(ADC_REF_AVCC, ADC_PRESCALE_8);   adc_init(ADC_REF_AVCC, ADC_PRESCALE_8); 
  
- // Endless loop.+ // Endlosschleife.
  while (true)  while (true)
  {  {
- // Reading the average value of the photoresistor+ // Durchschnittlichen Wert des Fotoresistors auslesen
  adc_value = adc_get_average_value(1, 10);  adc_value = adc_get_average_value(1, 10);
  
- // Calculating the voltage in the input of the ADC+ // Input-Spannung am ADC berechnen
  voltage = 5.0 * ((double)adc_value / 1024.0);  voltage = 5.0 * ((double)adc_value / 1024.0);
  
- // Calculating the resistance of the photoresistor in the voltage divider+ // Widerstand des Fotoresistors im Spannungsteiler berechnen
  resistance = (10.0 * 5.0) / voltage - 10.0;  resistance = (10.0 * 5.0) / voltage - 10.0;
  
- // Calculating the intensity of light in lux + // Beleuchtungsstärke in lux berechnen
  illuminance = 255.84 * pow(resistance, -10/9);  illuminance = 255.84 * pow(resistance, -10/9);
  
- // Converting the intensity of light to text + // Beleuchtungsstärke in Text konvertieren
  sprintf(text, "%0.1f lux   ", illuminance);   sprintf(text, "%0.1f lux   ", illuminance); 
  
- // Displaying it on the LCD+ // Darstellung auf dem LCD
  lcd_alpha_goto_xy(0, 1);  lcd_alpha_goto_xy(0, 1);
  lcd_alpha_write_string(text);  lcd_alpha_write_string(text);
  
- // Delay 500 ms+ // Verzögerung 500 ms
  sw_delay_ms(500);  sw_delay_ms(500);
  }  }
de/examples/sensor/photoresistor.1290761292.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0