INICIO /  APRENDE /  BLOG /  GUÍA
Guía6 min·

LDR con Arduino y ESP32: conexión, código y límites

Un LDR, o fotorresistencia, es una resistencia que cambia de valor con la luz que recibe: con más luz baja su resistencia y con menos luz sube. Eso la convierte en uno de los sensores de luz más baratos para Arduino y ESP32. Con ella puedes encender una luz al anochecer, detectar si una puerta se abrió o si una caja quedó a oscuras. En Zamper la vendemos en pack de 5.

Qué es un LDR (fotorresistencia) y cómo cambia con la luz

LDR son las siglas en inglés de resistor dependiente de la luz. También se le llama fotorresistor o fotoconductor. Mientras recibe luz, su resistencia baja. A oscuras sube mucho. Cuánto cambia depende del modelo: el orden de magnitud entre luz y oscuridad varía de una unidad a otra, y la ficha de un LDR genérico rara vez trae la curva. Para saber qué tienes, mídelo con un multímetro en modo resistencia, una vez con la luz de tu pieza y otra tapándolo con la mano. Un LDR no tiene polaridad: puedes conectarlo en cualquier sentido.

Cómo conectarlo: el divisor de tensión

Arduino y ESP32 miden tensión, no resistencia, así que el LDR se conecta en serie con una resistencia fija y se lee el punto medio. Un extremo del LDR va a la alimentación (5 V en Arduino Uno, 3,3 V en ESP32), el otro extremo va al pin analógico y a un lado de la resistencia fija, y el otro lado de esa resistencia va a GND. La tensión en el punto medio es Vcc × R / (R + R_LDR), con R la resistencia fija. Con esta orientación, más luz da más tensión y menos luz da menos tensión. Si intercambias las posiciones del LDR y de la resistencia, la lectura se invierte, y puedes corregirlo en el código. Un valor de partida habitual para R es 10 kΩ. Para afinar, usa un valor cercano a la resistencia que tiene tu LDR con la luz a la que quieres que el circuito cambie de estado. Así el punto medio queda cerca de la mitad de la escala justo en ese umbral y aprovechas más rango de lectura.

Lectura analógica en Arduino y en ESP32

El Arduino Uno tiene un conversor analógico de 10 bits, así que analogRead() devuelve de 0 a 1023 para una tensión entre 0 y 5 V. El ESP32 convierte con 12 bits, de 0 a 4095, y sus pines admiten como máximo 3,3 V: alimenta el divisor desde el pin de 3,3 V y no desde los 5 V de la placa. Con WiFi activo, usa pines del ADC1 (GPIO 32 a 39). Los del ADC2 los ocupa el controlador WiFi y la lectura falla mientras la conexión está en uso. El GPIO 34 es una buena elección porque solo sirve como entrada. El ADC del ESP32 tampoco es perfectamente lineal, y en los extremos de la escala pierde precisión. Por eso conviene que el divisor deje la lectura lejos de 0 y de 4095 en las condiciones normales de uso.

Código: encender una salida de noche con histéresis

Este sketch lee el LDR, promedia 8 lecturas para suavizar el ruido y enciende una salida cuando oscurece. Usa dos umbrales distintos para no parpadear cuando la luz está justo en el límite. La salida se enciende bajo UMBRAL_OSCURO y se apaga sobre UMBRAL_CLARO. Los valores están pensados para Arduino Uno con el divisor descrito arriba; en ESP32 multiplícalos por 4 como punto de partida, porque su escala llega a 4095, y cambia LDR_PIN a 34. Calibra los dos umbrales con tu LDR: imprime la lectura por el monitor serie con luz y sin luz, y elige uno a cada lado del punto de cambio. La salida puede ser un LED o un módulo de relé; si manejas una carga de red eléctrica, usa un relé o un SSR con aislación adecuada.

const int LDR_PIN = A0;          // en ESP32: 34
const int SALIDA_PIN = 8;        // LED o entrada del módulo de relé
const int UMBRAL_OSCURO = 300;   // en ESP32: 1200
const int UMBRAL_CLARO = 450;    // en ESP32: 1800

bool oscuro = false;

int leerLuz() {
  long suma = 0;
  for (int i = 0; i < 8; i++) {
    suma += analogRead(LDR_PIN);
    delay(5);
  }
  return suma / 8;
}

void setup() {
  pinMode(SALIDA_PIN, OUTPUT);
  Serial.begin(115200);
}

void loop() {
  int luz = leerLuz();

  if (!oscuro && luz < UMBRAL_OSCURO) {
    oscuro = true;
  } else if (oscuro && luz > UMBRAL_CLARO) {
    oscuro = false;
  }

  digitalWrite(SALIDA_PIN, oscuro ? HIGH : LOW);
  Serial.println(luz);
  delay(200);
}

Límites del LDR

Un LDR responde lento: tarda un tiempo en cambiar de valor cuando la luz cambia, y por eso no sirve para contar destellos rápidos ni para leer luz pulsada. Su respuesta no es lineal con la luz, y tampoco entrega lux. Te dice si hay más o menos luz que antes. Dos unidades del mismo modelo pueden leer distinto, así que cada circuito necesita su calibración. Además, la lectura se mueve con la temperatura y con el color de la luz, y no responde igual a todas las longitudes de onda. Para un interruptor crepuscular o una alarma de caja abierta, esos límites no molestan. Para registrar luz en el tiempo o comparar entre sitios, conviene otro sensor.

Sensor de luz para Arduino: cuándo usar un módulo en vez de un LDR

Si prefieres un módulo con la electrónica ya resuelta, hay sensores de luz con salida analógica. El sensor de luz ambiental TEMT6000 de Zamper tiene, según su ficha, un fototransistor conectado a una resistencia pull-down que forma un divisor de tensión, con salida analógica de 0 a 5 V, alimentación de 5 V, 0,5 mA de consumo y temperatura de operación de -40 a 85 °C. Su ficha indica 5 V, así que con un ESP32 baja esa salida con un divisor antes de llevarla a un pin de 3,3 V. El sensor de luz analógica OPT101 indica en su ficha alimentación de 2,7 a 36 V, responsividad de 0,45 A/W a 650 nm, resistencia de realimentación interna de 1 MΩ y corriente de reposo de 120 µA, y viene para soldar. Ninguna de las dos fichas entrega la lectura en lux, así que, si necesitas lux calibrados, deberás calibrarlos tú contra un luxómetro.

Errores comunes con el LDR

Si la lectura se queda en 0 o en el máximo, revisa que el LDR y la resistencia estén en serie y que el pin analógico salga del punto medio entre ambos. Si el valor salta, promedia varias lecturas, como en el ejemplo, y mantén los cables cortos. Si en ESP32 la lectura falla justo cuando conectas el WiFi, estás usando un pin del ADC2. Si la luz y la lectura van al revés de lo esperado, intercambiaste el LDR y la resistencia fija: invierte la lógica en el código o cambia el orden. Si el circuito se enciende y apaga cerca del umbral, separa más los dos umbrales. Si la carga que enciendes ilumina el propio LDR, el circuito se apaga y se vuelve a encender solo: aleja el sensor de la luz que controla o apúntalo hacia otro lado.

Preguntas frecuentes sobre el LDR

¿Qué resistencia fija uso con un LDR? Parte con 10 kΩ y ajusta según lo que midas con tu multímetro. ¿Se puede conectar el LDR directo al pin sin resistencia? Sin resistencia fija no hay un divisor controlado y la lectura queda a merced de la pull-up interna del pin. Usa la resistencia. ¿Sirve para medir lux? No directamente. Sirve para detectar cambios de luz, y para medir lux hay que calibrarlo contra un luxómetro o usar un sensor pensado para eso. ¿Funciona en el ESP32 con WiFi? Sí, conectado a un pin del ADC1. ¿Necesito instalar una librería? No, analogRead viene incluida en el entorno de Arduino.

Fuentes técnicas

PRODUCTOS RELACIONADOS
Fotorresistor (LDR) pack de 5Sensor de luz ambiental TEMT6000Sensor de luz analógica OPT101SensoresRelé de estado sólido (SSR)Displays para Arduino y ESP32Arduino Uno, Nano, Mega o ESP32: cuál elegir
¿NECESITAS AYUDA?

Habla con un especialista IoT.

Contactar