ARDUINO: Medir nivel de luz con fotoresistencia



En esta práctica vamos a aprender a utilizar una fotoresistencia o LDR, la cual, es un dispositivo que varía su valor en función de la luz recibida. Es recomendable que vean las ventajas y desventajas de utilizar este sensor en la sección de fotoresistor, así como verificar la hoja de datos para el modelo utilizado ya que podemos encontrar con características diferentes.

NOTA: Aunque verifiquemos datos relevantes en la hoja de datos, es importante considerar que siempre existirán pequeñas variaciones debidas a la fabricación del componente. Un ejemplo muy claro es la tolerancia que se le da a diferentes tipos de resistores para indicar su valor.

Materiales:

  • 1x Arduino

  • 1x Fotoresistor

  • 1x Resistencia 10kΩ

Existen 2 formas de configurar un circuito con fotoresistor

Es importante considerar que en la programación podemos configurar los valores para que ocurra lo contrario, lo que se menciona a continuación es empleando la electrónica.

  1. Mayor luz, mayor voltaje (MLMaV): Al conectar la fotoresistencia al nodo positivo de nuestra fuente de voltaje tendremos que, al incidir una mayor cantidad de luz provocará una menor caída de voltaje o diferencial de potencial entre la fuente y el pin de referencia (Vout) o la tarjeta Arduino, por lo tanto se tendrá una lectura mayor.

  2. Mayor luz, menor voltaje (MLMeV): En pocas palabras la fotoresistencia se conecta al nodo de GND y provocará un comportamiento opuesto al punto 1.

Se puede sustituir la resistencia por un potenciómetro si vamos a cambiar de un estado a otro, por lo tanto la iluminación va a variar, con esto evitamos modificar el código de programación.

Esquema de montaje

El circuito debe realizarse como se muestra en el esquema de montaje y esquema eléctrico correspondiente a esta práctica. Como pueden observar, se crea un divisor de voltaje para poder hacer la lectura de nuestra fotoresistencia, en este caso el Voltaje que se toma como referencia sería entre el fotoresistor y el resistor.

 

Clic en la imagen para ampliar.

Código

Proporcionamos a continuación 2 códigos en los cuales varían únicamente los cálculos aritméticos y se consideran como enteros, de esta manera evitamos números flotantes y así no ralentizar la ejecución del programa. Pueden utilizar el código que mejor les convenga.

Utilizar si LDR está entre GND y A0

const long A = 1000;     //Resistencia en oscuridad en KΩ
const int B = 15;        //Resistencia a la luz (10 Lux) en KΩ
const int Rc = 10;       //Resistencia calibracion en KΩ
const int LDR = A0;   //Pin del LDR
 
int V;
int iluminacion;
 
void setup() 
{
   Serial.begin(115200);
}
 
void loop()
{
   V = analogRead(LDR);         
    iluminacion = ((long)(1024-V)*A*10)/((long)B*Rc*V);  
   Serial.println(iluminacion);   
   delay(1000);
}

Utilizar si LDR está entre Vcc y A0

const long A = 1000;     //Resistencia en oscuridad en KΩ
const int B = 15;        //Resistencia a la luz (10 Lux) en KΩ
const int Rc = 10;       //Resistencia calibracion en KΩ
const int LDR = A0;   //Pin del LDR
 
int V;
int iluminacion;
 
void setup() 
{
   Serial.begin(115200);
}
 
void loop()
{
   V = analogRead(LDR);         
     iluminacion = ((long)V*A*10)/((long)B*Rc*(1024-V));   
   Serial.println(iluminacion);   
   delay(1000);
}