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
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 |
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.
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); } }