Differences

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

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
de:examples:sensor:photoresistor [2012/01/17 14:28] wittkoepperde:examples:sensor:photoresistor [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 39: Line 39:
 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. 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 folgende Aufgabe hier ist ein wenig komplexer, da die Beleuchtungsstärke in Lux gemessen wird. Hierzu gibt es eine Annäherungsformel und Gleitkomma-Variablen. In C-Sprache sind Gleitkomma-Variablen //float-// und //double-//-Typ Variablen, welche zur Darstellung von Brüchen genutzt werden können. Der Nachteil ist ein erhöhtes Nutzen von Ressourcen. Computer haben spezielle Hardware um Gleitkomma-Variablen zu berechnenin den 8-Bit AVR Microcontrollern wird die Berechnung von Software gemachtwas viel Zeit und Speicher benötigt. Falls die Nachteile nicht kritisch sind, sind Gleitkomma-Variablen es aber wert, genutzt zu werden.+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üssenWährend Computer spezielle Hardware zur Berechnung von Gleitkomma-Variablen besitzenwird diese bei den 8-Bit AVR Microcontrollern mittels einer Software durchgeführtwodurch viel Zeit und Speicher benötigt wirdSofern 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)}}]+[{{  :examples:sensor:photoresistor:sensor_photoresistor_vt935g_slope.png?260|Verhältnis zwischen Widerstand (R) des VT935G und Lichtintensität (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:+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 75: 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 98: Line 94:
  
 // //
-// Main program.+// Hauptprogramm.
 // //
 int main(void) int main(void)
Line 106: 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.1326810496.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