#113Principiante

Lectura de la intensidad luminosa con el módulo LDR del ESP32

Visualización en tiempo real en el monitor serie del valor bruto del ADC del módulo LDR y del porcentaje relativo de luz calculado a partir de referencias de oscuridad y claridad. Este porcentaje no es una medición 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.

4.6(36)
55 completado
Lectura de la intensidad luminosa con el módulo LDR del ESP32
Un medidor de luz sencillo que te muestra en porcentaje cuánta luz hay en tu habitación. El sensor de luz mide el entorno, y el ESP32 lo convierte en cero para la oscuridad y cien para la luz plena, y lo escribe cada medio segundo en la pantalla de tu ordenador. Antes de hacer una lamparita de noche, con esta medida decides a qué nivel debe encenderse.

Video

Diagrama del circuito

Lectura de la intensidad luminosa con el módulo LDR del ESP32 - Circuit

Código fuente

Arduino (C++)
1// ─────────────────────────────────────────
2//   BlueGrays · bluegrays.com
3//   Lectura de la intensidad luminosa con el módulo LDR del ESP32
4// ─────────────────────────────────────────
5// Lee la salida analógica (AO) del módulo LDR con el ADC de 12 bits y la
6// convierte en un porcentaje de luz de 0-100 usando los valores de
7// calibración. El resultado se imprime en el Monitor Serie (115200
8// baudios) cada 0.5 s.
9//
10// Pines:
11//   GPIO 34 (ESP32 clásico) / GPIO 1 (ESP32-S2/S3) -> AO del módulo LDR
12//   VCC del módulo LDR -> 3V3, GND -> GND
13
14#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
15  const int LDR_PIN = 1;   // ESP32-S2/S3: ADC1_CH0
16#else
17  // ESP32 DevKit V1 clásica: ADC1_CH6, solo entrada. Aquí GPIO 1 choca con el TX del Serial
18  const int LDR_PIN = 34;
19#endif
20
21// Calibración: mide en tu propia habitación e introduce aquí los valores. En el módulo LDR, la
22// tensión de AO (y el valor en bruto) BAJA cuanto más brillante es la luz.
23const int RAW_DARK  = 4000;  // Valor en bruto en oscuridad
24const int RAW_LIGHT = 100;   // Luz en bruto
25
26void setup() {
27  Serial.begin(115200);
28  analogReadResolution(12);  // Forzar 12 bits
29  Serial.println("LDR Okuma / LDR Reading");
30  Serial.println("-----------------------------");
31}
32
33void loop() {
34  int raw = analogRead(LDR_PIN);
35  // Recortar al rango de calibración, oscuro = 0%
36  int clipped = constrain(raw, RAW_LIGHT, RAW_DARK);
37  int percent = map(clipped, RAW_DARK, RAW_LIGHT, 0, 100);
38
39  Serial.print("Raw: ");
40  Serial.print(raw);
41  Serial.print(" | Light: %");
42  Serial.println(percent);
43
44  delay(500);
45}
46

Preguntas frecuentes

¿Qué valores proporciona el ADC del ESP32?▾

El ADC del ESP32 es de 12 bits y devuelve valores comprendidos entre 0 y 4095. Dado que difiere del rango de 0 a 1023 del Arduino Uno, debes ajustar los umbrales y los cálculos en consecuencia.

Las lecturas analógicas se alteran cuando el Wi-Fi está activado, ¿por qué?▾

El canal ADC2 del ESP32 (GPIO 0, 2, 4, 12-15, 25-27) no se puede utilizar cuando el Wi-Fi está activado. Conectar los sensores analógicos a los pines ADC1 (GPIO 32-39) evita este problema.

¿El valor que se lee es el valor real en lux?▾

No, este código no calcula lux; muestra el valor bruto del ADC y un porcentaje relativo de luz basado en las referencias de oscuridad y claridad seleccionadas. La respuesta del LDR no es lineal y varía de un modelo a otro. Para una medición precisa de los lux se utiliza un sensor calibrado, como el BH1750.

¿Por qué el ADC del ESP32 da lecturas erróneas en los extremos?▾

El ADC del ESP32 no es lineal en los rangos cercanos a 0 V y 3,3 V. La función `analogReadMilliVolts()` devuelve un valor calibrado; para mediciones críticas, se obtienen resultados más precisos si se trabaja en el rango de 0,1 a 3,1 V.

Lectura de la intensidad luminosa con el módulo LDR del ESP32 | BlueGrays