Una fotorresistencia LDR permite detectar cambios de luz con un circuito muy sencillo. En este tutorial la conectaremos a un ESP32 mediante un divisor de tensión y leeremos el punto intermedio con una entrada analógica.
Qué vas a construir
El LDR no entrega directamente un valor digital de encendido o apagado. Su resistencia cambia según la luz que recibe. Al combinarlo con una resistencia fija de 10 kΩ formamos un divisor de tensión que el ADC del ESP32 puede medir.
El montaje sirve como base para una luz nocturna, una persiana automática o un sensor que avise cuando una planta recibe poca luz. Si todavía no has usado esta placa, puedes consultar qué es un ESP32 y cómo empezar.
Material necesario
- Un ESP32.
- Una fotorresistencia LDR.
- Una resistencia de 10 kΩ.
- Una protoboard y cables Dupont.
- Un cable USB para programar la placa.
Esquema de conexión
Conecta el LDR entre 3,3 V y el punto de lectura. Desde ese punto conecta la resistencia de 10 kΩ a GND. El nodo central va al GPIO34, que es una entrada adecuada para leer el ADC en muchas placas ESP32.
No apliques más de 3,3 V a una entrada del ESP32. El circuito debe alimentarse desde el pin de 3,3 V de la placa, no desde 5 V.
Código de prueba
const int LDR_PIN = 34;
void setup() {
Serial.begin(115200);
}
void loop() {
int lectura = analogRead(LDR_PIN);
Serial.println(lectura);
delay(500);
}
Abre el monitor serie a 115200 baudios y observa cómo cambia la lectura al iluminar u oscurecer el LDR. El valor exacto depende de la resistencia concreta, la luz ambiental y la configuración del ADC; no lo trates como una medida calibrada en lux.
Convertir la lectura en una decisión
Para encender una luz cuando el ambiente esté oscuro puedes usar un umbral inicial:
const int UMBRAL_OSCURIDAD = 1200;
void loop() {
int lectura = analogRead(LDR_PIN);
bool estaOscuro = lectura < UMBRAL_OSCURIDAD;
Serial.println(estaOscuro ? "Oscuro" : "Hay luz");
delay(500);
}
El umbral debe ajustarse observando las lecturas reales de tu habitación. Para evitar que el estado cambie continuamente cerca del límite, añade histéresis: usa un umbral para encender y otro ligeramente diferente para apagar.
Calibrar el montaje
La lectura del ADC no representa lux directamente. Para obtener un comportamiento útil, registra varios valores en las condiciones que te importan:
- Apunta el valor con la habitación iluminada.
- Tapa el LDR y registra el valor en oscuridad.
- Repite ambas medidas varias veces y anota un rango, no solo una muestra.
Después elige los umbrales entre esos rangos. Si hay mucha fluctuación, calcula la media de varias lecturas antes de compararla o coloca un condensador pequeño según el circuito y la respuesta que necesites. El objetivo es que una nube o una sombra momentánea no cambie el estado de la automatización.
Integrarlo con ESPHome
Cuando el circuito ya funciona, ESPHome permite publicar la lectura sin mantener un sketch propio:
sensor:
- platform: adc
pin: GPIO34
name: "Luz ambiente"
update_interval: 5s
attenuation: auto
El nombre del pin y la atenuación dependen de la placa y de la versión de ESPHome. Empieza publicando el valor crudo y calibra después la conversión a una escala que tenga sentido para tu habitación. Para evitar automatizaciones inestables, añade un filtro de media y una condición con histéresis en Home Assistant en lugar de disparar una acción por cada muestra.
Errores frecuentes
- Alimentar el divisor desde 5 V y llevar esa tensión al ESP32.
- Elegir un GPIO que tenga una función especial en la placa concreta.
- Esperar una medida de lux sin calibrar el LDR y la resistencia.
- No filtrar las variaciones, provocando cambios rápidos cerca del umbral.
Si la placa tampoco consigue conectarse a la red durante las pruebas, revisa la guía de errores de WiFi del ESP32.
Próximo paso
Cuando la lectura sea estable, puedes publicar el valor por MQTT o integrarlo con ESPHome y Home Assistant. La documentación del ADC de Espressif explica las características y limitaciones de la lectura analógica.