O que é o sensor de luz LDR? Medindo luz com Arduino e uma luz noturna automática
Como funciona um LDR (fotorresistor)? Ligação com divisor de tensão, escolha do resistor certo, leitura da luz com analogRead, luz noturna com histerese, módulos LDR, uso no ESP32 e no Pico e erros comuns.
Um LDR (Light Dependent Resistor, resistor dependente de luz) é, como o nome diz, um resistor cuja resistência muda com a luz; ele também é chamado de fotorresistor ou fotocélula. No escuro, a resistência dele é muito alta e, conforme a luz aumenta, a resistência cai. Postes que acendem ao anoitecer, luzes noturnas automáticas e brinquedos ativados por luz funcionam com essa peça simples. Ele é barato, não tem polaridade e é ligado no Arduino com um resistor, o que faz dele um começo ideal para o seu primeiro projeto com luz.

Como funciona um LDR?
O desenho em zigue-zague na superfície do LDR é um semicondutor sensível à luz, o sulfeto de cádmio (CdS). Quando a luz incide sobre ele, os fótons liberam elétrons no material, ele conduz melhor e a resistência cai. A mudança não é linear e é relativamente lenta (dezenas de milissegundos). Por isso o LDR é ideal para decisões como "está escuro ou claro?" e para níveis aproximados de luz, e não para medir a luz com precisão em lux.
| Condição | Resistência aproximada do LDR (GL5528) |
|---|---|
| Escuridão total | 1 MΩ ou mais |
| Brilho de luz noturna (~1 lux) | 50–100 kΩ |
| Cômodo com pouca luz (~10 lux) | 10–20 kΩ |
| Cômodo bem iluminado (~100 lux) | 3–5 kΩ |
| Embaixo de uma luminária de mesa (~1000 lux) | Cerca de 1 kΩ |
| Luz do dia | Algumas centenas de Ω |
Os valores variam conforme o modelo. O mais comum nos kits é o GL5528; irmãos como o GL5516, o GL5537 e o GL5539 têm resistências diferentes sob a mesma luz. Você descobre facilmente os valores do seu LDR medindo-o com um multímetro no escuro e no claro.
Ligação no Arduino: um divisor de tensão
O Arduino mede tensão, e não resistência. Por isso o LDR é ligado junto com um resistor fixo para formar um divisor de tensão: 5V → LDR → A0 → 10 kΩ → GND. Conforme a luz aumenta, a resistência do LDR cai e a tensão no A0 sobe. A tensão no A0 é dada por V = 5 × Rfixo / (RLDR + Rfixo), e analogRead() a transforma em um número de 0 a 1023. Para testar valores diferentes de resistor, use a calculadora de divisor de tensão.
| Luz | Resistência do LDR | Tensão no A0 | analogRead |
|---|---|---|---|
| Escuridão total | 1 MΩ | 0,05 V | ~10 |
| Cômodo com pouca luz | 15 kΩ | 2,0 V | ~410 |
| Cômodo bem iluminado | 4 kΩ | 3,6 V | ~730 |
| Embaixo de uma luminária de mesa | 1 kΩ | 4,5 V | ~930 |
Lendo o nível de luz com o Arduino
1const int LDR_PIN = A0;
2
3void setup() {
4 Serial.begin(9600);
5}
6
7void loop() {
8 int raw = analogRead(LDR_PIN); // 0 (karanlık) – 1023 (aydınlık) / dark – bright
9 int percent = map(raw, 0, 1023, 0, 100); // yüzde / percent
10 Serial.print("Ham / raw: ");
11 Serial.print(raw);
12 Serial.print(" Işık / light: %");
13 Serial.println(percent);
14 delay(500);
15}Com o Plotter Serial do Arduino IDE você acompanha o valor como um gráfico ao vivo. Quando você cobre o LDR com a mão, o gráfico cai, e quando aponta uma lanterna para ele, o gráfico sobe. Esse é o jeito mais fácil de achar o limite certo para o seu projeto, com o sensor no lugar onde ele vai ficar de verdade.
Luz noturna automática: limite e histerese
A luz noturna mais simples diz "se o valor estiver abaixo de 300, acenda o LED". Mas quando a luz fica oscilando bem perto do limite, a lâmpada fica acendendo e apagando sem parar, e é ainda pior se a própria luz da lâmpada atingir o LDR. A solução é a histerese: usar dois limites diferentes. O código abaixo acende a lâmpada quando a luz cai abaixo de 300, mas só apaga quando ela sobe acima de 400; a diferença entre os dois acaba totalmente com a piscada.
1const int LDR_PIN = A0;
2const int LED_PIN = 9;
3const int ON_LEVEL = 300; // bunun altında yak / turn on below this
4const int OFF_LEVEL = 400; // bunun üstünde söndür / turn off above this
5
6bool lampOn = false;
7
8void setup() {
9 pinMode(LED_PIN, OUTPUT);
10}
11
12void loop() {
13 int light = analogRead(LDR_PIN);
14 if (!lampOn && light < ON_LEVEL) lampOn = true;
15 if (lampOn && light > OFF_LEVEL) lampOn = false;
16 digitalWrite(LED_PIN, lampOn ? HIGH : LOW);
17 delay(200);
18}Um LED que fica mais forte no escuro
Em vez de ligar e desligar, você pode fazer o LED ganhar brilho aos poucos conforme a luz diminui. A função map() transforma a luz medida em um valor de PWM inversamente proporcional: o LED brilha mais conforme o cômodo escurece e enfraquece conforme ele clareia. Lembre-se de ligar o LED em um pino PWM marcado com ~ (por exemplo, o 9).
1void loop() {
2 int light = analogRead(A0);
3 int brightness = map(light, 100, 900, 255, 0); // karanlık → parlak / dark → bright
4 analogWrite(9, constrain(brightness, 0, 255));
5 delay(50);
6}Módulos LDR: saídas digital e analógica
Os módulos LDR prontos trazem em uma só placa o LDR, o resistor do divisor, um trimpot azul para o limite e um comparador LM393. O pino AO dá a saída analógica do divisor, enquanto o pino DO dá só HIGH ou LOW, de acordo com o limite ajustado no trimpot. Na maioria dos módulos, o DO vai para LOW quando está mais claro que o limite e para HIGH quando está mais escuro; confirme o comportamento do seu módulo com um teste rápido.
| Pino | Função |
|---|---|
| VCC | Alimentação (3,3–5 V) |
| GND | Terra |
| DO | Saída digital: limite ajustado no trimpot |
| AO | Saída analógica: o ponto central do divisor de tensão |
LDRs com o ESP32 e o Raspberry Pi Pico
O ESP32 e o Pico funcionam com 3,3 V, então alimente o divisor de tensão pelo pino 3V3. O ADC do ESP32 é de 12 bits e devolve valores de 0 a 4095. Os pinos do ADC2 não funcionam enquanto o Wi-Fi está ligado, então ligue o LDR em um dos pinos do ADC1 (GPIO 32–39). No Pico, as entradas analógicas são GP26, GP27 e GP28; o read_u16() do MicroPython devolve valores de 0 a 65535:
1from machine import ADC, Pin
2import time
3
4ldr = ADC(26) # GP26 (ADC0); bölücü 3V3'ten / divider fed from 3V3
5led = Pin(15, Pin.OUT)
6
7while True:
8 light = ldr.read_u16() # 0 (karanlık) – 65535 (aydınlık) / dark – bright
9 led.value(light < 20000) # karanlıkta yak / on when dark
10 print(light)
11 time.sleep(0.5)LDR ou sensor de luz digital?
| Característica | LDR | BH1750 (digital) |
|---|---|---|
| Saída | Analógica (variação de resistência) | Digital (I2C), direto em lux |
| Precisão | Aproximada; afetada pela temperatura e pelo modelo | Precisa e calibrada |
| Velocidade de resposta | Lenta (dezenas de milissegundos) | Rápida |
| Preço | Muito barato | Um pouco mais caro |
| Ideal para | Decisões de escuro/claro, luzes noturnas | Medição de luz, iluminação de plantas, brilho de telas |
Ideias de projetos com LDR
- Luz noturna automática: uma lâmpada que acende no escuro e não fica piscando, graças à histerese.
- Luz de corredor inteligente: combine o LDR com um Sensor de movimento PIR para que ela só acenda quando estiver escuro e alguém passar.
- Painel que segue o sol: gire um servo conforme a diferença entre dois LDRs para apontar um painel para a direção mais clara.
- Sistema de segurança a laser: aponte um feixe de laser para um LDR; quando o feixe for interrompido, dispare o alarme.
- Luz ambiente colorida: leve um LED RGB para cores quentes conforme escurece.
- Despertador do amanhecer: toque um buzzer com a primeira luz da manhã.
Erros comuns e como resolvê-los
- O valor é sempre 0 ou sempre 1023: falta o resistor fixo, ou o LDR está ligado direto entre o 5V e o A0; monte o divisor de tensão.
- Os valores funcionam ao contrário: o LDR e o resistor fixo trocaram de lugar; se o valor sobe no escuro, troque os dois de posição ou inverta a comparação no código.
- A lâmpada fica piscando: a luz da lâmpada está atingindo o LDR, ou está sendo usado um único limite; acrescente histerese.
- Atraso quando escurece: o LDR volta do claro para o escuro mais devagar do que do escuro para o claro; um atraso de alguns segundos é normal.
- Tentar medir lux: o LDR não é um sensor calibrado; use um BH1750 para ter valores reais em lux.
- As leituras falham quando o Wi-Fi liga no ESP32: o LDR está em um pino do ADC2; passe para um dos pinos do ADC1, entre o GPIO 32 e o 39.
O LDR é o jeito mais fácil de aprender leitura analógica e a ideia do divisor de tensão, e o que você aprende aqui ajuda com muitos sensores analógicos, como os de umidade, gás e temperatura. Se você tem curiosidade sobre como funcionam os resistores do divisor, veja O que é resistor?; no app BlueGrays você encontra projetos de luz noturna com LDR, nível de luz e segurança a laser passo a passo.
Perguntas frequentes
Que resistor devo usar com um LDR?
A escolha mais comum é 10 kΩ, que funciona bem para a maioria dos projetos em ambientes internos. Para mais sensibilidade com pouca luz, escolha 47 kΩ, e para condições muito claras, 1 kΩ. Como regra, escolha um resistor fixo próximo da resistência do LDR no nível de luz que interessa a você.
O LDR tem terminal positivo e negativo?
Não. O LDR não tem polaridade, assim como um resistor comum; você pode encaixá-lo em qualquer sentido. O que importa é montar um divisor de tensão correto com o resistor fixo.
Um LDR consegue medir lux?
Dá para estimar, mas o valor não vai ser preciso; a resposta do LDR não é linear e varia de um modelo para outro e até com a temperatura. Se você precisa de valores reais em lux, use um sensor de luz digital como o BH1750 ou o TSL2561.
Qual é a diferença entre os pinos DO e AO de um módulo LDR?
O AO dá uma tensão analógica que muda com a intensidade da luz e é lida com analogRead(). O DO dá só HIGH ou LOW, de acordo com o limite ajustado no trimpot do módulo, e é lido com digitalRead(); ele é prático para tarefas de liga-desliga.
Por que meu LDR reage devagar no escuro?
Depois que a luz é retirada, o material CdS leva alguns segundos para chegar à resistência de escuro, enquanto ir para o claro é muito mais rápido. Essa é uma característica natural dos LDRs. Para tarefas que pedem resposta rápida, usa-se um fotodiodo ou um fototransistor.
Por que o valor do meu LDR no ESP32 fica sempre em 4095 ou não muda nada?
Se o divisor está alimentado com 5V, a tensão passa do limite do ADC e o valor trava em 4095; alimente o divisor pelo 3V3. Se ele não muda nada, o LDR pode estar em um pino do ADC2; o ADC2 não funciona enquanto o Wi-Fi está ligado, então use um pino do ADC1 entre o GPIO 32 e o 39.
Projetos para montar depois desta leitura
Ver todos os projetos
Medição da intensidade da luz com LDR
Quer ver a luminosidade do seu quarto em números? O LDR, um pequeno componente sensível à luz, mede a luz ambiente, e o Arduino exibe o valor na tela do computador a cada meio segundo. Cubra o sensor

Luz noturna com LDR
Uma pequena luz noturna que acende sozinha quando escurece e apaga ao amanhecer. Um sensor de luz mede a luminosidade do quarto, e o Arduino acende o LED quando está escuro o suficiente e apaga quando

Sistema de alerta com laser
Você monta uma barreira de luz invisível, como nos filmes. Um laser ilumina um sensor de luz do outro lado; assim que alguém passa e interrompe o feixe, o LED acende e o buzzer soa. Quando o feixe vol

Sistema de segurança com laser
Como nas cenas de roubo com lasers dos filmes: um feixe de laser atinge um sensor de luz e, assim que alguém passa e interrompe o feixe, o LED vermelho acende e o buzzer começa a soar. O alarme não pa

Luz noturna com LDR e ESP32
Uma luz noturna em que o LED acende automaticamente no escuro e apaga na claridade. Usamos o pino D0 (saída digital) do módulo sensor LDR. O pequeno potenciômetro no módulo ajusta o limiar de escuridão, e o próprio módulo gera a saída HIGH/LOW. O ESP32 apenas lê esse sinal com digitalRead(), deixando o código bem simples.

Leitura da intensidade da luz com módulo LDR e ESP32
Acompanhe em tempo real no Monitor Serial o valor bruto do ADC do módulo LDR e a porcentagem relativa de luz calculada a partir de referências de escuridão e claridade. Essa porcentagem não é uma medida em lux. O projeto ensina a lógica de calibração do módulo. É ideal fazê-lo antes do projeto 10, pois ajuda a determinar o valor do limiar.

Iluminação inteligente com ESP32 (PIR + LDR + relé + OLED)
Transforme a iluminação do corredor, banheiro ou despensa em iluminação inteligente com ESP32! Com um sensor de movimento PIR, um sensor de luz LDR e um módulo relé, montamos o cenário clássico de "acender a luz ao detectar movimento no escuro" — se o ambiente já estiver claro, o movimento NÃO aciona a luz, economizando energia durante o dia. A luz fica acesa por 30 segundos; se o movimento continuar, o temporizador reinicia e a luz permanece acesa por mais tempo.

Iluminação automática com ESP32 e sensor de movimento PIR
Neste projeto, usaremos o sensor de movimento PIR HC-SR501 para detectar quando alguém entra no cômodo e acender o LED automaticamente. Acompanharemos o tempo em que o LED fica aceso com millis(). Cada leitura HIGH do sensor atualizará o instante do último movimento, e o LED apagará pelo menos 10 segundos após a última leitura HIGH. O código atual também espera 50 ms em cada ciclo com delay(50), portanto o laço da aplicação não é totalmente livre de bloqueios.
Mais artigos
App BlueGrays
Monte este circuito passo a passo pelo celular
Esquema do circuito, código e lista de componentes em uma só tela. Mais de 200 projetos com Arduino, ESP32 e Pico prontos para montar.
Escaneie com seu celular
Aponte a câmera para o código para abrir a loja de aplicativos do seu celular.
ou abrir a loja

