Table of Contents

Fotoresistor

Conhecimento necessário: [HW] Módulo de Interface do Utilizador, [ELC] Divisor de Tensão, [AVR] Conversor Analógico-para-Digital, [LIB] Conversor Analógico para Digital, [LIB] LCD Gráfico, [LIB] Sensores

Teoria

Símbolo eléctrico de um fotoresistor
Um fotoresistor

Um fotoresistor é um sensor de resistência eléctrica que é alterada dependendo da intensidade da luz que incide sobre ele. Quanto mais intensa a luz é mais transportadores livres são formados e, por conseguinte, menos resistência tem o elemento. Os dois contactos metálicos exteriores do fotoresistor são atingidos através do material de base cerâmica para a membrana sensível à luz, que determina as propriedades de resistência elétrica de acordo com as suas propriedades e geometria do material. Como o material foto sensível em si tem alta resistência, um caminho estreito entre entre os eletrodos, é adquirida baixa resistência total a uma intensidade média de luz. De modo semelhante ao olho humano, o fotoresistor é sensível a uma determinada gama de comprimentos de onda que tem de ser considerada quando se selecciona um foto elemento, caso contrário pode não reagir à fonte de luz utilizada na aplicação. Segue-se a lista simplificada de comprimentos de onda de luz visível segmentado por cores:

Colour Range of wavelength (nm)
Purple 400 – 450
Blue 450 – 500
Green 500 – 570
Yellow 570 – 590
Orange 590 – 610
Red 610 – 700

A gama de temperatura de trabalho está marcada para fotoresistor. Se desejarmos que o sensor de trabalhe a temperaturas diferentes, conversões precisas devem ser executadas, porque as propriedades de resistência dos sensores dependem da temperatura do ambiente.

Para caracterizar o conceito físico de intensidade de luz, a chamada simplesmente intensidade da luz (E) é usada. Esta representa a quantidade de luz que atinge qualquer superfície. A sua unidade de medição é lux (lx), em que 1 lux representa, a distribuição uniforme de um fluxo de luz de 1 lúmen, que cai sobre uma superfície de 1 m2. Quase nunca na realidade a luz cai de forma uniforme numa superfície e, portanto, a intensidade de luz é geralmente uma média. Abaixo estão alguns exemplos de intensidade de luz para comparação:

Environment Intensity of light (lx)
Full moon 0,1
Dusk 1
Auditorium 10
Class room 30
Sunset or sunrise 400
Operating room (hospital) 500 - 1000
Direct sun light 10000

Prática

O HomeLab está equipado com um fotoresistor VT935G. Um pin do fotoresistor está conectado à fonte de alimentação e um segundo pin ao conversor analógico-digital (HomeLab II canal 1, HomeLab III canal 13). Entre este pin e a terra, a resistência está também ligada, o qual forma um divisor de tensão com o fotoresistor. Uma vez que a resistência eléctrica do fotoresistor diminui à medida que a intensidade da luz que incide sobre ele cresce, a tensão medida no pin do microcontrolador cresce à medida que a intensidade da luz aumenta. Vale a pena ter em conta que o fotoresistor utilizado no HomeLab reage mais em luz laranja e amarela.

O sensor VT935G não se destina a ser um aparelho de medição específico. Ele foi criado para ser mais um dispositivo para especificar as condições gerais de iluminação - há uma lâmpada acesa na sala ou não. Neste caso é preciso apenas medir a resistência do sensor ao ambiente em meia luz, observar os valores no programa e comparar com valores posteriormente medidos - é mais claro ou mais escuro?

O exercício aqui é um pouco mais complexo pois a intensidade da luz é medida também em lux. Para fazer isto, existe uma fórmula de aproximação e variáveis floating point. Na linguagem C são as variáveis do tipo ​​float- e double, que podem ser utilizadas para apresentar fracções. A sua desvantagem é consumirem muitos recursos. Os computadores têm um hardware especial para calcular variáveis ​​destes tipos. No controlador AVR de 8 bits os cálculos são executadas em software o que exige muita memória e tempo. Se esta desvantagem não é crítica, vale a pena usar estes tipos.

Relação entre a resistência (R) do VT935G e a intensidade de luz (E)

Existe uma fórmula aproximada que mostra a relação entre a intensidade da luz e da resistência eléctrica na datasheet do sensor. Como pode ser visto no gráfico (à direita), com a utilização da escala logarítmica, a resistência e a intensidade da luz estão quase em relação linear, a seguinte conversão pode aplicar-se:

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

A relação é caracterizada pelo crescimento do factor γ (declive da linha), que é de 0,9 no sensor VT935G. Temos também dados num dos pontos da linha: resistência de 18,5 kΩ (RA) em intensidade da luz de 10 lx (EA). Assim, temos as coordenadas de um ponto, bem como o declive da linha e para o cálculo de qualquer outro ponto, precisamos apenas de uma coordenada. Ou seja, se a resistência dos sensores (RB) é medida, é possível calcular a partir da equação, a intensidade da luz (EB) que cai sobre o sensor. Encontrar EB a partir da equação de linha é:

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

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

Isto dá a fórmula para calcular a intensidade da luz quando a resistência é conhecida. A resistência não pode ser medida diretamente com o microcontrolador. Para isso, o fotoresistor está ligado ao divisor de tensão. A tensão de saída do divisor de tensão é convertida para uma variável específica pelo conversor analógico-digital (ADC). Para determinar a resistência, a tensão de saída (U2) do divisor de tensão deve ser calculada em primeiro lugar, usando o valor do ADC, e a tensão de comparação (Uref) do conversor deve ser tida em conta. A fórmula é seguinte:

U2 = Uref * (ADC / 1024)

Da fórmula para o divisor de tensão (veja o capítulo sobre divisor de tensão) a resistência do fotoresistor superior (R1) pode ser encontrada:

R1 = (R2 * U1) / U2 - R2

No seguinte cálculo de tensão e resistência, os factores conhecidos substituídos com números e índices foram removidos:

U = 5 * (ADC / 1024)

R = (10 * 5) / U - 10

Para encontrar a intensidade de luz, conversões simplificadas podem ser feitas:

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

Ao calcular a constante em frente da variável de campo R, a expressão permanece a seguinte:

E = 255,84 * R-10/9

Estas fórmulas ajudam apenas se o fotoresistor no módulo do HomeLab é usado. Se o circuito utilizado é equipado com componentes diferentes, as respectivas variáveis ​​precisam de ser alteradas. De seguida, o código-fonte do programa de exemplo é apresentado. Este mede e calcula usando o ADC e exibe a intensidade da luz no LCD.

No programa de exemplo as variáveis de tensão, resistência e intensidade são definidas usando o tipo double de variáveis ​​floating point. As variáveis ​​que devem ser usadas como variáveis ​​tipo floating point devem conter sempre um ponto decimal (pode ser também apenas 0, pois o compilador também o entende corretamente).

// HomeLab photoresistor demonstration
// LCD screen displays the approximate illuminance in lux
#include <stdio.h>
#include <math.h>
#include <homelab/module/lcd_gfx.h>
#include <homelab/adc.h>
#include <homelab/delay.h>
 
// Main program
int main(void)
{
	char text[16];
	unsigned short adc_value;
	double voltage, resistance, illuminance;
 
	// Initializing the LCD
	lcd_gfx_init();
 
        // Setting LCD backlight to work
        lcd_gfx_backlight(true);
 
	// Clearing the LCD.
	lcd_gfx_clear();
 
	//Cursor on the position
	lcd_gfx_goto_char_xy(3, 2);
 
	// Name of the program
	lcd_gfx_write_string("Luxmeter");
 
	// Setting the ADC
	adc_init(ADC_REF_AVCC, ADC_PRESCALE_8);
 
	// Endless loop.
	while (1)
	{
		// Reading the average value of the photoresistor
		adc_value = adc_get_average_value(13, 10);
		// HomeLab II
		//adc_value = adc_get_average_value(1, 10);
 
		// Calculating the voltage in the input of the ADC
		// HomeLab II 		
		//voltage = 5.0 * ((double)adc_value / 1024.0);
		// HomeLab III
		voltage = 2.0625 * ((double)adc_value / 2048.0);
 
		// Calculating the resistance of the photoresistor 
                // in the voltage divider
		// HomeLab II
		//resistance = (10.0 * 5.0) / voltage - 10.0;
		// HomeLab III
		resistance = (33.0) / voltage - 10.0;
 
		// Calculating the intensity of light in lux		
		illuminance = 255.84 * pow(resistance, -10/9);
		// Dividing variable into two integer variable
		// to display it on the screen
		int8_t illu = illuminance;
    		int16_t illudp = trunc((illuminance - illu) * 1000);
 
		// Converting the intensity of light to text		
		sprintf(text, "%3u.%3u lux   ", illu,illudp); 
 
		// Displaying it on the LCD
		lcd_gfx_goto_char_xy(3, 3);
		lcd_gfx_write_string(text);
 
		// Delay 500 ms
		sw_delay_ms(500);
	}
}