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, nos dará un valor numérico proporcional a la cantidad de iluminación que reciba.
  • Más luz = menor resistencia eléctrica, por tanto, menor valor numérico. 
  • Menos luz = mayor resistencia eléctrica, por tanto, mayor valor numérico. 
En primer lugar vamos a montar en nuestra 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. Tenemos dos opciones de montaje, leer los datos a través del terminal que va a 5V (OPCIÓN A) y a través del terminal que va a GND (OPCIÓN2). Este tipo de montaje electrónico se conoce como DIVISOR DE TENSIÓN. Su uso es muy común, ya que sirve para medir el cambio de una resistencia: 
  • 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.

OPCIÓN A

.
Sensor de luz LDR y arduino
.
Un pequeño recordatorio, el resistor se trata de una resistencia fija, que no varía, mientras que el LDR es una resistencia variable. En este montaje electrónico lo que sucede es que el circuito se comporta de forma inversa al sensor, el voltaje sube al bajar el nivel de luz (o lo que es lo mismo, a mayor resistencia Ω de la LDR conseguida con menor luminosidad, mayor voltaje por la salida A0. Y su inverso, a menor resistencia Ω de la LDR conseguida con mayor luminosidad, menor voltaje por la salida A0). 

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 los 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;    //Seleccionamos 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. 
}


Existe otra posibilidad de montaje electrónico, en la cual el voltaje (medido a través del pin A0) disminuirá al bajar la resistencia de la LDR, y aumentará cuando crezca ésta, es decir, que el voltaje de salida sigue las variaciones de la luz en el mismo sentido que ésta. Dicho de otra manera, el voltaje sube al subir el nivel de luz (o lo que es lo mismo, a menor resistencia Ω de la LDR conseguida con mayor luminosidad, mayor voltaje por la salida A0. Y su inverso, a mayor resistencia Ω de la LDR conseguida con menor luminosidad, menor voltaje por la salida A0). 

OPCIÓN B

.
Arduino LDR
.

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); }

}

Comentarios

Entradas populares de este blog

Tutorial sensores de gas MQ2, MQ3, MQ7 y MQ135