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
- 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.
- Instale o sensor na posição final, já dentro da caixa que vai usar, apontado para longe da lâmpada que ele comanda.
- Carregue um sketch que imprime a leitura a cada minuto com o tempo desde a energização.
- 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.
- Marque o valor no momento em que você mesmo acenderia a luz. Esse é o limiar de ligar.
- Escolha um limiar de desligar um pouco acima dele. A distância entre os dois é a histerese.
- 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?
Referência: http://www.comofazerascoisas.com.br/projeto-arduino-sensor-de-luz-ldr-com-leds.html