Sensor de Luz com LDR e Arduino - Portal Vida de Silício
|In Sensores, Arduino
Sensor de Luz – Aprendendo a usar o LDR com Arduino
Que tal construir um dispositivo que seja capaz de detectar luz? Você pode, por exemplo, fazer uma lâmpada que ligue sozinha durante a noite. Nesse tutorial, iremos aprender a usar um componente simples e barato que pode ser usado em diversos projetos, o LDR, montando um sensor de luz com uma placa Arduino.
1 Sensor de Luz – Aprendendo a usar o LDR com Arduino
1.1 Relembrar é viver
2 Mãos à obra – Fazendo um sensor de luz com LDR
2.1 Componentes necessários:
3.1 Entendendo o Hardware
3.2 Entendendo o Software
5 Fechamento
Quem nunca se perguntou como as lampadas dos postes ligam sozinhas de noite? Quantas vezes, quando éramos crianças, tentamos apagar as lâmpadas deles usando um laser? Possivelmente, muitos de nós já sabíamos qual era o dispositivo que acionava as lâmpadas.
O nome do dispositivo responsável por saber a hora certa de iluminar é conhecido como fotocélula ou relé fotocélula que nada mais é que um sensor de luz. Ele recebe a luz através dessa parte transparente. Como é possível ver na imagem abaixo, a fotocélula possui um LDR que irá medir a luminosidade.
Exemplo de fotocélula
Nessa fotocélula, quando o valor de luminosidade é menor do que o valor desejável, ele comuta uma chave que poderá ligar uma lâmpada, por exemplo.
O LDR, sigla em inglês de Light-Dependent Resistor, que significa resistor dependente de luz, nada mais é do que o que o próprio nome diz. Tipicamente, quanto maior a luz incidente nesse componente, menor será sua resistência.
LDR – sensor de luminosidade
O LDR é constituído de um semicondutor de alta resistência, que ao receber uma grande quantidade de fótons oriundos da luz incidente, ele absorve elétrons que melhoram sua condutibilidade, reduzindo assim sua resistência.
Dessa forma, esse semicondutor pode assumir resistências na ordem de mega Ohm no escuro e resistência na ordem de poucas centenas quando exposto a luz.
Mãos à obra – Fazendo um sensor de luz com LDR
Fios Jumper's
Placa Arduino Uno Rev3 ou similar
Resistor 300Ohm
Agora vamos conectar os componentes do projeto. Para isso, desligue o cabo USB de seu Arduino e monte seu circuito conforme a figura a seguir.
Crie um programa (sketch) e salve com o nome de "programa_sensor_de_luz".
Com o seu programa salvo, escreva nele o código conforme escrito abaixo.
//Sensor de luz com LDR int ledPin = 7; //Led no pino 7 int ldrPin = 0; //LDR no pino analígico 8 int ldrValor = 0; //Valor lido do LDR void setup() { pinMode(ledPin,OUTPUT); //define a porta 7 como saída Serial.begin(9600); //Inicia a comunicação serial } void loop() { ///ler o valor do LDR ldrValor = analogRead(ldrPin); //O valor lido será entre 0 e 1023 //se o valor lido for maior que 500, liga o led if (ldrValor>= 800) digitalWrite(ledPin,HIGH); // senão, apaga o led else digitalWrite(ledPin,LOW); //imprime o valor lido do LDR no monitor serial Serial.println(ldrValor); delay(100); }
//Sensor de luz com LDR
int ledPin = 7; //Led no pino 7
int ldrPin = 0; //LDR no pino analígico 8
int ldrValor = 0; //Valor lido do LDR
pinMode(ledPin,OUTPUT); //define a porta 7 como saída
ldrValor = analogRead(ldrPin); //O valor lido será entre 0 e 1023
//se o valor lido for maior que 500, liga o led
if (ldrValor>= 800) digitalWrite(ledPin,HIGH);
// senão, apaga o led
//imprime o valor lido do LDR no monitor serial
Serial.println(ldrValor);
Caso tenha ocorrido tudo como esperado, ao cobrir o LDR, o LED irá acender. Abra o monitor serial para verificar o que está sendo lido na entrada A0.
Imagine que a tubulação que une os dois reservatórios tenha uma espessura menor em uma situação A que em outra em uma situação B, como na figura abaixo.
Por intuição, sabemos que, na situação A, a vazão entre os dois reservatórios será menor que na situação B.
O mesmo acontece com a corrente elétrica, existe uma propriedade chamada resistência quem tem como unidade o Ohm representado pelo símbolo grego ômega (Ω).
O nome da unidade da resistência faz homenagem a Ohm que criou as duas leis de Ohm. Uma delas diz que:
"A corrente que flui por um circuito é diretamente proporcional à tensão e inversamente proporcional à resistência."
Traduzindo, a resistência limita a corrente de forma proporcional, visto que para um tensão V fixa teremos um corrente cada vez menor para uma resistência cada vez maior.
Sabemos que energia não se perde ou se cria, ela se transforma. A energia perdida na desaceleração dos elétrons é convertida em calor.
– Divisor de tensão
Quando temos duas resistências associadas em série temos a seguinte situação:
Vin= (R1 + R2)*Ia
Se nossa tensão é fixa (Vin = 5V), temos:
Ia = 5V / (R1 + R2)
Ou seja, a corrente é o resultado da divisão da tensão 5V pela soma da resistências.
Nesse circuitos temos um efeito interessante: temos as mesma corrente para os dois resistores mas temos uma tensão diferente em cada um.
Vr1 = Ia * R1 e Vr2 = Ia * R2
Ou seja, a queda de tensão será maior no resistor maior.
Esse circuito é chamado de divisor de tensão. Como a corrente do circuito é calculada pela divisão da tensão total pela soma dos resistores, teremos a tensão em cima de um resistor igual a resistência desse resistor vezes a tensão total dividida pela soma dos resistores.
Ia = 5V / (R1 + R2) e Vr2 = Ia * R2
Vr2 = (5V / (R1 + R2)) * R2
O exemplo a seguir mostra como funciona o cálculo o para dois resistores.
Quando usamos um LDR, que é uma resistência foto-variável, podemos usar da propriedade do divisor de tensão para medir a variação da queda de tensão em cima do mesmo. Sabemos que a tensão total e a resistência total são fixas. Dessa forma, o divisor de tensão vai variar com a resistência entre A0 e GND.
Leitura do LDR
Levando em conta que quanto menos luz incidir sobre o LDR maior será sua resistência, teremos a tensão sobre o LDR e por conseguinte o valor de A0 maior com um índice de luminosidade incidente menor, isto é, num local mais escuro.
VA0 = (5V / (1K + LDR)) * LDR
Quanto menor luminosidade maior a resistência do LDR;
Quanto maior a resistência do LDR, maior a tensão em A0;
Então: quanto menor a luminosidade maior é a tensão em A0.
– Lendo da entrada analógica
A leitura da entrada analógica é feita com a função analogRead, que recebe como parâmetro o pino analógico a ser lido e retorna o valor digital que representa a tensão no pino. Como o conversor analógico-digital do Arduino possui uma resolução de 10 bits, o intervalo de tensão de referência, que no nosso caso é 5 V, será dividido em 1024 pedaços (2^10) e o valor retornado pela função será o valor discreto mais próximo da tensão no pino.
O código acima lê o valor analógico de tensão no pino A0 e guarda o valor digital na variável valorLido. Supondo que o pino está com uma tensão de 2V, o valor retornado pela conversão será:
2 x 1024 / 5 = 409,6
O resultado deve ser inteiro para que nosso conversor consiga representá-lo, logo, o valor 410 será escolhido por ser o degrau mais próximo. Esse valor representa a tensão 2,001953125, inserindo um erro de 0,001953125 em nossa medida devido à limitação de nossa resolução.
Você pode ler mais sobre sinal analógico no tutorial Entradas e Saídas Analógicas.
– Lógica do programa
Em resumo, nosso programa lerá qual é o valor do sinal em A0 com o auxílio do comando analogRead(), que retornará um valor entre 0 a 1023, e o comparará com um valor de referência que em nosso caso é 800. Tendo em vista que, quanto mais escuro, maior será o valor de A0, caso A0 seja maior que o valor de referência o programa liga o LED conectado ao pino 7. Do contrário, ele apaga o LED. O programa também imprime o valor de A0 para que possamos verificar a faixa de valores e até mesmo calibrar nosso sensor.
Tente mudar o valor de referência e veja que, quanto maior esse valor, menor será sua sensibilidade.
Crie um alarme usando um buzzer e um LDR, explicado em nosso ultimo tutorial Usando buzzer com Arduino, Quando houver pouca luz, o alarme deve disparar.
Usando 3 ou mais LED's e um LDR, faça um programa que aumente o numero de LED's acesos conforme a intensidade de luz seja menor.
Blariston
2 de setembro de 2017, 17:39
Porque as lâmpadas fotoceluas do meu prédio não apagam?
8 de setembro de 2017, 15:54
Isso é bem relativo. Pode ser que fotocélula está com problemas ou elas estejam com o sensor de luz pegando pouca luz.
Pode acontecer de a pessoa instalar a fotocélula em um ambiente com pouca luminosidade e ela sempre considerar que é noite. Outra coisa que pode acontecer é o sensor de luz estar com muita sujeira obstruindo a passagem de luminosidade.
21 de setembro de 2017, 22:44
como funciona sua resistência na situação de alta resistência (sem luz) e baixa resistência (com muita luz)?
21 de setembro de 2017, 23:15
Não sei se entendi a pergunta. De qualquer forma, como você mesmo disse, quanto maior a luz incidente no LDR, menor será sua resistência e vice-versa.
A Resistência elétrica é a capacidade de um corpo qualquer se opor à passagem de corrente elétrica.
https://pt.wikipedia.org/wiki/Resist%C3%AAncia_el%C3%A9trica
Marinaldo Abdon
25 de setembro de 2017, 09:36
Amigo, bom dia. Muito bom seu posto, mas será que você poderia ajudar com a seguinte situação: Estou usando o mesmo sketch e circuito para controlar o fechamento de um relê em vez de acender um led e assim ligar e desligar lâmpadas, mas ocorre um liga-desliga diversas vezes quando a luminosidade ambiente passa de escuro pra claro ou vice versa de forma lenta como ao estar anoitecendo ou clareando o dia. Você sabe como resolver essa situação??? Obrigado.
26 de setembro de 2017, 14:00
Marinaldo, isso é uma ótima pergunta e até rende um bom tutorial!! Esse liga e desliga ocorre no momento em que estamos perto do limiar de mudança de estado. A solução é simples.
Você precisa distanciar os valores de ligar e desligar. Você pode fazer da seguinte forma. Você escolhe o valor cujo o qual ele vai ligar. E para desligar colocar um if distante do valor de ligar. Olha o exemplo abaixo:
if (ldrValor>= 800) digitalWrite(ledPin,HIGH); se for maior que 800 liga o led
else if (ldrValor<= 600) digitalWrite(ledPin,LOW); // senão, se for menor que 600 apaga o led Veja que ele ligar quando o valor de ldr for maior que 800 e desliga só quando o valor for menor que 600. Existe uma distancia entre os valores de ligar e desligar que não permitem que o led fique piscando perto do valor de 800. Essa distancia tem que ser experimentada e calibrada para que seja adequada ao sistema a ser controlado. Senão, pode acontecer de ligar e não desligar adequadamente. Consegui ser claro?
28 de setembro de 2017, 07:13
Bom dia, Allan. Sou bem iniciante nessa parte de programar pra Arduíno ou pra qualquer outra coisa mas tenho que realizar um projeto e nele eu preciso que o sensor detecte a maior incidência de luz e comande um movimento na direção dessa maior incidência. Gostaria de saber se, na sua opinião o sistema que você fez nesse post funcionaria pra essa função.
28 de setembro de 2017, 07:14
Esse movimento no caso seria através de servo motores.
28 de setembro de 2017, 18:49
Serve sim. O ideal é você ter mais de um LDR para que você possa comparar qual o lado que está tendo maior incidência de luz e movimentar o servos nessa direção. Esse projeto é famoso, chamam ele de girassol
28 de setembro de 2017, 20:40
Vlw Allan. Vou dar uma pesquisada sobre esse projeto então. Vlw aí pelo site. Muito bom msm. Vou usar bastante os conteúdos dele
REGINALDO PIMENTA DE BARCELOS
22 de outubro de 2017, 12:48
Bom dia Allan Mota, estou precisando montar um tubo de turbidez com arduíno para controle/monitoramento de turbidez. vou precisar de uma fonte emissora de luz , um fotodetector, display , etc. A luz emitida atravessará a água contida no tubo, haverá dispersão de parte da luz, e aquele feixe de luz que atravessar a água será captada pelo fotodetector, transformada e enviada para o display;porém, não sei exatamente como montar todo esse aparato. Esse é um trabalho para conclusão de curso na área de química. Seria possível por gentileza, ajudar nesse sentido? obrigado.
3 de dezembro de 2017, 21:21
Boa noite Allan Mota, estou montando um projeto de estacionamento inteligente. Minha duvida, será que posso acionar um servo motor . Quando o carro fica em cima do LDR, o servo motor (cancela) é acionado de 0º a 90º e ao passar em outro LDR, o servo motor (cancela) é acionado de 90º a 0º . Seria possível me ajudar nesta dúvida? Obrigado e parabéns pelo site, vi uns exemplos com sensor ultrassônico e adaptador I2C.