| |
| ru:examples:sensor:photoresistor [2010/12/16 09:02] – создано eduardtlmk | ru:examples:sensor:photoresistor [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1 |
|---|
| ====== Фоторезистор ====== | |
| |
| //Необходимые знания: [HW] [[et:hardware:homelab:sensor]], [HW] [[et:hardware:homelab:lcd]], [ELC] [[et:electronics:voltage_divider]], \\ [AVR] [[et:avr:adc]], [LIB] [[et:software:homelab:library:adc]], [LIB] [[et:software:homelab:library:module:lcd_alphanumeric]], \\ [PRT] [[et:examples:setup:windows]]// | |
| |
| ===== Теория ===== | |
| |
| [{{ :examples:sensor:photoresistor:sensor_photoresistor.jpg?150|Фоторезистор}}] | |
| [{{ :examples:sensor:photoresistor:sensor_photoresistor_designator.png?150|Электрическое обозначение фоторезистора}}] | |
| |
| Фоторезистор – это датчик, электрическое сопротивление которого меняется в зависимости от интенсивности падающего на него света. Чем интенсивней свет, тем больше создается свободных носителей зарядов и тем меньше становится сопротивление элемента. Два внешних металлических контакта фоторезистора идут через керамический материал основания к светочувствительной пленке, которая по своей геометрии и свойству материала определяет электрические свойства сопротивления. Так как фоточувствительный материал по природе с большим сопротивлением, то между электродами с тонкой извилистой дорожкой, при средней интенсивности света, получается низкое общее сопротивление элемента. Так же как и человеческий глаз, фоторезистор чувствителен к определенному диапазону длины волны света. При выборе фотоэлемента приходится с этим считаться, поскольку в противном случае он может совсем не отреагировать на источник света, используемый в приложении. Здесь приведены длины волн видимого света, упрощенно разделенные по цвету. | |
| |
| ^ Цвет ^ Диапазон длины волны (nm) ^ | |
| | Фиолетовый | 400 – 450 | | |
| | Синий | 450 – 500 | | |
| | Зеленый | 500 – 570 | | |
| | Желтый | 570 – 590 | | |
| | Оранжевый | 590 – 610 | | |
| | Красный | 610 – 700 | | |
| |
| У фоторезисторов обязательно определен и диапазон температуры. Если использовать датчик при разных температурах, то следует обязательно ввести уточняющие преобразования, т.к. свойство сопротивления зависит от внешней температуры. | |
| |
| Для характеристики интенсивности света используют физическую величину освещённость (обозначение E), что показывает количество светового потока, достигающего какой-либо поверхности. Для измерения единицы имеется люкс (лк), где 1 люкс означает, что на поверхность размером 1 m<sup>2</sup> равномерно падает световой поток в 1 люмен (лм). В реальной жизни свет практически никогда не падает на (жилую) поверхность равномерно и поэтому освещённость получается больше в среднем значении. Для сравнения приведены некоторые примеры освещённости: | |
| |
| ^ Окружающая среда ^ Освещённость (lx) ^ | |
| | Полная луна | 0,1 | | |
| | Сумерки | 1 | | |
| | Аудитория | 10 | | |
| | Учебный класс | 30 | | |
| | Рассвет или закат | 400 | | |
| | Операционный зал больницы | 500 - 1000 | | |
| | Прямой солнечный свет | 10000 | | |
| |
| ===== Практика ===== | |
| |
| Плата модуля «Датчики» Домашней Лаборатории снабжена фоторезистором VT935G. Один его вывод соединен с питанием +5 V и другой с каналом 1 (вывод PF1) аналогово-дигитального преобразователя микроконтроллера. С тем же выводом микроконтроллера и землей соединен и обычный 10 kΩ резистор, который вместе с фоторезистором образует делитель напряжения. Так как электрическое сопротивление фоторезистора уменьшается с увеличением интенсивности падающего на него света, то измеряемое напряжение на выводе микроконтроллера возрастает с увеличением интенсивности света. Важно учитывать, что используемый в Домашней Лаборатории фоторезистор реагирует более интенсивно на желтый и оранжевый свет. | |
| |
| Датчик VT935G не является измерительным устройством для конкретных целей, а служит больше для обозначения общих световых условий – к примеру, горит ли в помещении лампа или нет. Поэтому нужно просто измерить сопротивление датчика в полутемной комнате, записать это в программу и с помощью этого сравнить измерения – светлее или темнее. | |
| |
| Данное задание немного сложнее, т.к. освещенность ищется в люксах. Для создания этого используется приблизительная формула и числа с плавающей запятой. Числа с плавающей запятой в языке Си есть //float// и //double// типа, которыми можно представлять дробные числа. Их недостатком является довольно большая потребность в ресурсах. В компьютерах для их вычисления имеется специальное аппаратное обеспечение, для 8-битного микроконтроллера AVR вычисления делаются в программном обеспечение, что занимает довольно много программной памяти и времени. Если недостатки неважны, то числа с плавающей запятой стоит использовать. | |
| |
| [{{ :examples:sensor:photoresistor:sensor_photoresistor_vt935g_slope.png?260|Взаимосвязь между освещенностью (E) и электрическим сопротивлением (R) VT935G}}] | |
| |
| О взаимосвязи между освещенностью и электрическим сопротивлением фоторезистора дается приблизительная формула в спецификации датчика. Как видно на выше приведенном графике, на логарифмической шкале освещенность и сопротивление находятся приблизительно в линеарной зависимости и образуют прямое уравнение, потому что применяется следующее преобразование: | |
| |
| log(a/b) = log(a) - log(b) | |
| |
| Связь характирезует γ фактор (ровный подъем), который у датчика VT935G равен 0,9. Известны так же данные одной точки линии: 18,5 kΩ сопротивление (R<sub>A</sub>) 1при 10 lx освещенности (E<sub>A</sub>). Таким образом, имеются координаты 1 точки и ровный подъем и для вычисления любой другой точки хватит только одного координата. Если измерить сопротивление датчика (R<sub>B</sub>), то можно из уравнения линии вычислить освещенность (E<sub>B</sub>) падающую на датчик. Выразим уравнение линии E<sub>B</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> | |
| |
| Таким образом, имеется формула для вычисления освещения, если сопротивление известно. Сопротивление напрямую микроконтроллером измерить нельзя – для этого фоторезистор находится в делителе напряжения, выходное напряжение которого переводит аналогово-дигитальный преобразователь в конкретные числа (ADC). Для нахождения сопротивления, в первую очередь придется вычислить из значения ADC выходное напряжение (U<sub>2</sub>), делителя напряжения, учитывая и сравниваемое напряжение (U<sub>ref</sub>) преобразователя. Формула следующая: | |
| |
| U<sub>2</sub> = U<sub>ref</sub> ⋅ (ADC / 1024) | |
| |
| Из формулы делителя напряжения (смотри главу делителя напряжения) можно найти в схеме верхнего фоторезистора сопротивление (R<sub>1</sub>): | |
| |
| R<sub>1</sub> = (R<sub>2</sub> ⋅ U<sub>1</sub>) / U<sub>2</sub> - R<sub>2</sub> | |
| |
| Далее при вычислении напряжения и сопротивления известные факторы заменяются значениями и нижние индексы опущены: | |
| |
| U = 5 ⋅ (ADC / 1024) \\ \\ | |
| R = (10 ⋅ 5) / U - 10 \\ \\ | |
| |
| Для нахождения освещенности можно сделать упрощающие переводы: | |
| |
| E = 10<sup>log(18,5/R) / 0.9 + 1</sup> = 10<sup>log(18,5/R) ⋅ 10/9</sup> ⋅ 10<sup>1</sup> = \\ \\ | |
| = 10<sup>log18,5 ⋅ 10/9 - logR ⋅ 10/9</sup> ⋅ 10 = (10<sup>log18,5 ⋅ 10/9</sup> / 10<sup>logR ⋅ 10/9</sup>) ⋅ 10 = \\ \\ | |
| = (18,5<sup>10/9</sup> / R<sup>10/9</sup>) ⋅ 10 = 18,5<sup>10/9</sup> ⋅ 10 ⋅ R<sup>-10/9</sup> \\ | |
| |
| Вычислив постоянную находящуюся перед переменной R, остается формула в виде: | |
| |
| E = 255,84 ⋅ R<sup>-10/9</sup> | |
| |
| С помощью этих формул можно использовать только фоторезистор, находящийся на плате модуля «Датчики» Домашней Лаборатории. При использовании схемы с другими компонентами придется изменить в формулах соответствующие числовые значения. Далее приведен исходный код примера программы, который осуществляет измерение с ADC, вычисление и отображение освещенности на LCD экране. Но еще перед компиляцией программы следует в проекте сделать настройки для использования чисел с плавающей запятой. Для этого имеется краткое руководство в главе установки программного обеспечения. | |
| |
| В примере программы переменные напряжения, сопротивления и освещенности обозначаются числом с плавающей запятой типа //double//. Числа, которые используются в действии с плавающей запятой, должны всегда содержать число после запятой (на языке Си точки), этим числом может быть и ноль, потому что в таком случае компилятор понимает их правильно. С помощью //sprintf// при переводе чисел с плавающей запятой в текст нужно использовать формат “%f“, который можно дополнять целыми и дробными числами, к примеру “%3.2“, что отображает всегда 3 полных числа и 2 числа после запятой. | |
| <code c> | |
| // | |
| // Пример программы фоторезистора модуля «Датчики» Домашней Лаборатории. | |
| // На LCD экране отображается приблизительная освещенность в люксах. | |
| // | |
| #include <stdio.h> | |
| #include <math.h> | |
| #include <homelab/module/lcd_alpha.h> | |
| #include <homelab/adc.h> | |
| #include <homelab/delay.h> | |
| |
| // | |
| // Основная программа | |
| // | |
| int main(void) | |
| { | |
| char text[16]; | |
| unsigned short adc_value; | |
| double voltage, resistance, illuminance; | |
| |
| // Настройка LCD экрана | |
| lcd_alpha_init(LCD_ALPHA_DISP_ON); | |
| |
| // Очистка LCD экрана | |
| lcd_alpha_clear(); | |
| |
| // Название программы | |
| lcd_alpha_write_string("Люксметр"); | |
| |
| // Настройка ADC преобразователя | |
| adc_init(ADC_REF_AVCC, ADC_PRESCALE_8); | |
| |
| // Бесконечный цикл | |
| while (true) | |
| { | |
| // Считывание осредненного значения фоторезистора | |
| adc_value = adc_get_average_value(1, 10); | |
| |
| // Расчет напряжения во входе ADC | |
| voltage = 5.0 * ((double)adc_value / 1024.0); | |
| |
| // Измерение сопротивления фоторезистора в делителе напряжения | |
| resistance = (10.0 * 5.0) / voltage - 10.0; | |
| |
| // Вычисление освещенности в люксах | |
| illuminance = 255.84 * pow(resistance, -10/9); | |
| |
| // Перевод освещенности в текст | |
| sprintf(text, "%0.1f lux ", illuminance); | |
| |
| // Отображение показания на LCD | |
| lcd_alpha_goto_xy(0, 1); | |
| lcd_alpha_write_string(text); | |
| |
| // Задержка 500 мс | |
| sw_delay_ms(500); | |
| } | |
| } | |
| </code> | |
| |