Sensor de luz LDR no Arduino: a conta do divisor que faz a leitura mudar
Escolha o resistor fixo do divisor pela luz real do ambiente, leia o LDR no pino analógico e acenda uma carga no escuro sem piscar na fronteira.
Você liga o LDR no A0, abre o monitor serial e o número fica parado em 1015, com ou sem a mão em cima. O sensor não está queimado. O pino analógico lê tensão, e o LDR sozinho só muda de resistência. Para virar tensão, ele precisa de um parceiro: um resistor fixo formando um divisor. E o valor desse resistor decide se a sua escala útil tem 600 passos ou 30.
A resposta curta: meça o LDR com o multímetro no claro e no escuro do lugar onde ele vai trabalhar, use como resistor fixo um valor perto da média geométrica dessas duas medidas (a raiz do produto) e ligue o ponto do meio ao pino analógico. O resto do texto mostra a conta, o código com limiar e folga, e os erros que fazem o projeto falhar na primeira noite.
Por que o LDR sozinho não dá leitura
O LDR é um resistor que cai quando recebe mais luz. Ligado direto entre 5 V e o pino, o pino vê 5 V sempre, porque quase não passa corrente para dentro dele. Ligado entre o pino e o terra, vê zero. Sem um segundo resistor, não existe um ponto cuja tensão dependa da resistência.
Com o divisor, a corrente passa pelos dois resistores em série e a tensão no meio é proporcional à fração que o resistor de baixo representa no total. Na montagem 5 V, LDR, ponto do meio, resistor fixo, terra, a fórmula é:
Vout = 5 V × Rfixo / (Rfixo + Rldr)
leitura = Vout / 5 V × 1023 (Arduino Uno, referência padrão de 5 V)
Mais luz derruba o Rldr, a fração do resistor fixo cresce e a leitura sobe. Se você inverter as posições, a lógica também inverte: mais luz, leitura menor. As duas montagens funcionam. O que não funciona é não saber qual você montou.
Este guia trata da conta do divisor. Se a sua dúvida é usar o LDR para detectar gente na sala, leia antes por que o LDR mede claridade e não presença.
Como escolher o resistor fixo com números reais
O caso que vai atravessar o texto: uma luminária de corredor que deve acender quando escurece. Com o multímetro na escala de ohms, o LDR mediu cerca de 2 kΩ com a luz do fim de tarde e 40 kΩ com a mão por cima, simulando a noite. Os seus números vão ser outros. Por isso você mede.
A média geométrica é a raiz de 2 kΩ × 40 kΩ, cerca de 8,9 kΩ. O valor comercial mais próximo é 10 kΩ. Veja o que três escolhas diferentes fazem com a escala:
Rfixo = 1 kΩ
claro: 5 × 1 / (1 + 2) = 1,67 V -> leitura ~341
escuro: 5 × 1 / (1 + 40) = 0,12 V -> leitura ~25
escala útil: ~316 passos
Rfixo = 10 kΩ
claro: 5 × 10 / (10 + 2) = 4,17 V -> leitura ~852
escuro: 5 × 10 / (10 + 40) = 1,00 V -> leitura ~205
escala útil: ~647 passos
Rfixo = 100 kΩ
claro: 5 × 100 / (100 + 2) = 4,90 V -> leitura ~1003
escuro: 5 × 100 / (100 + 40) = 3,57 V -> leitura ~731
escala útil: ~272 passos
Com 10 kΩ, a distância entre claro e escuro é mais que o dobro das outras opções. Isso significa um limiar fácil de escolher e menos sensibilidade a ruído. Quando a escala inteira acontece num palmo de claridade, o próximo passo é trocar o resistor, não mexer no código.
Montagem e código com limiar e folga
- Ligue uma perna do LDR no 5 V e a outra numa linha da protoboard.
- Nessa mesma linha, ligue o resistor de 10 kΩ indo para o GND e um fio indo para o A0.
- Ligue um LED com resistor no pino 7 para representar a luminária. Se a carga real for uma lâmpada de rede, ela passa por um módulo de relé, e aí vale ler como o relé separa o Arduino da rede elétrica.
- Carregue o código abaixo, abra o monitor serial a 9600 e anote os valores no claro e no escuro reais.
- Ajuste os dois limiares com esses números e carregue de novo.
const int PINO_LDR = A0;
const int PINO_LUMINARIA = 7;
// Calibrados no corredor: ~850 no claro, ~200 no escuro.
const int LIMIAR_ACENDER = 350;
const int LIMIAR_APAGAR = 450;
bool luminariaAcesa = false;
int lerLuzMedia() {
long soma = 0;
for (int i = 0; i < 8; i++) {
soma += analogRead(PINO_LDR);
delay(2);
}
return soma / 8;
}
void setup() {
pinMode(PINO_LUMINARIA, OUTPUT);
digitalWrite(PINO_LUMINARIA, LOW);
Serial.begin(9600);
}
void loop() {
int luz = lerLuzMedia();
if (!luminariaAcesa && luz < LIMIAR_ACENDER) {
luminariaAcesa = true;
digitalWrite(PINO_LUMINARIA, HIGH);
} else if (luminariaAcesa && luz > LIMIAR_APAGAR) {
luminariaAcesa = false;
digitalWrite(PINO_LUMINARIA, LOW);
}
Serial.print("luz=");
Serial.print(luz);
Serial.print(" luminaria=");
Serial.println(luminariaAcesa ? "acesa" : "apagada");
delay(200);
}
Por que dois limiares e não um
No crepúsculo, a luz fica minutos rondando o mesmo valor. Com um limiar só, em 400, qualquer nuvem ou ruído de leitura faz a luminária acender e apagar várias vezes por segundo. Com dois limiares, ela acende abaixo de 350 e só apaga acima de 450. Essa faixa de 100 passos no meio é a histerese: dentro dela, o estado anterior se mantém.
A média de oito leituras reduz o tremor do número. Ela não substitui a histerese. A média acalma ruído rápido; a folga resolve a fronteira lenta.
A luz que você acende volta para o sensor
A luminária acende, ilumina o LDR, a leitura sobe acima de 450, ela apaga, escurece, acende de novo. É um oscilador que você construiu sem querer. A solução é física: aponte o LDR para a janela ou para o céu, longe do facho da lâmpada que ele controla, ou coloque o sensor num tubinho escuro que só enxerga a direção da luz natural.
Se não der para afastar, aumente a folga entre os limiares até que a luz da própria lâmpada não baste para cruzar o de apagar. Teste à noite, com a lâmpada acesa, e anote quanto ela soma na leitura.
O LDR também reage devagar, principalmente ao sair do escuro para o claro. Para luminária isso é qualidade. Para detectar um flash ou contar pulsos rápidos de luz, ele é o componente errado; um fotodiodo ou fototransistor responde muito mais rápido.
Erros comuns
- Ligar o LDR sem resistor fixo: a leitura fica grudada perto de 0 ou de 1023 e parece sensor queimado.
- Copiar o 10 kΩ do tutorial sem medir o seu LDR: se o seu ambiente é bem mais escuro ou mais claro, a escala útil encolhe e o limiar vira chute.
- Usar um limiar único: a carga pisca na fronteira do anoitecer e, se for relé, desgasta o contato.
- Deixar o sensor ver a própria lâmpada: o sistema oscila sozinho e você procura o defeito no código.
- Calibrar na bancada e instalar no corredor: a luz da mesa não é a do lugar real, e os limiares deixam de fazer sentido.
- Não saber qual lado do divisor é o LDR: a lógica de comparação fica invertida e a luz acende de dia.
Checklist
- Mediu a resistência do LDR no claro e no escuro do local de uso.
- Escolheu o resistor fixo perto da raiz do produto dessas duas medidas.
- Confirmou no monitor serial uma diferença de centenas de passos entre claro e escuro.
- Sabe se mais luz faz a leitura subir ou descer na sua montagem.
- Usa dois limiares, com folga entre eles, em vez de um só.
- O sensor não enxerga a luz que ele controla.
- Testou de noite, no lugar definitivo, com a carga acesa.
Abra o monitor serial agora e anote dois números: a leitura com a luz normal do ambiente e com a mão por cima. Qual é a distância entre eles? Se for menor que uns 200 passos, troque o resistor fixo antes de escrever mais uma linha de código.
Referência: http://www.comofazerascoisas.com.br/projeto-arduino-como-usar-o-sensor-de-luz-ldr.html