Seleccionar página

Cómo Utilizar LDR con Arduino – Fotorresistencia

por | Oct 20, 2014 | Componentes

Fotorresistencia LDR
En este post te voy a enseñar cómo utilizar LDR con Arduino. Un circuito simple con este componente te puede resultar muy útil en tus proyectos domóticos (basta con utilizar tu LDR junto con Arduino y un relé para crear sistemas autónomos), aunque puedes utilizarlo en cualquier proyecto en el que desees regular actuadores (motores, relés, etc.) en función de la luz.

Fotorresistenias LDR con Arduino

Las LDR (Light-Dependent Resistor) son resistencias cuyo valor resistivo (Ohmios) varía en función de la luz que incide sobre ellas. Esto las hace especialmente útiles cuando deseas realizar un proyecto que depende de la luz ambiente. Sin embargo, esta no es la única utilidad que le puedes dar a tus LDR con Arduino. Las LDR no solo se ven afectadas por la luz visible. Su valor resistivo también varía con la luz infrarroja y ultravioleta.

Las LDR están compuestas generalmente por sulfuro de cadmio (CdS). El cadmio que contienen reacciona ante la luz, dejando que sus electrones se muevan libremente, lo que permite el paso de la corriente. Gracias a esto, una fotorresistencia puede pasar de varios MΩ en ausencia total de luz, a unos pocos de Ohmios (típicamente 100Ω) cuando recibe luz directa, en décimas de segundo.

Puedes pensar en el comportamiento de las LDR como en el de un potenciómetro que varía en función de la luz. La variación de la resistividad de este componente electrónico permite utilizar LDR con Arduino de forma simple ya que, al variar la resistividad en un circuito, se producen cambios en el voltaje y la corriente que circulan por él, que no te será difícil gestionar con Arduino.

Cómo Utilizar LDR con Arduino

Para utilizar LDR con Arduino, la opción más simple es crear un divisor de tensión y analizar con tu microcontrolador las variaciones de voltaje que se producen en tu circuito.

Divisor de Tensión

Un divisor de tensión es un circuito muy utilizado cuando se quiere regular el voltaje que le llega a un componente, circuito, etc. Está compuesto generalmente por dos resistencias en serie, conectadas entre una fuente de tensión (batería, pila…) y tierra. Cuando conectas entre ambas resistencias el elemento sobre el que deseas obtener un voltaje específico, basta con que encuentres los valores de ambas resistencias que te proporcionan dicha tensión.
Diagrama Divisor de Tensión

Nota: En este post tienes un ejemplo clásico del uso de divisores de tensión.

La idea en este caso es que una de esas resistencias sea tu LDR. Como ves, utilizar LDR con Arduino es realmente simple. Sin embargo, en función de dónde coloques tu LDR (cuál de las dos resistencias de tu divisor de tensión sea la fotorresistencia) y del valor de la otra resistencia, tus resultados variarán.

Un factor que mucha gente no tiene en cuenta cuando realiza un divisor de tensión es la corriente. No te preocupes, lo verás más adelante. Al ser un tema que la mayoría de la gente descuida, quería recordártelo para que a ti no te pase.

Como te he comentado antes, a la hora de realizar tu divisor de tensión, tienes varias opciones:

A Mayor Luz, Mayor Voltaje

Si conectas tu LDR con la fuente de voltaje, cuanta más luz incida sobre tu fotorresistencia, menor será la diferencia de potencial (caída de voltaje) que tendrás entre la fuente y tu Arduino, con lo que placa de Arduino leerá un valor mayor.
Divisor de Tensión Alto con LDR

De la misma forma, cuanto mayor sea la otra resistencia (que en este caso va conectada a tierra) mayor será la caída de voltaje que tendrás entre tu Arduino y tierra. Como en tierra (GND) tienes 0V y eso no varía, cuanto mayor sea la resistencia, mayor será el valor de tensión que llegará a tu placa.

En el caso de la corriente el planteamiento es similar. Si incide una gran cantidad de luz sobre tu LDR, su resistencia se reducirá y la corriente que llegará a tu microcontrolador será mayor. Si la otra resistencia (la que está a tierra) es grande, dificultará el paso de la corriente a través de ella, y esta pasará por tu placa Arduino.

Si esto que te acabo de contar te parece un poco lioso, échale un ojo a la ley de Ohm. Apúntala en un papel y empieza a jugar con los términos, verás como te aclaras enseguida (si no, recuerda que puedes preguntar lo que quieras al final de este artículo).

A Mayor Luz, Menor Voltaje

Si la explicación anterior te ha quedado clara, entenderás rápidamente el funcionamiento de este circuito (en caso contrario, y a riesgo de que me llames pesado, pregunta tus dudas en la sección de comentarios al final del post). Es justo el comportamiento opuesto al anterior, así que no creo que haga falta que entre en detalles.
Divisor de Tensión Bajo LDR
Tanto si te decides por utilizar la primera opción como la segunda, puedes modificar el comportamiento de tu circuito mediante código, es decir, puedes conectar tu LDR a la fuente de voltaje y conseguir que tu sistema se comporte como si la hubieses conectado a tierra. Esto hace mucho más flexible el tipo de circuito que puedes montar al utilizar LDR con Arduino.

Divisor de Tensión + Potenciómetro

Una mejora simple a cualquiera de las dos configuraciones anteriores es la incorporación de un potenciómetro. De nuevo, tienes varias opciones:

  • Puedes sustituir tu resistencia (la resistencia normal, no la LDR) por un potenciómetro, con lo que podrías fácilmente modificar tu sistema si vas a cambiarlo de sitio a otro en el que la cantidad de luz sea diferente. Así evitarías tener que modificar el código de tu Arduino.
LDR con Potenciómetro
  • Si la fuente con la que alimentas tu divisor de tensión tiene un voltaje elevado, es posible que a tu Arduino le lleguen demasiados voltios (con lo que podrías destruirlo). Poniendo un potenciómetro entre tu divisor de tensión y tu placa Arduino puedes regular de forma más precisa la tensión que le llega al microcontrolador. Esto también puedes hacerlo con una resistencia estándar. Sin embargo, puede ser útil utilizar un potenciómetro si tu fuente se gasta, es decir, si tienes una pila o batería que, con el transcurso del tiempo, va reduciendo el voltaje que le proporciona a tu circuito. A medida que la batería se va gastando, tú vas reduciendo la resistividad de tu potenciómetro.

Calibrar la Fotorresistencia LDR

Cuando utilizas LDR con Arduino (de la misma forma que cuando utilizas cualquier componente o sensor analógico), lo que haces es medir el voltaje que llega a tu placa y convertirlo en un valor digital.

La mayor parte de las placas Arduino trabajan con un rango de voltaje de entre 0V y 5V (de ahí que te tengas que asegurar que en tu circuito el máximo voltaje que puede llegar desde tu divisor de tensión a tu microcontrolador es 5V) y convierten el valor analógico que les llega a un valor digital entre 0 y 1024.

Para conseguir que esta conversión sea lo más eficiente posible (lo que te proporcionará una mayor precisión), puedes delimitar mediante código los valores máximos y mínimos de luz con los que va a trabajar tu sistema de modo que la conversión Voltaje/Valor Digital mejore, es decir, que entre 0 y 1024 solo haya valores probables de luz y no estés dedicando parte de esos valores a cantidades de luz con las que realmente tu circuito no va a trabajar (por ejemplo, es absurdo dedicar parte de los valores del rango entre 0 y 1024 a valores de luz que corresponden a estar iluminando tu LDR con una linterna si en la práctica no va a recibir más que la luz solar).

Aquí tienes un ejemplo de código que cumpliría esta función:

//Cómo Utilizar LDR con Arduino – Calibrando la LDR”>

// Variable que almacena temporalmente los valores del rango de funcionamiento
int ValorLDR;

// variable que almacena el valor mínimo del rango de valores 0-1024
int Valormin = 1023;

// variable que almacena el valor máximo del rango de valores 0-1024
int Valormax = 0;

//Nota: Es posible que sea necesario modificar los valores iniciales de Valormin y Valormax
//en función de la configuración de divisor de tensión que se haya utilizado

//Variable que almacena el tiempo en milisegundo durante el que se desea que el
//sistema esté calibrando
int TCal=5000; // 5000 = 5segundos

//Se utiliza el LED del pin 13 para conseguir una visualización clara del tiempo
//durante el cual se está calibrando el circuito
const int LEDPin = 13;

void setup() {

//Se establece LEDPin como salida y se le da un valor lógico alto para que el LED
//brille
pinMode(LEDPin, OUTPUT);
digitalWrite(LEDPin, HIGH);

//Se utiliza un bucle con el tiempo que se desea que el sistema esté calibrando.
//La función millis() cuenta el tiempo que ha transcurrido desde que se enciende
//la placa Arduino
while (millis() < TCal) {
//Se almacena el valor actual del sensor
ValorLDR = analogRead(A0);

//Se supone que el divisor de tensión está conectado a A0. Puede cambiarse esta
//conexión a cualquier otra entrada analógica. Basta con modificar la variable
//leída en la función analogRead()

//Si el valor de la última comprobación es mayor que el que había guardado
//hasta el momento, se actualiza la variable
if (ValorLDR > Valormax) {
Valormax = ValorLDR;
}

//Si el valor de la última comprobación es menor que el que había guardado
//hasta el momento, se actualiza la variable
if (ValorLDR < Valormin) {
Valormin = ValorLDR;
}
}
//Se apaga el LED del pin 13 para que se aprecie la finalización del calibrado
digitalWrite(LEDPin, LOW);
}

Espero que no te cueste demasiado comprender el código (de nuevo, pregunta cualquier duda). Está pensado para que puedas copiarlo fácilmente a tu sketch de modo que, con unas pocas modificaciones, te sea simple utilizar LDR con Arduino de forma eficiente. No he querido poner un código para un proyecto concreto para que te resulte más cómodo adaptarlo a tu proyecto.

Seguro que son muchas las mejoras que se le pueden hacer a este código. Si conoces alguna te animo a comentarla al final de este post.

Información Extra

Llegados a este punto, no deberías tener ningún problema a la hora de utilizar LDR con Arduino. A partir de aquí (como me gusta decir) el límite es tu imaginación. Sin embargo, hay algunos tips que pueden ayudarte:

  • Si todavía no tienes tus Fotorresistencias, puedes hacerte con un pack de 10 por menos de 1€ (1.28$) en este link.
  • En función de la fuente con la que alimentes tu divisor de tensión, debes elegir unos componentes u otros. No me refiero únicamente a los Ohmios de tus resistencias. Tienes que asegurarte de que tus componentes pueden disipar la potencia a la que los estás sometiendo y que la corriente que entra a tu Arduino es menor que 40mA (puedes encontrar más información sobre esto a lo largo de este post).
  • Si la fuente de alimentación que utilizas tiene un voltaje menor a los 5V con los que trabaja tu microcontrolador, sucede algo similar a lo que viste acerca del proceso de calibrado de la LDR. Como trabajas a menos de 5V pero el rango de valores digitales (0-1024) sigue estando pensado para una entrada entre 0V y 5V, estás perdiendo precisión. Puedes evitar esto conectando al pin de tu placa Aref tu voltaje de trabajo (el de la fuente que estés utilizando), con esto y la función de Arduino analogReference(EXTERNAL); (dentro del setup de tu código) puedes conseguir que el rango de valores digitales (0-1024) se reparta entre 0V y la tensión de tu fuente (Vcc).
  • Durante todo este artículo te he estado hablando de conectar tu divisor de tensión a una fuente externa. Esto se debe a que quería que esta entrada fuese lo más genérica posible. Sin embargo, la fuente que alimenta tu divisor de tensión puede ser tu propia placa de Arduino. Si este es tu caso, puedes despreocuparte de tener tensiones o corrientes demasiado elevadas y bastaría con utilizar componentes que disipen 0.25W (que es el valor comercial más común).
  • Si la luz que va a incidir sobre tu circuito varía rápidamente y no quieres que tu sistema se vea muy afectado por ello, puedes utilizar un condensador (puedes leer más acerca de este componente en este artículo) cuyo tiempo de carga y descarga ralentice el proceso.
  • En el caso contrario al anterior, debes tener en cuenta que las LDR no responden bien a los cambios bruscos de luz (suelen tardar entre 10ms y 20ms en adaptarse). Si necesitas que tu circuito responda más rápidamente a los cambios, puedes utilizar un fotodiodo.

Hasta aquí el post. Si tienes alguna duda, consejo o simplemente quieres contar tu experiencia al utilizar LDR con Arduino, te animo a que comentes el post.

Como siempre te digo, puedes suscribirte al blog para no perderte ningún artículo de EducaChip y, si te ha gustado, dale a los botones sociales que tienes al principio y al final de este artículo para compartir el contenido.

Un saludo, Enrique.

Actualmente me dedico, entre otras cosas, a crear contenidos sobre Arduino y otros dispositivos eléctricos. Me encanta todo lo relacionado con el “Universo Maker”.

Siempre estoy activo en los comentarios. Si tienes cualquier pregunta, no dudes en dejármela en los comentarios. Intentaré responderte lo antes posible… Un abrazo smile

Enrique Romero,

Autor del post.

¿No quieres perderte nada? ¡Suscríbete!

31 Comentarios

  1. Hola, es posible hacer un delay de 15 minutos?

    Responder
    • Buenas Cristian,

      Se puede realizar sin problema. smile

      Un saludo, Enrique.

      Responder
    • 15 minutos * 60 segundos/minuto * 1000 milisegundos/segundo= 900000 milisegundos.
      Como una variable int sólo llega hasta 32767, debes cambiar la linea:
      int TCal=5000;
      por
      unsigned long TCal=900000;

      Responder
  2. hola, como puedo expresar estas variaciones en la resistencia en forma de lux?

    Responder
    • Buenas Mauricio,

      Viendo el datasheet deberías encontrar información relativa a la resistividad en función de la cantidad de luz.

      Un saludo, Enrique.

      Responder
  3. Que onda Enrique

    Estoy haciendo un arpa con arduino y sera una interrupción láser para tocar la cuerda del arpa, pero el detalle es que ya lo había echo antes con una guitarra y al no colocar resistencias se me descompuso el láser por recibir mucha intensidad de corriente todo el tiempo, quiero evitar esto y necesito saber que resistencia utilizar para los láseres y como quedaría el circuito

    GRACIAS, espero con ansias tu respuestas

    Responder
    • Buenas Abraham,

      Puedes considerar tu láser como un LED. Para considerar la resistencia te puede ser útil este post.

      Un saludo, Enrique.

      Responder
  4. Después de haber hecho cálculos con la Ley de Ohm sigo sin entender por qué hace falta hacer el divisor de tensión. ¿Por qué no puedo conectar el LDR directamente a arduino? Me explico… En un extremo del LDR: 5v, en el otro, el pin analógico de arduino. Entiendo que si hay mucha luz, la resistencia será 0, esto significa que no habrá caída de tensión y en el otro extremo de la LDR habrá 5v. Si hay poca luz, la resistencia será máxima y, en el otro extremo de la LDR habrá 0v. Seguro que algo estoy haciendo mal, pero no entiendo el qué… Y por eso llego a la conclusión de que no sé por qué hay que hacer un divisor de tensión ni qué pinta esa segunda resistencia.

    Responder
    • Buenas Javi,

      Lo que estás haciendo es pensar smile y con eso llegarás lejos con la electrónica.

      Si tienes la cantidad de luz suficiente para que tu LDR tenga el mínimo valor posible (supongamos 0 Ohm) y estás alimentando con 5V, calcula con la Ley de Ohm el valor de corriente que tendrías y verás el porqué.

      Un saludo, Enrique.

      Responder
  5. cual es tu apellido enrique?

    Responder
  6. Hola Enrique.

    ¿ Es posible usar las interrupciones de Arduino con las entradas analógicas?. Es decir, es que tengo un luxómetro y quiero que este me recoja la medida cada vez que salte la interrupción cuando se active un sensor inductivo a flanco descendente. Las dos me funcionan por separado pero cuando lo uno en el mismo código, el luxómetro no me recoge medidas. Espero haberme explicado bien.
    Gracias.

    Responder
    • Buenas Óscar,

      Aunque el mundo de las interrupciones va más allá de lo que he explicado aquí, de forma simplificada solo puedes utilizar para interrupciones los pines destinados a ello en cada placa (puedes ver una tabla de cuáles son esos pines en el enlace que te he puesto).

      De cualquier forma, puedes establecer la interrupción de tu sensor por una parte y modificar el valor de algún parámetro en tu programa para que se active la toma de datos de tu luxómetro.

      Un saludo, Enrique.

      Responder
  7. buenas noche;
    mira mi pregunta es yo estoy utilizando una raspberry y una arduino para un sensor de luz laser, pero necesito que la lectura que obtenga la arduino sea en corriente y no en voltaje que tendria que hacer??’
    oh mejor dicho necesito que la respuesta de la fotoresistencia sea lineal, debido a que necesito medir la luz laser en diferentes posiciones. como calibraria la fotoresistencia con la luz laser que tengo…
    al yo medir el voltaje de la fotoresistencia con la luz laser el me disminuye este voltaje y si tapo el sensor el valor va a aumentar… yo tengo una fotoresitencia pequeña y una resistencia de 100k

    Responder
    • Buenas Paola,

      La curva característica de una fotorresistencia no es lineal, para eso puedes sustituirla por un fotodiodo.

      Un saludo, Enrique.

      Responder
  8. Hola Enrique, estoy haciendo un proyecto de investigación para el instituto y tengo que hacer un programa.
    Este programa consiste en poder conocer el sentido en el que va un objeto que pasa por enfrente de mis LDR y no sé que comandos utilizar para averiguarlo, es decir, si va para la derecha, lo sabré porque habra trapado en primer lugar el LDR situado a la izquierda, y al revés. Gracias por su ayuda de antemano.

    Responder
    • Buenas Pablo,

      Puedes utilizar las funciones de analogread() para ver cuándo varía el valor de voltaje porque el objeto haya tapado la luz y la función millis() para calcular el tiempo en el que eso sucedió y compararlo con la otra LDR.

      Un saludo, Enrique.

      Responder
  9. como puedo hacer para que sean 8 led y 8 fotoceldas?
    no entiendo la programacion…

    Responder
    • Buenas Brayan,

      El código que tienes en el post se ajusta a una calibración del sistema. Sin embargo, para ampliar el proyecto base a 8 LEDs y 8 LDRs bastaría con replicar el código de lectura del voltaje en los pines de los LDRs y poner ese voltaje sobre tus LEDs.

      Un saludo, Enrique.

      Responder
  10. Buen aporte Enrique.
    Tengo una duda y la verdad no se si sea posible.. hacer variar el voltaje de un motor al detectar una línea usando un sensor infrarrojo.. no se si me explico.. lo que quiero es que cuando el sensor infrarrojo detecte el cambio a color blanco mande una señal para subir el voltaje del motor…es algo pequeño de 9V a 12V

    Responder
    • Buenas Alvic,

      Puedes hacerlo pero será un circuito un pelín complejo. Te doy una idea: Lees el valor luminoso por las entradas analógicas de Arduino y regulas el circuito que controla tu motor utilizando las salidas PWM de tu Arduino.

      Un saludo, Enrique.

      Responder
  11. Hola Enrique:
    Te felicito por tus aportes.
    Soy docente de electrónica de secundario, y quería preguntarte si tienes un proyecto tangible , que funcione , sobre r.f y arduino o algo similar, ya que doy sistemas de telecomunicaciones, y cuesta conseguir un proyecto que funcione en verdad .Gracias y espero tu respuesta

    Responder
    • Buenas Nelson,

      Aun no he publicado ningún post sobre ese tipo de módulos (aunque lo tengo en mente). En cualquier caso, hay módulos realmente simples de utilizar, sobre todo de AM y que cuestan menos de 2€. La verdad es que para hacer trabajos en grupo con los alumnos me parece una idea estupenda.

      Si te pones a ello y tienes cualquier duda, no dudes en preguntar smile

      Un saludo, Enrique.

      Responder
  12. Hola Enrique, qué buena información proporcionaste, muy útil.
    Pero me tengo una duda, ¿cómo puedo ir dando pequeños intervalos a los valores de la LDR? Me explico; quiero que entre los valores de 0 a 150 realice cierta operación y que de 151 a 400 obedezca otra instrucción. He intentando con if() pero no me funciona. ¿Podrías ayudarme? Gracias.

    Responder
    • Buenas Juan,

      Puedes utilizar las entradas analógicas, guardar el valor y utilizarlo con sentencias tipo if().

      Un saludo, Enrique.

      Responder
      • Hola Enrique te quiero hacer una consulta.
        Si sabes como podría conectar una fotorresistecia que prenda cuando uno pasa una linterna con luz por encima. Fotoresistencia con 74hc390 – 74ls 47 y un display anodo comun de 7 segmentos?
        Encuentro solo informacion en ingles…
        de antemano muchas gracias!!!

      • Buenas Pau,

        Con una entrada analógica puedes saber la cantidad de luz que estás recibiendo en función del voltaje que recibas. Puedes utilizar esos valores de voltaje y establecer con ellos rangos para saber cuándo se está pasando la linterna por encima y qué hacer en el display.

        Un saludo, Enrique.

  13. Hola, muchas gracias por el tutorial, resulta muy instructivo. Quisiera preparar un luxómetro con Arduino como práctica de un curso que estoy realizando, y que establezca unos niveles objetivos de 200, 300, 500 y 750 lux, que son los niveles mínimos en edificios educativos, pero no veo nada claro cómo se puede establecer esa relación de iluminancia con el voltaje que debe llegar a la placa o si la LDR tiene la suficiente precisión para medir esto.
    Un saludo y gracias de nuevo

    Antonio

    Responder
    • Buenas Antonio,

      La LDR lo que hace es provocar una mayor caída de voltaje cuanto menor es la luz que recibe. Si alimentas esa resistencia a 5V y lees el valor que recibe Arduino al pasar por ella ese voltaje, obtendrás un voltaje relativo a la luz ambiente que tu Arduino puede conocer a través de una entrada analógica.

      Salvo que quieras mucha precisión, un LDR está bien, si no, puedes utilizar un diodo receptor de luz (la versión opuesta al LED).

      Un saludo, Enrique.

      Responder
  14. Hola, muchas gracias x la info es justo lo que estaba buscando para uno de mis proyectos con arduino. Aunque queria hacer una consulta quizas me puedas ayudar ya que aun soy nuevo en arduino, existe alguna manera de que con ldr pueda activar parte de codigo de arduino, no se si me explico. Ej k mientras la ldr no reciba la sufiente luz una parte del codigo del aurduino se mantenga como en espera.
    Bueno como dije anteriormente gracias por la info muy buen post.
    Saludos.

    Responder
    • Buenas Nicolás,

      Tienes varias opciones para hacer eso:

      1.- Meter esa parte del código en un if() y que la condición del if sea una lectura de la LDR (realizando un divisor de tensión).
      2.- Con la fotorresistencia y un transistor puedes también hacer que tu Arduino se encienda solo cuando hay una cantidad de luz concreta.
      3.- Puedes utilizar las entradas de interrupción de Arduino (son pines pensados para que no tengas que tener tu sistema siempre encendido y actúe sólo cuando reciben o pierden voltaje, se utilizan en todo tipo de sensores). Puedes ver más aquí.

      Si te interesa alguna y no sabes cómo realizarla, no te preocupes. Aquí estamos para ayudarte. Si quieres más ideas necesitaría saber un poco más el tipo de proyecto que quieres realizar.

      Un saludo, Enrique.

      Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Cómo Utilizar LDR con Arduino – Fotorresistencia was last modified: diciembre 14th, 2016 by Enrique
Share This

¿Me ayudas?

Hey! Espero que te esté gustando el artículo. ¿Me ayudarías compartiéndolo con tus amigos? Un pequeño paso para ti, un gran paso para EducaChip. :) ¡Gracias!