RETO 9: EL SENSOR DE LUZ LDR, OTRO INPUT ANALÓGICO

En esta sesión vamos a trabajar con un pequeño gran sensor que nos va a permitir medir la intensidad de la luz en el entorno donde tengamos realizado nuestro montaje, de tal manera que podamos decidir qué acciones a realizar en función de los umbrales de luz u oscuridad que estimemos oportuno.

.

LDR fotorresistor arduino

.

Un ejemplo de este tipo de sensores es el LDR – Light Dependant Resistor, este fotorresistor, es un componente cuya resistencia interna va a cambiar en función de la luz percibida.

Físicamente un fotorresistor está formado por un material semiconductor, normalmente el compuesto 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. En esencia, la conductividad aumenta cuándo es iluminado, tanto en interior como exterior.

Hay que tener en cuenta que los fotorresistores LDR tienen baja precisión y son dependientes de la temperatura por lo que el uso para los que resultan más adecuados es la medición cuantitativa del nivel de luz para que, mediante la programación reaccione, como decíamos al inicio, con el encendido o apagado de una luz…, un giro para orientar un automatismo o robot…, un movimiento longitudinal de cualquier tipo…

Este tipo de sensores analógicos son maravillosos por la cantidad de prácticas, productos o prototipos que se pueden generar con ellos en el aula, desde una miniciudad domótica cuyas farolas tengan un encendido y apagado automatizado al caer y salir el sol, hasta un seguidor solar que, junto a un servomotor, oriente automáticamente las placas planas de energía solar térmica destinadas a la climatización de una vivienda construida con criterios de sostenibilidad…

…un mundo apasionante que seguro motivará a vuestro alumnado. 

El comportamiento de una resistencia que varía en función de la luminosidad que percibe es el siguiente:

  • Más luz = menor resistencia eléctrica.
  • Menos luz = mayor resistencia eléctrica.

En primer lugar vamos a montar en nuesta placa de prototipado el LDR en solitario para ver qué valores nos da y observar su funcionamiento. En seguida os podréis dar cuenta de las similitudes que guarda con el Reto nº 8 del Potenciómetro (otro resistor variable).

El montaje es muy sencillo ya que el sensor LDR, como resistor que es, carece de polaridad: 

  • Un terminal del LDR a masa o GND.
  • El segundo terminal a través de  una resistencia a 5V.
  • Y a su vez, dicho segundo terminal, a una entrada analógica para realizar la lectura de sus valores, en este caso hemos usado A0.

.

Sensor de luz LDR y arduino

.

El código para comprobar si funciona no tiene misterio. Sólo hay dos instrucciones que conviene destacar:

  • valorLDR = analogRead(pinLDR); Esta instrucción realiza la lectura de los valores del LDR en el pin analógico donde lo hemos conectado (A0). Estos valores variarán en un rango de 0 a 1023 como máximo, siendo valores típicos son de 1 Mohm en total oscuridad, a 50-100 Ohm bajo luz brillante.
  • Serial.println(valorLDR); Esta otra instrucción sirve para sacar su valor a través del monitor serie y que podamos comprobar visualmente cómo al acercar la mano tapando el sensor, y por tanto detectar más oscuridad -menos luz-, los valores irán aumentando acercándose al máximo.
int valorLDR = 0;   //Creamos la variable de tipo número entero para almacenar los datos recogidos del sensor analógico LDR (Light Dependant Resitor). 
int pinLDR = A0;    //Seleccinoamos el pin analógico A0 como input del sensor LDR. 

void setup() { 
Serial.begin(9600); //Inicializamos monitor serie para visualizar los valores de LDR. 
}

void loop() { 
valorLDR = analogRead(pinLDR); //Leemos el valor del pinLDR y lo guardamos en la variable creada.
Serial.println(valorLDR);      //Imprimimos dicho valor, comprendido entre 0 y 1023. 
}

 

EXTRA BALL

En segundo lugar junto con un grupo de leds que se irán apagando a medida que tengamos más luz sobre nuestro LDR. Un posible montaje podría ser este:

.

sensor luz LDR + 5 leds digitales arduino

Llegado a este punto sólo nos queda retaros para que montéis al menos 5 leds para que a medida que el LDR tenga menos luz se vayan encendiendo todos los leds, y al revés, cuando esté en condiciones lumínicas óptimas estén todos apagados. Un buen consejo que os podemos dar es que primero comprobéis cuales son los valores lumínicos en mejores condiciones. Por norma general es muy difícil que llegue a su tope de 1023, a no ser que uséis una luz muy intensa apuntando directamente al sensor. Con ese valor ya podéis empezar a jugar con los diferentes valores que tendréis que configurar para que se enciendan más o menos leds.

A continuación el código para que podáis probar:

.

int valorLDR = 0; //Creamos la variable de tipo número entero para almacenar los datos recogidos del sensor analógico LDR (Light Dependant Resitor).
 
int pinLed1 = 8; //Nombramos los pines digitales que vamos a utilizar para los LEDs. 
int pinLed2 = 9; 
int pinLed3 = 10; 
int pinLed4 = 11; 
int pinLed5 = 12;

int pinLDR = A0; //Seleccinoamos el pin analógico A0 como input del sensor LDR.

void setup() { 
pinMode(pinLed1, OUTPUT); //Configuramos como outputs, o salida de datos, los pines de los LEDs. 
pinMode(pinLed2, OUTPUT); 
pinMode(pinLed3, OUTPUT); 
pinMode(pinLed4, OUTPUT); 
pinMode(pinLed5, OUTPUT);

Serial.begin(9600); //Inicializamos el monitor serie para visualizar los valores del LDR.
}

void loop() { 
valorLDR = analogRead(pinLDR); //Leemos el valor del pinLDR y lo guardamos en la variable creada.
Serial.println(valorLDR); //Imprimimos dicho valor, comprendido entre 0 y 1023.
delay (100);

if(valorLDR < 890) { //Creamos los condicionales que determinarán los intervalos de encendido y apagado de todos los LEDs. 
digitalWrite(pinLed1, LOW); 
digitalWrite(pinLed2, LOW); 
digitalWrite(pinLed3, LOW); 
digitalWrite(pinLed4, LOW); 
digitalWrite(pinLed5, LOW); }

else if((valorLDR >= 891) & (valorLDR < 905)) { 
digitalWrite(pinLed1, HIGH); 
digitalWrite(pinLed2, LOW); 
digitalWrite(pinLed3, LOW); 
digitalWrite(pinLed4, LOW); 
digitalWrite(pinLed5, LOW); }

else if((valorLDR >= 906) & (valorLDR < 920)) {
digitalWrite(pinLed1, HIGH); 
digitalWrite(pinLed2, HIGH); 
digitalWrite(pinLed3, LOW); 
digitalWrite(pinLed4, LOW); 
digitalWrite(pinLed5, LOW); }

else if((valorLDR >= 921) & (valorLDR < 935)) { 
digitalWrite(pinLed1, HIGH); 
digitalWrite(pinLed2, HIGH); 
digitalWrite(pinLed3, HIGH); 
digitalWrite(pinLed4, LOW); 
digitalWrite(pinLed5, LOW); }

else if((valorLDR >= 936) & (valorLDR < 950)) { 
digitalWrite(pinLed1, HIGH); 
digitalWrite(pinLed2, HIGH); 
digitalWrite(pinLed3, HIGH); 
digitalWrite(pinLed4, HIGH); 
digitalWrite(pinLed5, LOW); }

else if(valorLDR >= 951) { 
digitalWrite(pinLed1, HIGH); 
digitalWrite(pinLed2, HIGH); 
digitalWrite(pinLed3, HIGH); 
digitalWrite(pinLed4, HIGH); 
digitalWrite(pinLed5, HIGH); }

}