¿Qué es un sensor de luz LDR? Medir la luz con Arduino y una luz nocturna automática
¿Cómo funciona una LDR (fotorresistencia)? Conexión como divisor de tensión, cómo elegir la resistencia, leer la luz con analogRead, luz nocturna con histéresis, módulo LDR, uso con ESP32 y Pico y errores comunes.
Una LDR (Light Dependent Resistor) es, como indica su nombre, una resistencia cuyo valor cambia con la luz; también se llama fotorresistencia o fotocélula. En la oscuridad su resistencia es muy alta y, cuanta más luz hay, más baja. Las farolas que se encienden al anochecer, las luces nocturnas automáticas y los juguetes que reaccionan a la luz funcionan con esta sencilla pieza. Es barata, no tiene polaridad y se conecta a Arduino con una sola resistencia: un comienzo ideal para tu primer proyecto con luz.

¿Cómo funciona una LDR?
El zigzag de la superficie de la LDR es un semiconductor sensible a la luz, el sulfuro de cadmio (CdS). Cuando le llega luz, los fotones liberan electrones del material, este conduce mejor y la resistencia baja. El cambio no es lineal y es relativamente lento (decenas de milisegundos). Por eso la LDR no sirve para medir la luz con precisión en lux, pero es ideal para decisiones como «¿está oscuro o hay luz?» y para niveles de luz aproximados.
| Ambiente | Resistencia aproximada de la LDR (GL5528) |
|---|---|
| Oscuridad total | 1 MΩ o más |
| Luz de una lamparita nocturna (~1 lux) | 50–100 kΩ |
| Habitación en penumbra (~10 lux) | 10–20 kΩ |
| Habitación iluminada (~100 lux) | 3–5 kΩ |
| Bajo un flexo (~1000 lux) | Alrededor de 1 kΩ |
| Luz del día | Unos cientos de Ω |
Los valores dependen del modelo. La más habitual en los kits es la GL5528; sus hermanas GL5516, GL5537 y GL5539 dan resistencias distintas con la misma luz. Puedes conocer fácilmente los valores de tu LDR midiéndola con un multímetro a oscuras y con luz.
Conexión con Arduino: el divisor de tensión
Arduino mide tensión, no resistencia. Por eso la LDR se conecta junto con una resistencia fija formando un divisor de tensión: 5V → LDR → A0 → 10 kΩ → GND. Al aumentar la luz, la resistencia de la LDR baja y la tensión en A0 sube. La tensión en A0 se calcula con V = 5 × Rfija / (RLDR + Rfija), y analogRead() la convierte en un número de 0 a 1023. Para probar distintas resistencias, usa la calculadora Divisor de tensión.
| Luz | Resistencia de la LDR | Tensión en A0 | analogRead |
|---|---|---|---|
| Oscuridad total | 1 MΩ | 0,05 V | ~10 |
| Penumbra | 15 kΩ | 2,0 V | ~410 |
| Habitación iluminada | 4 kΩ | 3,6 V | ~730 |
| Bajo un flexo | 1 kΩ | 4,5 V | ~930 |
Leer el nivel de luz con 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}Con el Serial Plotter (trazador serie) del Arduino IDE puedes ver el valor como un gráfico en directo. Al tapar la LDR con la mano, la curva baja; al iluminarla con una linterna, sube. Es la forma más fácil de encontrar el umbral adecuado para tu proyecto, con el sensor colocado donde va a quedarse.
Luz nocturna automática: umbral e histéresis
La luz nocturna más sencilla dice «si el valor es menor que 300, enciende el LED». Pero cuando la luz está justo en el umbral, la lámpara se enciende y se apaga sin parar, y es peor aún si su propia luz llega a la LDR. La solución es la histéresis: usar dos umbrales distintos. El código siguiente enciende la lámpara cuando la luz baja de 300, pero solo la apaga cuando supera 400; el hueco entre ambos acaba con el parpadeo.
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}Un LED que brilla más cuanto más oscuro está
En lugar de encender y apagar, puedes hacer que el LED se ilumine poco a poco a medida que baja la luz. La función map() convierte la luz medida en un valor PWM inversamente proporcional: cuanto más oscura está la habitación, más brilla el LED, y al revés. Recuerda conectar el LED a un pin PWM marcado con ~ (por ejemplo, el 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ódulo LDR: salida digital y analógica
Los módulos LDR ya montados llevan en la misma placa la LDR, la resistencia del divisor, un trimpot azul para el umbral y un comparador LM393. El pin AO da la salida analógica del divisor, y el pin DO solo HIGH o LOW según el umbral ajustado con el trimpot. En la mayoría de los módulos DO está en LOW cuando hay más luz que el umbral y en HIGH cuando hay menos; compruébalo en tu módulo con una prueba rápida.
| Pin | Función |
|---|---|
| VCC | Alimentación (3,3–5 V) |
| GND | Tierra |
| DO | Salida digital: umbral ajustado con el trimpot |
| AO | Salida analógica: punto medio del divisor de tensión |
LDR con el ESP32 y la Raspberry Pi Pico
El ESP32 y la Pico funcionan a 3,3 V, así que alimenta el divisor desde el pin 3V3. El ADC del ESP32 es de 12 bits y devuelve valores de 0 a 4095. Como los pines ADC2 no funcionan con el Wi-Fi activado, conecta la LDR a uno de los pines ADC1 (GPIO 32–39). En la Pico las entradas analógicas son GP26, GP27 y GP28; read_u16() de MicroPython devuelve 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 o sensor de luz digital?
| Característica | LDR | BH1750 (digital) |
|---|---|---|
| Salida | Analógica (cambio de resistencia) | Digital (I2C), directamente en lux |
| Precisión | Aproximada; depende de la temperatura y del modelo | Precisa y calibrada |
| Velocidad de respuesta | Lenta (decenas de milisegundos) | Rápida |
| Precio | Muy barata | Algo más cara |
| Ideal para | Decidir si hay luz u oscuridad, luces nocturnas | Medir la luz, iluminación de plantas, brillo de pantallas |
Ideas de proyectos con LDR
- Luz nocturna automática: una lámpara que se enciende a oscuras y no parpadea gracias a la histéresis.
- Luz de pasillo inteligente: combina la LDR con un sensor de movimiento PIR para que solo se encienda cuando esté oscuro y pase alguien.
- Panel que sigue al sol: gira un servo según la diferencia entre dos LDR para orientar un panel hacia la zona más luminosa.
- Sistema de seguridad láser: apunta un láser a una LDR; cuando se corte el haz, suena la alarma.
- Luz ambiental de colores: lleva un LED RGB hacia tonos cálidos a medida que oscurece.
- Despertador al amanecer: haz sonar un zumbador con la primera luz de la mañana.
Errores comunes y cómo solucionarlos
- El valor siempre es 0 o siempre 1023: falta la resistencia fija o la LDR está conectada directamente entre 5V y A0; monta el divisor de tensión.
- Los valores funcionan al revés: la LDR y la resistencia fija están intercambiadas; si el valor sube a oscuras, cámbialas o invierte la comparación en el código.
- La lámpara parpadea: su luz llega a la LDR o solo hay un umbral; añade histéresis.
- Retraso al oscurecer: una LDR vuelve de luz a oscuridad más despacio que al revés; unos segundos de retraso son normales.
- Intentar medir lux: una LDR no es un sensor calibrado; para valores reales en lux usa un BH1750.
- En el ESP32 las lecturas fallan al activar el Wi-Fi: la LDR está en un pin ADC2; pásala a uno de los pines ADC1, entre GPIO 32 y 39.
La LDR es la forma más fácil de aprender la lectura analógica y la idea del divisor de tensión, y lo que aprendas aquí te servirá con muchos sensores analógicos, como los de humedad, gas o temperatura. Si te interesa cómo funcionan las resistencias del divisor, mira ¿Qué es una resistencia?; en la app BlueGrays encontrarás proyectos de luz nocturna con LDR, medida de intensidad de luz y seguridad láser, paso a paso.
Preguntas frecuentes
¿Qué resistencia se pone con una LDR?
La opción más habitual es 10 kΩ, que funciona bien en casi todos los proyectos de interior. Para más sensibilidad con poca luz, 47 kΩ, y para ambientes muy luminosos, 1 kΩ. Como regla, elige una resistencia fija parecida a la de la LDR en el nivel de luz que te interesa.
¿Una LDR tiene polo positivo y negativo?
No. Una LDR no tiene polaridad, igual que una resistencia normal; puedes colocarla en cualquier sentido. Lo importante es montar bien el divisor de tensión con la resistencia fija.
¿Se pueden medir lux con una LDR?
Se pueden estimar, pero no con precisión: su respuesta no es lineal y cambia según el modelo e incluso con la temperatura. Si necesitas valores reales en lux, usa un sensor de luz digital como el BH1750 o el TSL2561.
¿Qué diferencia hay entre los pines DO y AO de un módulo LDR?
AO da una tensión analógica que varía con la intensidad de la luz y se lee con analogRead(). DO solo da HIGH o LOW según el umbral ajustado con el trimpot del módulo y se lee con digitalRead(); es práctico para encender y apagar cosas.
¿Por qué mi LDR reacciona despacio en la oscuridad?
Cuando desaparece la luz, el CdS tarda unos segundos en alcanzar su resistencia en oscuridad, mientras que el paso a luz es mucho más rápido. Es una característica natural de las LDR. Para respuestas rápidas se usan fotodiodos o fototransistores.
¿Por qué en el ESP32 mi LDR siempre marca 4095 o no cambia nunca?
Si el divisor se alimenta con 5V, la tensión supera el límite del ADC y el valor se queda en 4095; aliméntalo con 3V3. Si no cambia nunca, la LDR puede estar en un pin ADC2; el ADC2 no funciona con el Wi-Fi activado, así que usa un pin ADC1 entre GPIO 32 y 39.
Proyectos para hacer después de leer esto
Ver todos los proyectos
Intensidad de la luz de lectura con Ldr
Proyecto que mide la intensidad de la luz ambiental con un sensor LDR y la muestra en un monitor serie. Enseña los fundamentos de la lectura de sensores analógicos y la comunicación serie.

Lámpara de noche con Ldr
Proyecto de luz nocturna basada en LDR que enciende automáticamente el LED cuando el ambiente se oscurece. Enseña lógica de control automático con comparación de valores umbral analógicos.

Sistema de alerta láser
Proyecto de seguridad que detecta cuando se interrumpe el rayo láser mediante LDR y avisa con zumbador y LED. Enseña la lógica de detección de interrupción de luz con par láser-LDR.

Sistema de seguridad láser
Sistema de seguridad avanzado que activa la alarma cuando se interrumpe el rayo láser y puede restablecerse mediante pulsador o control por infrarrojos. Enseña la gestión de múltiples fuentes de entra

ESP32 Luz de Noche con LDR
Luz nocturna en la que el LED se enciende automáticamente en la oscuridad y se apaga con la luz. Se utiliza el pin D0 (digital out) del módulo sensor LDR - el umbral de oscuridad se ajusta con el pequeño potenciómetro del módulo, el propio módulo genera la salida HIGH/LOW. ESP32 sólo lee esta señal con digitalRead(), el código es muy simple.

Lectura de la intensidad luminosa con el módulo LDR del ESP32
Visualización en tiempo real en el monitor serie del valor de luz medido por el módulo LDR + valor aproximado en lux. Explica el funcionamiento de la calibración del módulo. Es recomendable realizarlo antes del Proyecto 10, ya que se utiliza para determinar el valor umbral.

Iluminación Inteligente ESP32 (PIR + LDR + Relé + OLED)
¡Convierte tu pasillo, baño o despensa en iluminación inteligente con ESP32! Utilizando un sensor de movimiento PIR, un sensor de luz LDR y un módulo de relé, construimos el escenario clásico "la luz se enciende cuando se detecta movimiento en la oscuridad" — si el ambiente ya está iluminado, el movimiento NO activa la luz, ahorrando energía durante el día. La luz permanece encendida durante 30 segundos; si el movimiento continúa, el temporizador se reinicia y la luz permanece encendida más tiem

Iluminación automática con el sensor de movimiento PIR del ESP32
En este proyecto, utilizaremos el sensor de movimiento PIR HC-SR501 para detectar a las personas que entren en la habitación y encender el LED automáticamente. Cuando se detecte movimiento, el LED permanecerá encendido durante un tiempo determinado y gestionaremos el tiempo mediante la función `millis()` y un contador, sin necesidad de utilizar `delay()`. De este modo, obtendremos un sistema de iluminación con sensor de movimiento que no bloquea el ESP32 y permite realizar otras tareas. En la vi
Más artículos
Aprende cómo una LDR cambia su resistencia con la luz, cómo conectarla a Arduino con un divisor de tensión, elegir la resistencia adecuada y hacer una luz nocturna automática que no parpadee.

