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.
Relembrar é viver
Quem nunca se perguntou como as lâmpadas 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.
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.
LDR
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.
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
Componentes necessários:
- LDR – Sensor de Luz
- Fios Jumper’s
- Protoboard
- Arduino Uno Rev3 ou similar
- LED
- Resistor 300Ohm
- Resistor 10kOhm
Montando o projeto
Agora vamos conectar os componentes do projeto na protoboard. Para isso, desligue o cabo USB de seu Arduino e monte seu circuito conforme a figura a seguir.
Veja como ficou o nosso:
Conectando o Arduino ao computador
Conecte seu Arduino ao computador e abra a IDE Arduino.
Antes de carregar um programa, você precisa selecionar qual porta você deseja usar para fazer carregar o programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.
Você também precisa garantir que o tipo de placa apropriado está selecionado em Ferramentas(Tools) no submenu Placa (Board).
Programando
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); }
Após escrever o código, clique em Carregar (Upload) para que o programa seja transferido para seu Arduino.
Colocando para funcionar
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.
Entendendo a fundo
Entendendo o Hardware
– Resistência
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.
V = R * I
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.
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.
Entendendo o Software
– 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.
ldrValor = analogRead(ldrPin); //O valor lido será entre 0 e 1023
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.
Desafios
- 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.
Fechamento
Esperamos que tenham gostado, deixe seu comentário com duvidas, sugestões ou com a foto ou vídeo de seu projeto!! Compartilhe à vontade.
Engenheiro Eletricista pela UFES, Técnico em Automação industrial pelo IFES, MBA Gestão de Projetos pela USP e Fundador do Vida de Silício. Sonhador com uma única pretensão, fazer a diferença.
29 Comments
Deixe uma pergunta, sugestão ou elogio! Estamos ansiosos para ter ouvir!Cancelar resposta
Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.
Gostaria de saber como montar esse mesmo sistemas, mas com 2 Leds, um vermelho que fique aceso quando tiver luminosidade, e um verde que acenda quando não tiver mais luz, no caso, o Ldr será tampado por algo.
Muito Bom mesmo tudo correu direitinho!
Teria como “deslocar o zero” ex.ligar o led acima E abaixo de uma determinada intensidade de luz
no meu não funcionou, deu erro na linha do void loop e setup. Erro de definição.
Considerei o tutorial ótimo. Por falta de componentes troquei os resistores por outros de 440 ohms. O circuito não funcionou. Substitui na linha 15 o valor de ldrValor para 900 e então tudo funcionou a contento. Como meus conhecimentos de eletrônica são muito pobres, minha pergunta é: pq você colocou resistores de 300 ohms e 10 kohms?
Considerei o tutorial ótimo. Por falta de componentes troquei os resistores por outros de 440 ohms. O circuito não funcionou. Substitui na linha 15 o valor de ldrValor para 900 e então tudo funcionou a contento. Como meus conhecimentos de eletrônica é muito pobre, minha pergunta é: pq você colocou resistores de 300 ohms e 10 kohms?
Pequena correção: o comentário da linha 4: trocar de
“LDR no pino analígico 8” para
“LDR no pino analógico 0”
Abraço!
Olá, estou usando o arduino pela primeira vez. O meu é nano e estou trabalhando com o módulo do LDR, porém não consigo ler as informações no monitor serial, fica em branco, já tentei em computadores diferentes, reinstalei o arduino e drivers, mas nem os programas exemplo não mostram nada no monitor, poderia me ajudar? Obrigada
ola Amigo , um projeto como esse para acendimento inteligente de lâmpadas com arduino custaria em média quanto se fossemos oferecer n o mercado?
Boa noite,
No caso do tutorial, fiz a montagem e tenho uma dúvida. Verifiquei a leitura no serial e o ldr não é continuo. Exemplo, leio 399, 400,399,401,… Isto faz com que o sistema ligue e desligue algumas vezes quando está a atingir o valor definido. Como posso resolver. Tipo aos 400 liga e não desliga mais até chegar aos 600. O loop assim não garante um estado único. Como posso fazer o código? Obrigado.
Vc sabe (+/-) a corrente do sensor de Luz LDR (Light Dependent Resistor) (placa) O Sensor de Luz LDR (Light Dependent Resistor) foi feito para detectar luz e possui uma saída digital e analógica, que podem ser conectadas diretamente em um microcontrolador como o Arduino.
Quando a intensidade de luz está abaixo do valor ajustado, a saída do sensor fica em estado alto, e quando a intensidade de luz ultrapassa a faixa, a saída fica em estado baixo. Este valor pode ser ajustado através do potenciômetro presente no sensor que regulará a saída digital D0. Você também pode obter informações sobre a variação de luz no sensor utilizando a saída analógica A0 do módulo.
Especificações:
– Tensão de Operação: 3-5V
– Sensibilidade ajustável via potenciômetro
– Saídas Digital e Analógica
– Fácil instalação
– Led indicador para tensão
– Led indicador para saída digital
– Comparador LM393
– Dimensões: 30 x 13mm
Pinagem:
– VCC: 3-5V
– GND: GND
– D0: Saída Digital
– A0: Saída Analógica
Eu preciso saber a corrente, para que eu possa determinar a fonte que eu vou utilizar (12VDC / 5VDC).
Tentei fazer um dispositivo para o cálculo da velocidade instantânea de um carro utilizando 2 LDRs e 2 lasers 4,5 V. A intenção é posicionar o LDR e o Laser um em frente do outro, mantendo o laser sempre ligado. Sendo assim, ao interromper o feixe de luz do primeiro par de laser-ldr, inicia-se a contagem do tempo no arduino, com o timer 1. Ao interromper o feixe de luz do par de laser-ldr à frente, com uma certa distância do outro par, para-se a contagem do tempo e calcula-se a velocidade instantânea do veículo. Porém, não sei o porquê, mas o dispositivo não funciona. Você sabe me dizer se os ldrs não conseguem captar bem variações luminosas em curtos espaços de tempo? Não acredito que o problema seja no código.
Olá, preciso fazer a conversão da tensão lida do LDR para Joules. Qual é a relação entre um e outro?
Gostei muito do tutorial! Encontrei vários exemplos na internet mas nenhum foi tão a fundo como esse é gostei bastante. A parte da programação eu tenho mais facilidade para entender, mas a parte da eletrônica me pega um pouco. Eu vi alguns tutoriais que não usam dois resistores e fazem a leitura direta do LDR. Eu estou usando um resistor de 10k e minha pergunta é a seguinte: eu tenho um arduino com um LDR que fica numa área externa da minha casa, uso ele para monitorar algumas informações como: luminosidade, temperatura e humidade, o problema que eu estou enfrentando é que na área externa o valor que está sendo lido chega muito cedo em 1023, às 9 da manhã ele já atinge esse valor e só baixa por volta das 17h. Eu não sei o que poderia fazer para corrigir essa questão, eu sei que tem alguns micro controladores que tem um resolução maior 10^12. Mas não sei se essa seria a única saída. Um outra questão importante é que tenho outros sensores desses espalhados pela casa e seria interessante manter todos na mesma escala para poder comparar. Não sei se consegui ser claro, mas se você puder ajudar eu seria muito grato.
Boa noite, estava pesquisando na internet algo que poderia me ajudar com um projeto que tenho em mente, um projeto de criar um dispositivo que pode salvar vidas. Pretendo patentear pois fiz umas pesquisas e não encontrei nada relacionado, portanto supostamente seria uma ideia minha. Sei que o processo será longo, mas quero dar o primeiro passo, para começar precisaria de uns dispositivo parcialmente igual ao seu, a diferença é que preciso que ele corte um circuito ( no caso ao invés de ascender uma luz, preciso que ele apague) ao detectar uma certa quantidade de luminosidade. Teria possibilidade de desenvolver através do seu material?
OBS: não entendo nada de programação, arduino e essas coisas, sou técnico em informática mas não faço jus ao meu certificado kkk, tenho apenas a ideia em mente e uma vontade imensa de desenvolve-la, por isso preciso da sua ajuda e ficaria muito feliz se pudesse tirar um tempo para me ajudar.
Peço que me responda no meu e-mail: [email protected]
Abraço.
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.
Marcio, fiquei na dúvida a respeito do que você precisa saber. Poderia esclarecer?
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.
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
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.
Esse movimento no caso seria através de servo motores.
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
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.
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?
como funciona sua resistência na situação de alta resistência (sem luz) e baixa resistência (com muita luz)?
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
Porque as lâmpadas fotoceluas do meu prédio não apagam?
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.
Me ensina a programar!!!