3.-ANALÓGICO: EL LDR

LDR


ÍNDICE:
0.- TEORÍA: EL LDR
1.- MONTAJE CON ARDUINO.
2.- THEREMÍN. 
3.- MAPEADO DEL LDR
4.- EL SENSOR BH1750 (GY-302).





0.-TEORÍA: EL SENSOR DE LUZ LDR

Hasta ahora hemos trabajado con resistencias de valor fijo, pero existen una serie de resistencias que varían según distintos parámetros físicos, como presión, luz y temperatura entre otros. Existe una gran variedad que se utilizan para construir lo que llamamos sensores. En esta práctica vamos a diseñar un circuito que sea sensible a la luz. El objetivo será regular la intensidad luminosa de un led con una LDR, una resistencia sensible a la luz.

 Las LDRs son muy útiles para construir instalaciones sensibles a la luz (o a la oscuridad) y también se pueden emplear para fabricar barreras de luz (colocamos un puntero láser enfocando constantemente a la LDR y cuando “algo” interrumpa la luz del láser, la LDR dispara un evento para detectar esa acción.)


 1.- MONTAJE CON ARDUINO (LDR a 5Voltios)

Usaremos un sensor de luz LDR (light-dependent resistor), una resistencia eléctrica y un LED. La idea es que cuando la intensidad luminosa disminuya un cierto umbral, el LED se active.

El sensor LDR es un sensor resistivo (fotoresistor), es decir que su resistencia eléctrica varía en función de la luz que recibe. 


El valor resistivo del propio LDR es bajo. Cuando hay luz unos 100 ohmios y muy alto cuando está a oscuras (en torno a 1MOhmio). 

Como todo sensor debemos conectarlo a un divisor de tensión (Pull-up o Pull-down). 

Como el LDR es un sensor analógico, para leer sus medidas, tenemos que conectarlo a una entrada analógica de Arduino. 

Si tapamos o acercamos el sensor a la luz veremos cómo cambian las medidas a través del monitor serie.

El valor de la resistencia (R1) marcará la sensibilidad de las medidas y dependerá también del rango de resistencias que nos proporcione el LDR. Puedes empezar con una resistencia de 1KOhmio.


Esquema para el sensor LDR (montaje en PULL-DOWN):




CÓDIGO

#define pinLED 11  //puerto PWM
void setup() {  
  pinMode(pinLED, OUTPUT);
  Serial.begin(9600);
}
void loop() {   
  int v = analogRead(A0);
  if (v < 600) digitalWrite(pinLED, HIGH);
  else digitalWrite(pinLED, LOW);
  Serial.println(v);
}




ACTIVIDADES:

1.- Realiza el mismo montaje pero esta vez en PULL-UP y analiza su funcionamiento. 

 
2.- Modifica el montaje sustituyendo la resistencia fija del LDR por una variable (potenciómetro). Comprueba que en este caso, se puede ajustar manualmente el valor de umbral de salto del LDR. 

3.- Calcula los valores de tensión que se produce en un divisor de tensión formado por una pila de 5voltios y dos resistencias en serie de 1 KOhmio y 500 Ohmios según la ley de Ohm.







2.- THEREMÍN (esterófono).
Es el primer sintetizador electrónico inventado en 1919 por el ruso Lev Termen que presenta como hecho cursioso que para provocar sonido no es necesario ningún contacto físico con el instrumento.

Video Lev tocando. 
Video theremín moderno.
Video theremín música tecno con láser.


CÓDIGO THEREMÍN

int pinSPEAKER = 12;   //Salida para SPEAKER
#define pinLED 11  // Salida PWM para LED
int pinLDR = 0;  //Entrada analógica A0 para LDR
void setup() {
  pinMode(pinLED, OUTPUT);
  pinMode(pinSPEAKER, OUTPUT);
  Serial.begin(9600);
}
void loop() {
  int v = analogRead(pinLDR);
  if (v < 600) digitalWrite(pinLED, HIGH);
  else digitalWrite(pinLED, LOW);
  Serial.println(v);
  int pitch = 200 + v / 4;  //escala de salida para que los sonidos no empiecen muy graves
  tone(pinSPEAKER, pitch);
}




2.- MAPEADO DEL LDR.
 

En ocasiones, los valores que obtenemos de una lectura de un pin, como un sensor, pueden estar fuera de una escala determinada, y tenemos que convertirlos a otro rango para poder usarlos.

El valor de salida que podemos darle al led es de 0 a 255, que se traduce en su nivel de luminosidad, pero los datos que leemos del sensor pueden llegar a 1024.

Como Arduino sólo puede leer voltajes, y muchos sensores son resistivos, (varían la resistencia) usamos estos divisores resistivos para leer este tipo de sensores.

Por esto debemos mapear el resultado, es decir , dejarlo en unos valores de entre 0 y 255.

La función “map” del programa asigna un valor máximo y un valor mínimoa un rango dado.

El valor máximo suele estar en 1024, pero el mínimo dependerá de las condiciones de luz en las que realicemos la práctica. Por eso en el código se especifican 2 variables que deberemos colocar a mano: bajo_LDR y alto_LDR.


Por ejemplo si hacemos una lectura previa de lo que nos devuelve el LDR y los valores mínimo y máximo son: 917, 1024 . La solución será mapear esos valores para que, en caso de obtener el valor 917 (el equivalente a cierta intensidad luminosa), el led verde se apague. 



CÓDIGO DE MAPEADO E ILUMINOSIDAD DE UN LED
/* Regular la luminosidad del LED con LDR */
int LED = 11;  //este puerto es del tipo PWM con valores entre 0 y 255.
int LDR = A0;
int INTENSIDAD;
int BAJO_LDR = 0; //Modificar según luminosidad (máx/mín)
int ALTO_LDR = 1024;
int VALOR_LDR=0;
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop() {

VALOR_LDR= analogRead(LDR);            //lectura del sensor
Serial.print("valor analogico leido:  ");     

Serial.println(VALOR_LDR);                    //monitorizamos el valor leído
INTENSIDAD = map(VALOR_LDR, BAJO_LDR, ALTO_LDR, 0,255);   //mapeado del valor
Serial.print("valor analogico mapeado:  ");  
Serial.println(INTENSIDAD);                          //monitorizamos el valor mapeado
// Si sobre la LDR oscurece el LED aumenta su luminosidad
analogWrite(LED,INTENSIDAD);    //enviamos onda cuadrada PWM según intensidad
Serial.println("__");
delay (3000);
}




3.- EL SENSOR BH1750 (GY-302)

Aparte de las resistencias LDR, que varían su resistencia según la luz que incide sobre ellas, también existen sensores de luz mas precisos y que devuelven la lectura obtenida en una unidad de medida estándar, en este caso en Lux. Para ello, se utiliza un módulo de sensor BH1750 y una librería específica que lo gestiona y nos facilita la escritura del código. 

El sensor que nos ocupa, el BH1750, es un sensor digital que se comunica por I2C, permite obtener una lectura de 1 a 65.535 lux con una precisión de 1 lux, aunque según como se configure el sensor se puede cambiar la precisión a 0,5, 1 y 4 lux para aumentar así el rango de lectura, según el datasheet a 4 lux la medida leída puede ser de hasta 100.000 lux.

LA ILUMINANCIA es la medida de como el flujo de luz incide sobre una superficie. La iluminancia se mide un  lúmenes y representa la medida de la cantidad total de intensidad de luz sobre una superfice.

EL LUMEN es una unidad de cantidad de luz que  fluye de una fuente en  un  segundo. Y el lux mide la iluminancia por metro cuadrado.


Lux = 1 Lm/m2
Ejemplos de Lux:
  • Noche: 0.001—0.02
  • Luz Lunar: 0.02—0.3
  • Nublado Interior: 5—50
  • Nublado Exterior: 50—500
  • Soleado Interior: 100-1000
  • Luz minima para la lectura: 50—60
  • Intensidad estándar sistema de video hogareño: 1400

El BH1750 es un sensor digital de intensidad de luz ambiente, tiene un conversor ADC de 16bits interno. Esta es una versión mejorada del típico sensor de luz a base de un LDR, el cual simplemente entrega un valor analógico.

El BH1750, nos entrega automáticamente el valor En Lux (desde 1 lx hasta 65535 lx),  y se comunica por I2C, con la posibilidad de seleccionar 2 Address.


Caracteristicas Técnicas

  • Interfaz digital a través de bus I2C con capacidad de seleccionar entre 2 direcciones
  • Respuesta espectral similar a la del ojo humano
  • Reliza mediciones de luz y convierte el resultado a una palabra digital
  • Amplio rango de medición 1-65535 lux
  • Modo de bajo consumo de energía
  • Rechazo de ruido a 50/60 Hz
  • Baja dependencia de la medición contra la fuente de luz: halógeno, led, incandescente, luz de día, etc.
  • Es posible seleccionar dos direcciones de esclavo (I2C).
  • La influencia del espectro infrarojo es baja.
  • Voltaje 3.3v-5v





 CONEXIONADO CON ARDUINO:
VCC>>3.3V. o 5v. ARDUINO
GND>> GND ARDUINO
SLC>> PINA5 ARDUINO
SDA>> PINA4 ARDUINO
ADDR>> SIN CONEXION PINA3 ARDUINO
Se puede poner el pin ADDR (addres o direccion) a GND directamente para que la direccion del i2c del modulo sea 0x23.


CÓDIGO DEL LUXÓMETRO BH1750:
Previamente obtener la librería: https://github.com/claws/BH1750

#include <Wire.h>
#include <BH1750.h>
BH1750 Luxometro;
void setup(){
  Serial.begin(9600);
  Serial.println("Inicializando sensor...");
  Luxometro.begin(BH1750_CONTINUOUS_HIGH_RES_MODE); //inicializamos el sensor
}
void loop() {
  uint16_t lux = Luxometro.readLightLevel();//Realizamos una lectura del sensor
  Serial.print("Luz(iluminancia):  ");
  Serial.print(lux);
  Serial.println(" lx");
  delay(500);
}



ACTIVIDAD: 
1.- Encendido de un led de forma automática.
En este ejemplo encenderemos a apagaremos un led (que podría ser un foco de tu fachada o jardín) de acuerdo al nivel de luz que sensamos, de esta forma el foco se encenderá de forma automática en la noche y se apagará en el día.
Este ejemplo trabajaremos para simular un foco el led del pin13, pero fácilmente podrían conectarlo a un módulo relé o triac e implementarlo con un foco de 200V


El sketch es el siguiente:
#include <Wire.h>
#include <BH1750.h>
BH1750 Luxometro;    //inicializa la libreria
long LUZ_NOCHE=20;
long LUZ_DIA=30;
int LED=13;
void setup() {
  Serial.begin(9600);
  Serial.println("Inicializando sensor...");
  Luxometro.begin(BH1750_CONTINUOUS_HIGH_RES_MODE); //inicializamos el sensor
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
}

void loop() {
  uint16_t LUZ = Luxometro.readLightLevel();  //Realizamos una lectura del sensor
  Serial.print("Luz(iluminancia): ");
  Serial.print(LUZ);
  Serial.println(" lux");
  if(LUZ<LUZ_NOCHE) {
      digitalWrite(LED, HIGH);
      Serial.println(" Noche  - Foco Encendido");
  }
  else if(LUZ>LUZ_DIA) {
      digitalWrite(LED, LOW);
      Serial.println(" Dia - Foco Apagado");
  }
  delay(2000);
}

HISTÉRISIS EN PROGRAMACIÓN
(La histéresis  es la tendencia de un material a conservar una de sus propiedades, en ausencia del estímulo que la ha generado):
Notar que tenemos dos umbrales para determinar si es día o noche, Lux_noche inferior a este valor de lux lo consideramos noche, Lux_dia superior a este valor lo consideramos dia, y valores entre Lux_noche y Lux_dia lo consideramos un estado de histéresis, en donde mantendremos el valor anterior del foco, esto con el fin de no hacer oscilar y no quemar el foco, puesto que si tuviéramos un solo umbral cuando nos encontremos justo en este valor cualquier variación pequeña de luz haría que el foco se encienda y apague pudiendo malograr el foco o simplemente dar una mala iluminación.