28 setembro 2013

Controle de luz utilizando LDR

Algumas pessoas me escreveram perguntando sobre sensores de luz, e como poderia ser montado um dispositivo que acendesse uma lâmpada ao escurecer.

Esse é um circuito bem simples de montar, e que utiliza pouquíssimos componentes, entre eles, um componente barato e fácil de encontrar : o LDR (Light Dependent Resistor, ou Resistor Dependente de Luz), componente disponível no Kit Arduino Iniciante da loja FILIPEFLOP.


Arduino LDR

O LDR, como o próprio nome diz, é um resistor cuja resistência varia em função da luminosidade que incide sobre ele, devido ao material fotossensível que cobre o componente.

Ao iluminarmos um LDR, a sua resistência apresenta valores muito baixos. Ao cortarmos a iluminação, a resistência sobe. Observe isso na prática, nas fotos abaixo, onde eu aplico luz ao LDR (imagem da esquerda), e a resistência medida é baixa, e na imagem da direita, cubro parcialmente o LDR e ocorre o aumento da resistência :

Comparativo resistência LDR

Conhecendo os princípios básicos do componente, podemos montar um circuito onde, com incidência de luz, o led se apaga, e ao cobrirmos o LDR, o led se acende :

Circuito LDR Led - Arduino Uno
O programa para este circuito lê o valor da porta analógica (que deve estar na faixa de 0 a 1024), verificando se o valor é maior do que 800 (LDR encoberto) e consequentemente acendendo o led. Usei no meu circuito um resistor de 330 ohms para o led e de 10K para o LDR. Caso o seu circuito não funcione adequadamente, ajuste esses valores :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Programa : LDR - Sensor de Iluminação  
// Autor : Arduino e Cia  
   
int portaLed = 10; //Porta a ser utilizada para ligar o led  
int portaLDR = A5; //Porta analógica utilizada pelo LDR  
  
void setup()  
{  
  pinMode(portaLed, OUTPUT); //Define a porta do Led como saída  
}  
   
void loop()  
{  
  int estado = analogRead(portaLDR);  //Lê o valor fornecido pelo LDR  
    
  // Caso o valor lido na porta analógica seja maior do que 
  // 800, acende o LED  
  // Ajuste o valor abaixo de acordo com o seu circuito  
  if (estado > 800)    
  {  
    digitalWrite(portaLed, HIGH);  
  }  
  else  //Caso contrário, apaga o led  
  {  
    digitalWrite(portaLed, LOW);  
  }  
}  

E você lembra deste post sobre dimmer usando potenciômetro ? Pois bem, podemos utilizar o mesmo circuito, trocando o potenciometro pelo LDR, e obtendo o mesmo efeito, sem mexer no programa :

Circuito LDR Dimmer - Arduino Uno


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Projeto : Controle de luminosidade de led com LDR  
// Autor : Arduino e Cia  
   
int pinoled = 10; //Pino ligado ao anodo do led  
int pinopot = 5;  //Pino ligado ao LDR  
int valorpot = 0; //Armazena valor lido do LDR, entre 0 e 1023  
float luminosidade = 0; //Valor de luminosidade do led  
   
void setup()  
{  
  Serial.begin(9600);    //Inicializa a serial  
  pinMode(pinoled, OUTPUT); //Define o pino do led como saída  
  pinMode(pinopot, INPUT);  //Define o pino do LDR como entrada  
}  
   
void loop()  
{  
  // Le o valor - analogico - do LDR  
  valorpot = analogRead(pinopot);  

  // Converte o valor lido do LDR
  luminosidade = map(valorpot, 0, 1023, 0, 255); 
  Serial.print("Valor lido do LDR : ");   

  // Mostra o valor lido do LDR no monitor serial  
  Serial.print(valorpot);  
  Serial.print(" = Luminosidade : ");  

  // Mostra o valor da luminosidade no monitor serial  
  Serial.println(luminosidade); 
  
  // Acende o led com luminosidade variável
  analogWrite(pinoled, luminosidade); 
 }  

Se necessário, ajuste os valores das resistências do led e do LDR, como no circuito anterior, e tenha agora um dimmer regulado por luz (ou pela falta dela).

35 comentários:

  1. Nao funciona, qualidade pessima, com sensibilidade minima! Nao façam

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Todos os circuitos apresentados aqui no Arduino e Cia foram testados exatamente do jeito que foram publicados. Erros podem aparecer dependendo do material utilizado, diferença em especificações, etc.

      Lembramos que os circuitos são muito utilizados para conhecimentos de componentes do Arduino e fins didáticos.

      Abraço e obrigado pela sua contribuição !

      Excluir
    2. Tem como implementar um sensor pir para detectar presença e um controle ir para ligar e desligar o led tambem

      Excluir
    3. Bom dia,

      Tem sim, você pode juntar as informações sobre esse artigo do sensor de presença :

      http://www.arduinoecia.com.br/2014/06/sensor-presenca-modulo-pir-dyp-me003.html

      E esse que eu utilizo um sensor IR TCRT5000 :

      http://www.arduinoecia.com.br/2013/10/sensor-optico-reflexivo-tcrt5000.html

      Abraço !

      Excluir
    4. montei como apresentado aqui e funcionou muito bem. legal

      Excluir
    5. Montei, funcionou legal!!! todos os projetos com Arduíno requerem conhecimento básico em eletrônica, porém para aplicações específicas com precisão e sensibilidade o conhecimentos de sistemas de controle é fundamental.

      Excluir
  2. Gostaria de saber se alguem tem esquema de algum circuito com ldr que possa ler a turbides da agua, ou seja, se ela estiver suja não aciona uma bomba por exemplo e se tiver limpa sim,aciona a bomba.
    grato.

    ResponderExcluir
    Respostas
    1. Boa tarde Marcelo,

      Interessante esse projeto. Não tenho nada pronto com relação à isso, mas eu acho que nesse caso você poderia construir alguma solução com um ldr no fundo do tanque/caixa, e uma luz direcionada (sugiro um módulo laser) para verificar se a água está suja ou não.

      Essa solução depende de vários testes e ajustes, mas a idéia do laser pode ser um ponto de partida.

      Abraço !

      Excluir
  3. Boa tarde amigos,

    Desculpe duplicar o post, mas o anterior não ficou adequado. na verdade, gostaria de saber se tem como controlar a rotação de um ventilador AC 127V para uma faixa de luminosidades lidas de um LDR e não um liga/desliga como o descrito neste tópico (http://blog.filipeflop.com/modulos/controle-modulo-rele-arduino.html#comment-14520). Trata-se da aplicação do Arduino como PID, para adequar o comportamento de acordo com a variação do Set-point.

    Desde já grato pela atenção e parabéns pelo site!

    ResponderExcluir
  4. Quais os ajustes devo fazer nesse circuito para controlar o brilho de uma lâmpada de 24V por exemplo? O LDR varia gradativamente a sua resistência de acordo com a luminosidade? Quero transformar essa variação gradativa numa variação proporcional na lâmpada.

    ResponderExcluir
    Respostas
    1. Boa tarde Pedro,

      Exato, esse é o princípio do LDR, variar a resistência de acordo com a luminosidade. Dependendo do tipo de lâmpada que vc for utilizar, vai precisar de um circuito auxiliar.

      Abraço !

      Excluir
  5. Olá, estou com uma duvida, gostaria de por varios LEDs tentei por ' int Led = 8; 9; 10; ' e ' int Led = 8, 9, 10; ' mas nada disso funcionou,

    Agradeco desde ja.

    ResponderExcluir
    Respostas
    1. Oi Victor,

      Coloque assim:

      int led1 = 8;
      int led2 = 9;
      int led3 =10;

      E assim por diante.

      Abraço!

      Excluir
  6. Ola amigo bom dia, sou curioso em eletronica e a pouco tempo começei a adquirir algumas placas e sensores Arduino.
    Gostaria de saber se é possivel me ajudar estou querendo fazer um circuito que possa estar controlando um refletor de led que tenho aqui no meu quintal, a idéia é o seguinte:
    Tenho uma pequena placa Solar que carrega uma bateria e me fornece 12V ok, o que pretendo fazer é um circuito usando um LDR para ligar o circuito ao escurecer e assim que ligar uma saida PWM do Arduino no valor maximo e depois de algum tempo ele diminua os pulsos pela metade e depois de mais um certo tempo ele desliga, fazendo assim eu ter um melhor aproveitamento da carga da bateria. Se puder me ajudar ou indicar alguma coisa neste sentido que possa estar usando ficarei muito Grato. Obrigado
    Abraço HENRIQUE

    ResponderExcluir
    Respostas
    1. Bom dia,

      Você pode utilizar essa mesma solução do "dimmer", só precisa ver como integrar isso ao refletor de led que vc tem.

      Abraço!

      Excluir
  7. Boa noite! Belo tutorial! Como eu consigo achar a função transferência deste modelo? Obrigado!

    ResponderExcluir
    Respostas
    1. Bom dia,

      Não entendi a pergunta, o que é função transferência ? :/

      Abraço!

      Excluir
  8. Boa noite amigo, esse primeiro esquema junto a um relé srd 5v, no caso pra acionar lampadas de 127, daria certo?

    ResponderExcluir
  9. Olá, o valor da luminosidade é em que unidade?

    ResponderExcluir
    Respostas
    1. Boa tarde,

      O LDR apenas varia a resistência de acordo com a luz, creio que com ele você não vai ter muita precisão em valores de luminosidade. Para esse tipo de medição, utiliza um sensor de luz como esse:

      http://www.filipeflop.com/pd-152bd1-sensor-de-luz-tsl2561-lux-luminosidade.html

      Abraço!

      Excluir
  10. Saudações,

    gostaria de fazer um disparador de câmera DSLR, para captar raios. A ideia é colocar um LDR na ocular do obturador da câmera, e quando houver um clarão do raio, o arduino dispare o clique. Pôrem estou em duvida se um LDR é a melhor opção de sensor para essa aplicação.

    Abraços

    ResponderExcluir
    Respostas
    1. Bom dia,

      Acho que vai depender da intensidade do raio, e o local onde você vai colocar a câmera. talvez se você "direcionar" o LDR para o céu, utilizando um tubo, ajude. Não entendo muito dessa parte de fotografia, mas é uma ideia.

      Existe também esse sensor de luz aqui, que eu pretendo fazer um post em breve. É mais preciso que um LDR:

      http://www.filipeflop.com/pd-152bd1-sensor-de-luz-tsl2561-lux-luminosidade.html

      Se puder depois me falar qual solução funcionou pra vc, seria legal para compartilhar com os outros leitores do blog. :)

      Abraço!

      Excluir
  11. Bom dia, gostaria de saber como poderia fazer um carrinho seguidor de linha preta

    ResponderExcluir
  12. Boa noite, estou com um problema na programação. Não sei como comparar duas variáveis "char".Eu tentei comparar assim:
    Considerando que as variáveis letra e resposta sejam char.
    if(letra == resposta){
    resultado++;
    }
    Mas n dá certo, msm q as variáveis sejam diferentes o contador aumenta.

    ResponderExcluir
  13. Boa noite.Parabéns pelo post,me ajudou muito.Obrigado

    ResponderExcluir
  14. Olá. Boa tarde. Será que pode me dar uma dica? Estou tentando montar um circuito simples com o LDR e arduino com a finalidade apenas de determinar o horário da aurora e do ocaso, ou seja quando o Sol nasceu e quando se pôs. Para tanto estou registrando os valores de tensão obtidos a partir do fotoresistor. Aqui é que está o problema. Meu código só tem dado dois valores de tensão (mínima e máxima) 0,16V e 5,00V, ou seja é tudo ou nada, parece não haver para ele valores intermediários de iluminação. Será que você teria uma dica que eu pudesse testar? (obs.: estou usando o módulo pronto do LDR que vem com o potenciômetro exatamente o deste endereço http://www.filipeflop.com/pd-10fd75-sensor-de-luz-ldr.html?ct=41d97&p=3&s=1, o arduino é o mega 2560 e tudo rodando no Linux Ubuntu). O código que estou usando é bem simples. Segue abaixo o código. Desde já agradeço. Att, Luiz.

    const int analogInPin = A0; // Analog input pin that the potentiometer is attached to
    float sensorValue = 0.000; // value read from the pot

    void setup() {
    // initialize serial communications at 9600 bps:
    Serial.begin(9600);
    }

    void loop() {
    // read the analog in value:
    sensorValue = analogRead(analogInPin)*0.0048875;

    // print the results to the serial monitor:
    Serial.print("Tensao = " );
    Serial.println(sensorValue,2);

    delay(1000);
    }

    ResponderExcluir
  15. Quero ligar esse LDR num raspberry, o esquema seria o mesmo, apenas mudando a porta A5 por uma GPIO? E sobre a entrada, posso usar uma de 3.3v ou é necessário 5v para usar o LDR?

    ResponderExcluir
    Respostas
    1. Boa noite Caio,

      Você vai precisar de um conversor analógico digital.. o RPi não tem porta analógica...

      Dê uma olhada nesse artigo aqui, por favor: https://learn.adafruit.com/raspberry-pi-analog-to-digital-converters/overview

      Abraço!

      Excluir
  16. Bom dia, queria saber se da para aumentar o brilho do LED gradativamente conforme fica mais escuro utilizando o LDR como sensor de brilho.
    Se for possível, posso fazer isso como?

    ResponderExcluir
    Respostas
    1. Oi Lucas,

      Dê uma olhada nesse artigo aqui, que usa o potenciômetro.. Troque o potenciômetro pelo LDR e faça um teste.. talvez precisa de alguns ajustes na faixa de leitura, mas o principio de funcionamento é o mesmo.

      http://www.arduinoecia.com.br/2013/07/dimmer-usando-portas-analogicas-para.html

      Abraço!

      Excluir
    2. Obg pela atenção, vou dar uma olhada, enooois

      Excluir
  17. Boa noite.
    Por favor, estou precisando de uma orientação para controlar a velocidade de um servo motor. É um sensor de luminosidade, e está funcionando corretamente, em 3 ângulos. Apenas quero que ele se desloque mais lentamente de um angulo a outro.
    O código é o seguinte:
    #include
    int pinS1dir = 1; // Entrada analogica A1
    float S1dir = 0; // Recebe o valor do sensor da direita
    int pinS2esq = 0; // Entrada analogica A0
    float S2esq = 0; // Recebe o valor do sensor da esquerda
    Servo motor;
    int pos = 0;

    void setup()
    {
    motor.attach(9);
    motor.write(pos);
    }

    void loop()
    {
    S1dir = analogRead(pinS1dir); // Le valores de 0 a 1023
    S2esq = analogRead(pinS2esq); // Le valores de 0 a 1023

    if(S2esq*0.80 >= S1dir)
    {
    pos = 0;
    }
    else if(S1dir*0.80 >= S2esq)
    {
    pos = 110;
    }
    else
    {
    pos = 55;
    }
    motor.write(pos);
    delay(5000);
    }

    Muito Obrigado

    ResponderExcluir
  18. Ola meu amigo fez com arduino um sistema de liga e deliga luz pelo computador agora ta passando pro celular so que tem uma linha de comando que um amigo dele passou e ele não me passa vcs tem essa linha de comando feito para me arrumar

    ResponderExcluir