Medir nivel de luz con Arduino y fotoresistencia LDR (GL55)


arduino-ldr

En esta entrada aprenderemos a medir el nivel de luz, tanto en interiores o exteriores, con la ayuda de Arduino y una fotoresistencia LDR (familia GL55 o similar), usando las entradas analógicas de Arduino.

¿Qué es un fotoresistor LDR?

Un fotoresistor, o LDR (light-dependent resistor) es un dispositivo cuya resistencia varia en función de la luz recibida. Podemos usar esta variación para medir, a través de las entradas analógicas, una estimación del nivel del luz.

Un fotoresistor está formado por un semiconductor, típicamente sulfuro de cadmio CdS. Al incidir la luz sobre él algunos de los fotones son absorbidos, provocando que electrones pasen a la banda de conducción y, por tanto, disminuyendo la resistencia del componente.

Por tanto, un fotoresistor disminuye su resistencia a medida que aumenta la luz sobre él. Los valores típicos son de 1 Mohm en total oscuridad, a 50-100 Ohm bajo luz brillante.

Anuncio:

Por otro lado, la variación de la resistencia es relativamente lenta, de 20 a 100 ms en función del modelo. Esta lentitud hace que no sea posible registrar variaciones rápidas, como las producidas en fuentes de luz artificiales alimentadas por corriente alterna. Este comportamiento puede ser beneficioso, ya que dota al sensor de una gran estabilidad.

Finalmente, los fotoresistores no resultan adecuados para proporcionar una medición de la iluminancia, es decir, para servir como luxómetro Esto es debido a su baja precisión, su fuerte dependencia con la temperatura y, especialmente, a que su distribución espectral no resulta adecuada para la medición de iluminancia.

ldr-graficas

Por tanto, un LDR es una sensor que resulta adecuado para proporcionar medidas cuantitativas sobre el nivel de luz, tanto en interiores como en exteriores, y reaccionar, por ejemplo, encendiendo una luz, subiendo una persiana, u orientando un robot.

Para medir la cantidad de luxes con Arduino necesitaréis un luxómetro como el BH1750 como vemos en la entrada Medir cantidad de luxes con Arduino y el luxómetro BH1750

Precio

Las fotoresistencias son dispositivos realmente baratos. Podemos encontrar 20 sensores LDR por 1€ en vendedores internacionales en Ebay, gastos de envío incluidos.

ldr-gl55

¿Cómo funciona un fotoresistor LDR?

Matemáticamente, la relación entre la iluminancia y la resistencia de una LDR sigue una función potencial.

 \frac{I}{I_0} = \left ( \frac{R}{R_0} \right )^{-gamma}


Siendo R0 la resistencia a una intensidad I0, ambas conocidas.

La constante gamma es la pendiente de la gráfica logarítmica, o la pérdida de resistencia por década. Su valor típicamente 0.5 a 0.8.

Por este motivo, frecuentemente las gráficas que relacionan ambos valores se representan en escalas logarítmicas para ambos ejes. Bajo esta representación, la relación se muestra como una gráfica lineal.

ldr-resistencia

Estos valores pueden ser obtenidos del datasheet del componente. Por ejemplo, para la familia GL55 de fotoresistores son los siguientes:

ModeloPico
espectral
(nm)
Resistencia
luz brillante
(KΩ)
Resistencia
oscuridad
(KΩ)
gammaTiempo
respuesta
(ms)
GL55165405-105000.530
GL552854010-2010000.625
GL5537-154020-3020000.625
GL5537-254030-5030000.725
GL553954050-10050000.825
GL5549540100-200100000.925


Sin embargo, siempre existirán pequeñas variaciones entre dispositivos, incluso dentro de la misma familia, debidos a la fabricación del componente.

El comportamiento potencial hace que estas pequeñas diferencias supongan grandes variaciones en la medición, por lo que no es posible, en general, emplear estos valores de forma absoluta sin un proceso de calibración.

Esquema eléctrico

El esquema eléctrico sería el siguiente.

arduino-ldr-esquema

Montaje

Por su parte, el montaje eléctrico en una protoboard quedaría de la siguiente manera.

arduino-ldr-montaje

Ejemplos de código

A continuación tenéis algunos ejemplos de código. En el siguiente, usamos las entradas digitales para hacer parpadear el LED integrado en la placa mientras el LDR recibe luz suficiente.

El siguiente ejemplo emplea una entrada analógica para activar el LED integrado en la placa si supera un cierto umbral (threshold).

El siguiente código proporciona una lectura del nivel de iluminación recibido. Observar que los cálculos se realizan con aritmética de enteros, evitando emplear números de coma flotante, dado que ralentizan mucho la ejecución del código.

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección Tutoriales de Arduino

Anuncio:

Previous Salidas digitales en Arduino
Next Desactivar thumbs.db en Windows 7 y 8
1000
15 Comment threads
9 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
16 Comment authors
newest oldest
Borja Salgado

Perdon pero no he entendido muy bien como se transforma el resultado analogico a un resultado en luxes podrias exlicarlo de una manera mas sencilla ?? Soy estudiante y necesito convertir los resultados pero no entiendo como.

Aleix Lahoz

Hola Borja, yo tambien soy estudiante y estoy investigando sobre como realizar esa conversión. He encontrado bastante información pero por desgracia aún no he conseguido determinar un método exacto, ¿al final conseguiste hacerlo?

luisllamas

Por muchos motivos (como explico en la entrada, distribución espectral, dependencia con la temperatura, diferencias en la fabricación, etc), simplemente no puedes medir los luxes con una simple foto resistencia. Lo mejor que podéis hacer es obtener una aproximación, con el código del segundo ejemplo. Deberéis sustituir A y B por los valores de resistencia en oscuridad y bajo luz intensa (se sacan del DataSheet) Pero sigue siendo una aproximación grosera, que sólo sirve para decir "aquí hay más luz que aquí" (que es para lo que son estos sensores) y no puede transformarse en Luxes. Para eso existen sensores… Read more »

Jorge

Yo creo que si podrias usarlo como un luxometro, si antes caracterizas la fotoresistencia utilizando un luxometro, es decir someter a cierta cantidad de luz la fotoresistencia y el luxometro a la par y relacionar el voltaje que te da el LDR con el luxometro, deberias hacer varias mediciones para tener una aproximacion confiable y despues simplemente hacer la conversion en el programa para obtener el dato en luxes.

Mauricio Ferraz

Estimado; buenisimo la información de Arduino en el sitio, lo visito a menudo. Una simple crítica constructiva; donde dice "Medir cantidad de luxes con Arduino y el luxómetro BH1750" quedó mal cerrado el a porque se le cruzó un strong y todo el artículo a partir de ahí tiene el enlace al siguiente artículo. Es simplemente por si te sirve para arreglarlo pero no empaña para nada la calidad del contenido.
Saludos y a seguir así

luisllamas

Cierto, arreglado. ¡Muchas gracias por el aviso Mauricio!

Pedro

Hola Luis, en primer lugar darte las gracias por este post, me ha sido de gran ayuda!!
Me surge una única duda, para que se usa la resistencia de 10k en el circuito?

José Álvarez

Buenas Pedro. Con el permiso de Luis te lo explico y que me corrija si me equivoco. La resistencia de 10 k se emplea para obtener un divisor de tensión que nos permita, como su propio nombre indica, dividir los 5V en la suma de dos tensiones que variarán a medida que varie el valor de resistencia de la LDR, pero que su suma siempre será 5V. De esta manera tenemos un punto de medición entre la LDR y la resistencia de 10K, lo que nos permitirá medir la variación de resistencia que sufre la LDR debido a la variación… Read more »

Petrus

Buenas, soy ingeniero industrial y tengo una lampara diseñada y prototipada por mi... mi idea es con Led RGB tener un color de luz diferente en función del input (lectura) del sensor de luz en la sala (lux, frecuencias, valores resistencia... )... p.e si esta oscuro color rojo y si hace calor color verde etc. soy un novato con Arduino, me recomendarías realizarlo con el luxometro?

José Álvarez

Buenas Luis, me surgen dos dudas. Para el último código, el del calibrado. A) ¿Qué modelo de LDR te basas? es que no se corresponde con ninguno del datasheet que adjuntas en el texto y además no sé si los valores de la tabla están mal porque si a medida que aumenta la luminosidad disminuye la resistencia no pueden ser mayores los valores de resistencia a luz brillante como dice la tabla, a lo mejor lo que está mal es la unidad que sería ohm y no kohm. B) El 10 por el que multiplicas en la ecuación 'ilum' no… Read more »

Sentencia

Hola.

Es posible que en la tabla de las GL55 las columnas "Resistencia oscuridad" y "Resistencia luz brillante" esten intercambiadas?.

Vlad

Deberías tomar unas 1000 muestras como mínimo y luego sacar el promedio, ya que tomar el dato así nomas del analogRead da mucho error. Es solo una sugerencia. Saludos.

Juan José

Perdón una pregunta: ¿No es necesario declarar el pin analógico como INPUT en el setup? He visto que en los dos primeros códigos lo tienes declarado como INPUT pero en el tercer caso realizas la lectora analógica pero no has declarado LDRPin como INPUT en el setup. No entiendo por qué.
Por cierto, muy buenos tus tutoriales. Enhorabuena.

German

muchísimas gracias
excelente información

Instalación Software Raspberry Pi | Aprendiendo Arduino
Sergio

Hola, muy buenos días.
Me ha gustado mucho este post, pero tengo mucha curiosidad con la fórmula, pero ...
¿Cómo se llegado a determinar la fórmula de iluminación el Luxes?
De donde lo has sacado o como lo has determinado.
Agradecería mucho su respuesta.

ESP8266 en IoT | Aprendiendo Arduino
Mariano

Hola colegas
estoy armando un proyecto e incluí un GL5528 con una resistencia de 10k y estoy viendo que los valores analógicos medidos son muy dispares. Dentro de un cuarto con una luz constante fluctúa de 0 a 490, 790, 990 y no son leves los cambios.
A qué se pueden deber estas variaciones?
Muchas gracias
Mariano

Jaime

Buenas Luis. Pues a mi mis valores me fluctúan de 0 a 1023 cuando someto a la ldr a la propia iluminación de un led a través del arduino ¿a qué se debe? Necesito hacer una barrera láser y de esta forma no lo consigo, ya que no tengo valores estables.
Un saludo!

Antoine Mendez

Buenas Luis, tengo una pequeña duda sobre el calculo del ultimo programa, porque multiplicas la operacion por 10? es por el calibrado de la fotoresistencia o por las veces que la luz parpadea en 50Hz?