====== Fotoresistor ====== //Conhecimento necessário: [HW] [[pt:hardware:homelab:digi]], [ELC] [[pt:electronics:voltage_divider]], [AVR] [[pt:avr:adc]], [LIB] [[pt:software:homelab:library:adc]], [LIB] [[pt:software:homelab:library:module:lcd_graphic]], [LIB] [[pt:software:homelab:library:module:sensor]]// ===== Teoria ===== [{{ :examples:sensor:photoresistor:sensor_photoresistor_designator.png?150|Símbolo eléctrico de um fotoresistor}}] [{{ :examples:sensor:photoresistor:sensor_photoresistor.jpg?150|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. [{{ :examples:sensor:photoresistor:sensor_photoresistor_vt935g_slope.png?260|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 #include #include #include #include // 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); } }