Eletrônica Por Equipe DevBras

Capa do artigo: LDR no Arduino: calibre no lugar de uso e pare de confundir luz com presença

LDR no Arduino: calibre no lugar de uso e pare de confundir luz com presença

Como registrar os valores reais do LDR no cômodo, escolher limiares com histerese, filtrar sombras passageiras e saber quando o problema pede um sensor de presença.

Na bancada, você cobre o LDR com o dedo e a luz do corredor acende. Instalado no corredor de verdade, o sistema liga e desliga sem parar ao anoitecer, e às 22h a lâmpada do teto ilumina o próprio sensor, que conclui que é dia e apaga tudo. O circuito está certo. A resposta curta: o LDR mede claridade no ponto onde está, e nada mais. Registre os valores no lugar de uso, escolha dois limiares (um para ligar, outro para desligar), filtre variações rápidas e não use o LDR para detectar gente.

O exemplo deste guia é exatamente esse: uma luz de corredor que deve acender quando escurece, com um Arduino Uno, um LDR e um resistor de 10 kΩ.

Por que o número do tutorial não serve na sua casa

O LDR é um resistor cuja resistência cai quando recebe mais luz. Ligado num divisor de tensão com um resistor fixo, ele transforma claridade numa tensão que a entrada analógica lê como um número de 0 a 1023 no Uno. A conta desse divisor e a escolha do resistor estão no guia sobre sensor de luz LDR; aqui o ponto é outro.

Esse número depende de muita coisa além do "está escuro ou não": a posição do sensor, a cor da parede, a caixa em volta dele, a lâmpada do vizinho, a janela, o próprio LDR (duas unidades do mesmo lote dão leituras diferentes) e a resposta lenta dele a mudanças. Um limiar de 500 copiado da internet foi escolhido no quarto de outra pessoa, com outro LDR e outro resistor. O único limiar que vale é o medido no lugar onde o sensor vai ficar.

E tem a armadilha do corredor: se a lâmpada que você liga ilumina o sensor, o sistema cria um ciclo. Escurece, a luz acende, o sensor vê claridade, a luz apaga, escurece de novo. O resultado é uma lâmpada piscando a noite inteira.

Como calibrar no cômodo real

  1. Monte o divisor com o LDR entre 5 V e A0 e o resistor de 10 kΩ entre A0 e GND. Assim, mais luz dá número maior.
  2. Instale o sensor na posição final, já dentro da caixa que vai usar, apontado para longe da lâmpada que ele comanda.
  3. Carregue um sketch que imprime a leitura a cada minuto com o tempo desde a energização.
  4. Deixe rodando do fim da tarde até a noite, com as luzes do jeito que ficam no dia a dia, e salve a saída do Monitor Serial.
  5. Marque o valor no momento em que você mesmo acenderia a luz. Esse é o limiar de ligar.
  6. Escolha um limiar de desligar um pouco acima dele. A distância entre os dois é a histerese.
  7. Acenda a lâmpada comandada e veja quanto a leitura sobe. Se passar do limiar de desligar, mude o sensor de lugar antes de mexer no código.
const uint8_t PINO_LDR = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  unsigned long minutos = millis() / 60000UL;
  int leitura = analogRead(PINO_LDR);
  Serial.print(minutos);
  Serial.print(" min, LDR = ");
  Serial.println(leitura);
  delay(60000UL);
}

Uma saída fictícia de fim de tarde fica assim: 640 às 17h, 410 às 18h, 220 às 18h30, 90 às 19h. Se você acenderia a luz por volta de 18h30, o limiar de ligar fica perto de 220, e o de desligar, perto de 300.

Como escrever a lógica com histerese e filtro

Dois limiares resolvem a oscilação na fronteira. Uma média móvel e um tempo mínimo de confirmação resolvem a nuvem que passa, o farol do carro na janela e a pessoa que faz sombra no sensor.

const uint8_t PINO_LDR = A0;
const uint8_t PINO_LUZ = 8;

const int LIGAR_ABAIXO = 220;
const int DESLIGAR_ACIMA = 300;
const unsigned long CONFIRMACAO_MS = 60000UL;
const unsigned long INTERVALO_LEITURA_MS = 500;

float media = 0;
bool luzLigada = false;
unsigned long candidatoDesde = 0;
bool temCandidato = false;
unsigned long ultimaLeitura = 0;

void setup() {
  pinMode(PINO_LUZ, OUTPUT);
  digitalWrite(PINO_LUZ, LOW);
  media = analogRead(PINO_LDR);
  Serial.begin(9600);
}

void loop() {
  unsigned long agora = millis();
  if (agora - ultimaLeitura < INTERVALO_LEITURA_MS) return;
  ultimaLeitura = agora;

  media = media * 0.9 + analogRead(PINO_LDR) * 0.1;

  bool querMudar = (!luzLigada && media < LIGAR_ABAIXO) ||
                   (luzLigada && media > DESLIGAR_ACIMA);

  if (!querMudar) {
    temCandidato = false;
    return;
  }

  if (!temCandidato) {
    temCandidato = true;
    candidatoDesde = agora;
  } else if (agora - candidatoDesde >= CONFIRMACAO_MS) {
    luzLigada = !luzLigada;
    digitalWrite(PINO_LUZ, luzLigada ? HIGH : LOW);
    temCandidato = false;
    Serial.print("Luz ");
    Serial.print(luzLigada ? "ligada" : "desligada");
    Serial.print(", media = ");
    Serial.println(media);
  }
}

A média exponencial dá peso de 10% a cada leitura nova, o que suaviza picos curtos. A confirmação de um minuto exige que a condição se mantenha antes de mudar o estado; se a média voltar para o lado de cá no meio do caminho, o relógio zera. Se o pino 8 comandar uma lâmpada da tomada em vez de um LED, a parte elétrica segue o guia de relé no Arduino e a rede elétrica.

Quando o problema é presença, não luz

A pergunta "tem alguém no corredor?" não é sobre claridade. Uma pessoa entrando no escuro não muda a leitura do LDR; uma nuvem muda. Usar o LDR como alarme de intruso gera alarme falso ao entardecer e silêncio quando alguém entra com a luz apagada.

Para movimento, o sensor comum é o PIR, que detecta variação de radiação infravermelha de corpos quentes se movendo no campo de visão dele. Ele não detecta uma pessoa parada por muito tempo; para isso existem sensores de presença por radar. A combinação usual no corredor é: o LDR diz se está escuro o suficiente, e o PIR diz se alguém passou. A luz só acende quando as duas condições são verdadeiras, e apaga depois de um tempo sem movimento.

Erros comuns

  • Copiar o limiar de um tutorial: com outro LDR, outro resistor e outro cômodo, a luz acende de dia ou nunca acende.
  • Usar um limiar só: perto da fronteira, ruído e variações pequenas fazem a carga ligar e desligar várias vezes por minuto.
  • Deixar o sensor ver a lâmpada que comanda: o sistema entra em ciclo e pisca a noite inteira.
  • Calibrar na bancada e instalar dentro de uma caixa: a caixa faz sombra e desloca todas as leituras.
  • Reagir a cada leitura crua: uma sombra ou um farol muda o estado na hora.
  • Usar LDR como detector de pessoa: alarme falso com nuvem e nenhum alarme com alguém no escuro.

Checklist

  • O sentido do divisor está anotado: mais luz dá número maior ou menor.
  • Os valores foram registrados no lugar final, dentro da caixa final.
  • Há dois limiares, um para ligar e outro para desligar.
  • A leitura passa por média e por um tempo mínimo de confirmação.
  • A lâmpada comandada acesa não faz a leitura passar do limiar de desligar.
  • Se a pergunta é presença, existe um sensor de movimento ou de presença no projeto.

Abra o código do seu projeto com LDR e procure o limiar: você sabe em que cômodo, em que horário e com que luz acesa aquele número foi medido?

Avalie este artigo

Referência: http://www.comofazerascoisas.com.br/projeto-arduino-sensor-de-luz-ldr-com-leds.html