Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
pt:examples:sensor:photoresistor [2015/12/15 16:01] – Criação deste novo documento. articapt:examples:sensor:photoresistor [2020/07/20 12:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +====== 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  m<sup>2</sup>. 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Ω (R<sub>A</sub>) em intensidade da luz de 10 lx (E<sub>A</sub>). 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 (R<sub>B</sub>) é medida, é possível calcular a partir da equação, a intensidade da luz (E<sub>B</sub>) que cai sobre o sensor. Encontrar E<sub>B</sub> a partir da equação de linha é:
 +
 +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>
 +
 +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 (U<sub>2</sub>) do divisor de tensão deve ser calculada em primeiro lugar, usando o valor do ADC, e a tensão de comparação (U<sub>ref</sub>) do conversor deve ser tida em conta. A fórmula é seguinte:
 +
 +U<sub>2</sub> = U<sub>ref</sub> * (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 (R<sub>1</sub>) pode ser encontrada:
 +
 +R<sub>1</sub> = (R<sub>2</sub> * U<sub>1</sub>) / U<sub>2</sub> - R<sub>2</sub>
 +
 +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 = 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>
 +
 +Ao calcular a constante em frente da variável de campo R, a expressão permanece a seguinte:
 +
 +E = 255,84 * R<sup>-10/9</sup>
 +
 +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).
 +
 +<code c>
 +// 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);
 + }
 +}
 +</code>
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0