This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| pt:examples:sensor:photoresistor [2015/12/15 17:55] – artica | pt:examples:sensor:photoresistor [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Fotoresistor ====== | ||
| + | // | ||
| + | [HW] [[pt: | ||
| + | [ELC] [[pt: | ||
| + | [AVR] [[pt: | ||
| + | [LIB] [[pt: | ||
| + | [LIB] [[pt: | ||
| + | |||
| + | ===== Teoria ===== | ||
| + | |||
| + | [{{ : | ||
| + | [{{ : | ||
| + | |||
| + | 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, | ||
| + | |||
| + | ^ Colour | ||
| + | | Purple | ||
| + | | Blue | 450 – 500 | | ||
| + | | Green | 500 – 570 | | ||
| + | | Yellow | ||
| + | | Orange | ||
| + | | 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< | ||
| + | |||
| + | |||
| + | ^ Environment | ||
| + | | Full moon | 0,1 | | ||
| + | | Dusk | 1 | | ||
| + | | Auditorium | ||
| + | | Class room | 30 | ||
| + | | Sunset or sunrise | ||
| + | | Operating room (hospital) | 500 - 1000 | ||
| + | | Direct sun light | ||
| + | |||
| + | ===== 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 // | ||
| + | |||
| + | |||
| + | [{{ : | ||
| + | |||
| + | 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, | ||
| + | |||
| + | 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< | ||
| + | |||
| + | log(E< | ||
| + | E< | ||
| + | |||
| + | 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, | ||
| + | |||
| + | U< | ||
| + | |||
| + | 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< | ||
| + | |||
| + | R< | ||
| + | |||
| + | No seguinte cálculo de tensão e resistência, | ||
| + | |||
| + | U = 5 * (ADC / 1024) \\ \\ | ||
| + | R = (10 * 5) / U - 10 \\ \\ | ||
| + | |||
| + | Para encontrar a intensidade de luz, conversões simplificadas podem ser feitas: | ||
| + | |||
| + | E = 10< | ||
| + | = 10< | ||
| + | = (18.5< | ||
| + | |||
| + | Ao calcular a constante em frente da variável de campo R, a expressão permanece a seguinte: | ||
| + | |||
| + | E = 255,84 * R< | ||
| + | |||
| + | 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 < | ||
| + | #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, | ||
| + | |||
| + | // Name of the program | ||
| + | lcd_gfx_write_string(" | ||
| + | |||
| + | // Setting the ADC | ||
| + | adc_init(ADC_REF_AVCC, | ||
| + | |||
| + | // Endless loop. | ||
| + | while (1) | ||
| + | { | ||
| + | // Reading the average value of the photoresistor | ||
| + | adc_value = adc_get_average_value(13, | ||
| + | // HomeLab II | ||
| + | // | ||
| + | |||
| + | // 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 | ||
| + | // | ||
| + | // HomeLab III | ||
| + | resistance = (33.0) / voltage - 10.0; | ||
| + | |||
| + | // Calculating the intensity of light in lux | ||
| + | illuminance = 255.84 * pow(resistance, | ||
| + | // 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, | ||
| + | |||
| + | // Displaying it on the LCD | ||
| + | lcd_gfx_goto_char_xy(3, | ||
| + | lcd_gfx_write_string(text); | ||
| + | |||
| + | // Delay 500 ms | ||
| + | sw_delay_ms(500); | ||
| + | } | ||
| + | } | ||
| + | </ | ||