Table of Contents

Фоторезистор

Необходимые знания: [HW] Andurite moodul, [HW] LCD moodul, [ELC] Pingejagur,
[AVR] Analoog-digitaalmuundur, [LIB] Analoog-digitaalmuundur, [LIB] Alfabeetiline LCD,
[PRT] Arenduskeskkond AVR Studio (Windows) ATMega128

Теория

Фоторезистор
Электрическое обозначение фоторезистора

Фоторезистор – это датчик, электрическое сопротивление которого меняется в зависимости от интенсивности падающего на него света. Чем интенсивней свет, тем больше создается свободных носителей зарядов и тем меньше становится сопротивление элемента. Два внешних металлических контакта фоторезистора идут через керамический материал основания к светочувствительной пленке, которая по своей геометрии и свойству материала определяет электрические свойства сопротивления. Так как фоточувствительный материал по природе с большим сопротивлением, то между электродами с тонкой извилистой дорожкой, при средней интенсивности света, получается низкое общее сопротивление элемента. Так же как и человеческий глаз, фоторезистор чувствителен к определенному диапазону длины волны света. При выборе фотоэлемента приходится с этим считаться, поскольку в противном случае он может совсем не отреагировать на источник света, используемый в приложении. Здесь приведены длины волн видимого света, упрощенно разделенные по цвету.

Цвет Диапазон длины волны (nm)
Фиолетовый 400 – 450
Синий 450 – 500
Зеленый 500 – 570
Желтый 570 – 590
Оранжевый 590 – 610
Красный 610 – 700

У фоторезисторов обязательно определен и диапазон температуры. Если использовать датчик при разных температурах, то следует обязательно ввести уточняющие преобразования, т.к. свойство сопротивления зависит от внешней температуры.

Для характеристики интенсивности света используют физическую величину освещённость (обозначение E), что показывает количество светового потока, достигающего какой-либо поверхности. Для измерения единицы имеется люкс (лк), где 1 люкс означает, что на поверхность размером 1 m2 равномерно падает световой поток в 1 люмен (лм). В реальной жизни свет практически никогда не падает на (жилую) поверхность равномерно и поэтому освещённость получается больше в среднем значении. Для сравнения приведены некоторые примеры освещённости:

Окружающая среда Освещённость (lx)
Полная луна 0,1
Сумерки 1
Аудитория 10
Учебный класс 30
Рассвет или закат 400
Операционный зал больницы 500 - 1000
Прямой солнечный свет 10000

Практика

Плата модуля «Датчики» Домашней Лаборатории снабжена фоторезистором VT935G. Один его вывод соединен с питанием +5 V и другой с каналом 1 (вывод PF1) аналогово-дигитального преобразователя микроконтроллера. С тем же выводом микроконтроллера и землей соединен и обычный 10 kΩ резистор, который вместе с фоторезистором образует делитель напряжения. Так как электрическое сопротивление фоторезистора уменьшается с увеличением интенсивности падающего на него света, то измеряемое напряжение на выводе микроконтроллера возрастает с увеличением интенсивности света. Важно учитывать, что используемый в Домашней Лаборатории фоторезистор реагирует более интенсивно на желтый и оранжевый свет.

Датчик VT935G не является измерительным устройством для конкретных целей, а служит больше для обозначения общих световых условий – к примеру, горит ли в помещении лампа или нет. Поэтому нужно просто измерить сопротивление датчика в полутемной комнате, записать это в программу и с помощью этого сравнить измерения – светлее или темнее.

Данное задание немного сложнее, т.к. освещенность ищется в люксах. Для создания этого используется приблизительная формула и числа с плавающей запятой. Числа с плавающей запятой в языке Си есть float и double типа, которыми можно представлять дробные числа. Их недостатком является довольно большая потребность в ресурсах. В компьютерах для их вычисления имеется специальное аппаратное обеспечение, для 8-битного микроконтроллера AVR вычисления делаются в программном обеспечение, что занимает довольно много программной памяти и времени. Если недостатки неважны, то числа с плавающей запятой стоит использовать.

Взаимосвязь между освещенностью (E) и электрическим сопротивлением (R) VT935G

О взаимосвязи между освещенностью и электрическим сопротивлением фоторезистора дается приблизительная формула в спецификации датчика. Как видно на выше приведенном графике, на логарифмической шкале освещенность и сопротивление находятся приблизительно в линеарной зависимости и образуют прямое уравнение, потому что применяется следующее преобразование:

log(a/b) = log(a) - log(b)

Связь характирезует γ фактор (ровный подъем), который у датчика VT935G равен 0,9. Известны так же данные одной точки линии: 18,5 kΩ сопротивление (RA) 1при 10 lx освещенности (EA). Таким образом, имеются координаты 1 точки и ровный подъем и для вычисления любой другой точки хватит только одного координата. Если измерить сопротивление датчика (RB), то можно из уравнения линии вычислить освещенность (EB) падающую на датчик. Выразим уравнение линии EB:

log(EB) = log(RA/RB) / γ + log(EA)

EB = 10log(RA/RB) / γ + log(EA)

Таким образом, имеется формула для вычисления освещения, если сопротивление известно. Сопротивление напрямую микроконтроллером измерить нельзя – для этого фоторезистор находится в делителе напряжения, выходное напряжение которого переводит аналогово-дигитальный преобразователь в конкретные числа (ADC). Для нахождения сопротивления, в первую очередь придется вычислить из значения ADC выходное напряжение (U2), делителя напряжения, учитывая и сравниваемое напряжение (Uref) преобразователя. Формула следующая:

U2 = Uref ⋅ (ADC / 1024)

Из формулы делителя напряжения (смотри главу делителя напряжения) можно найти в схеме верхнего фоторезистора сопротивление (R1):

R1 = (R2 ⋅ U1) / U2 - R2

Далее при вычислении напряжения и сопротивления известные факторы заменяются значениями и нижние индексы опущены:

U = 5 ⋅ (ADC / 1024)

R = (10 ⋅ 5) / U - 10

Для нахождения освещенности можно сделать упрощающие переводы:

E = 10log(18,5/R) / 0.9 + 1 = 10log(18,5/R) ⋅ 10/9 ⋅ 101 =

= 10log18,5 ⋅ 10/9 - logR ⋅ 10/9 ⋅ 10 = (10log18,5 ⋅ 10/9 / 10logR ⋅ 10/9) ⋅ 10 =

= (18,510/9 / R10/9) ⋅ 10 = 18,510/9 ⋅ 10 ⋅ R-10/9

Вычислив постоянную находящуюся перед переменной R, остается формула в виде:

E = 255,84 ⋅ R-10/9

С помощью этих формул можно использовать только фоторезистор, находящийся на плате модуля «Датчики» Домашней Лаборатории. При использовании схемы с другими компонентами придется изменить в формулах соответствующие числовые значения. Далее приведен исходный код примера программы, который осуществляет измерение с ADC, вычисление и отображение освещенности на LCD экране. Но еще перед компиляцией программы следует в проекте сделать настройки для использования чисел с плавающей запятой. Для этого имеется краткое руководство в главе установки программного обеспечения.

В примере программы переменные напряжения, сопротивления и освещенности обозначаются числом с плавающей запятой типа double. Числа, которые используются в действии с плавающей запятой, должны всегда содержать число после запятой (на языке Си точки), этим числом может быть и ноль, потому что в таком случае компилятор понимает их правильно. С помощью sprintf при переводе чисел с плавающей запятой в текст нужно использовать формат “%f“, который можно дополнять целыми и дробными числами, к примеру “%3.2“, что отображает всегда 3 полных числа и 2 числа после запятой.

//
// Пример программы фоторезистора модуля «Датчики» Домашней Лаборатории.
// На 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);
	}
}