Introducción
En este artículo vamos a realizar un sencillo medidor de luz con nuestro Arduino, utilizaremos un arduino con fotoresistencia LDR y mostraremos el resultado en la computadora así como como en un grupo de leds.
El objetivo de este tutorial es aprender como conectar sensores que varían su resistencia dependiendo de una magnitud física. Un ejemplo de este tipo de sensores es el LDR o fotoresistor, estudiaremos el funcionamiento de este componente y su conexión con la tarjeta Arduino UNO R3 mediante un divisor resistivo en el resto de este texto.
Conceptos básicos
Para entender como funciona este circuito y el programa que corre en la tarjeta Arduino debemos conocer 3 conceptos clave:
- Fotoresistencia LDR: Componente cuya resistencia varía sensiblemente con la cantidad de luz percibida. La relación entre la intensidad lumínica y el valor de la resistencia no es lineal. Se utiliza ampliamente para medir la iluminación en dispositivos electrónicos que requieren un precio agresivo. Su comportamiento es el siguiente:
- Divisor de voltaje: Mediante un par de resistencias en serie, es posible repartir la tensión suministrada por la fuente entre las terminales de estas, en nuestro caso, el divisor se utiliza con el LDR para obtener un voltaje variable de acuerdo a la cantidad de luz percibida.


- Conversión Analógico-Digital (ADC): Es el proceso mediante el cual se convierte una magnitud física como un voltaje, corriente, temperatura, etc. en un número binario (o señal digital) con el propósito de facilitar su manejo por circuitos digitales como un CPU. El Arduino realiza este proceso para conocer la cantidad de luz percibida por el LDR y poder procesarla numericamente.
Recomendamos estudiar estos conceptos a profundiad para desarrollar las habilidades necesarias para aplicarlos en otras situaciones distintas, ya que serán de gran utilidad al conectar cualquier otro sensor analógico al arduino. Podemos estudiar los conceptos más a detalle en los enlaces provistos. Estos temas podrían ser objeto de un artículo individual para cada uno, pero creemos que ya otras personas han hecho un buen trabajo explicándolos, por lo que queda como tarea para el lector investigarlos más a fondo.
Materiales necesarios
- 1 Arduino UNO R3
- 1 Fotoresistor (LDR)
- 1 Resistencia de 10 Kohm 1/4 W
- 3 Resistencias de 220 o 330 ohm 1/4 W
- 3 Leds 5mm
- Cables para protoboard
- Protoboard
Diagrama para utilizar Arduino con Fotoresistencia LDR
Debemos armar el circuito como se muestra en el siguiente diagrama pictórico. Recordar que los LED tienen polaridad y hay que respetarla. El pin más largo va conectado a la tarjeta arduino, mientras que el pin más corto va con una resistencia a tierra, la resistencia también puede colocarse sin problema entre el ánodo del led y el arduino (del lado positivo del led):

El circuito armado sobre el protoboard y las conexiones con el arduino quedan de la siguiente manera:

Código (sketch) para Arduino con Fotoresistencia LDR.
La explicación para el código es la siguiente: Primero se preparan los pines de salida donde estan conectados los leds, el pin de entrada donde se conecta el divisor resistivo y el puerto serie para la comunicación. A continuación se ejecuta un cíclo infinito en el que se lee el valor del voltaje en el pin del LDR y se accionan los leds segun correspondan. También transmitimos el valor leido por el ADC del ATMEGA328 a la PC a través del puerto serie de nuestra tarjeta arduino. Hemos comentado el código de manera que sea fácil de entender.
/*
* https://www.geekfactory.mx
*
* Ejemplo de medidor de luz con Arduino utilizando una fotoresistencia LDR y
* un grupo de leds para mostrar el resultado de las lecturas. Este sketch puede
* servir como base para otros proyectos que requieren medicion de la intensidad
* de luz con una fotoresistencia.
*
* Mas detalles y la conexion completa para este sketch en:
* https://www.geekfactory.mx/tutoriales/tutoriales-arduino/tutorial-arduino-con-fotoresistencia-ldr/
*
*/
// Pin donde se conectan los leds
int pinLed1 = 2;
int pinLed2 = 3;
int pinLed3 = 4;
// Pin analogico de entrada para el LDR
int pinLDR = 0;
// Variable donde se almacena el valor del LDR
int valorLDR = 0;
void setup()
{
// Configuramos como salidas los pines donde se conectan los led
pinMode(pinLed1, OUTPUT);
pinMode(pinLed2, OUTPUT);
pinMode(pinLed3, OUTPUT);
// Configurar el puerto serial
Serial.begin(9600);
}
void loop()
{
// Apagar todos los leds siempre que se inicia el ciclo
digitalWrite(pinLed1, LOW);
digitalWrite(pinLed2, LOW);
digitalWrite(pinLed3, LOW);
// Guardamos el valor leido del ADC en una variable
// El valor leido por el ADC (voltaje) aumenta de manera directamente proporcional
// con respecto a la luz percibida por el LDR
valorLDR= analogRead(pinLDR);
// Devolver el valor leido a nuestro monitor serial en el IDE de Arduino
Serial.println(valorLDR);
// Encender los leds apropiados de acuerdo al valor de ADC
if(valorLDR > 256)
{
digitalWrite(pinLed1, HIGH);
}
if(valorLDR > 512)
{
digitalWrite(pinLed2, HIGH);
}
if(valorLDR > 768)
{
digitalWrite(pinLed3, HIGH);
}
// Esperar unos milisegundos antes de actualizar
delay(200);
}Para probar nuestro flamante medidor de luz, solamente debemos colocarlo sobre una fuente de luz y verificar que los led se encienden conforme aumenta la cantidad de luz. En la terminal, también podremos ver como va cambiando el valor de la conversión analógico a digital.











En el valor usas 768 como máximo pero ¿cuál es el dato máximo que puede mandar?
La polaridad de los LEDS está invertida en el dibujo
puedo encender 4 leds en vez de 3?
Q ROLLO
si
ola como hago para que uno se prenda y el otro se apague cuando se prenda gracias
Buscalo en Google. de nada
Hice un proyecto, con un sólo Led, y el Ldr, pero me funciona al revés.
Con luz se enciende el Led, y si apago, el Ldr hace que se apague el Led.
Qué está mal?
Es de programación, o de montaje.
Gracias
Intercambia la LDR por el resistor de 10k y entonces el LED te encenderá del modo contrario.
Tienes que cambiar de posición la resistencia por el ldr y así te funcionará de forma inversa
Hola
Muy buen artículo es lo que estaba buscando ya que ando oxidado en esto pero quiero retomar estos temas y me ha gustado mucho la página y veo que tienen muchas cosas, la estaré siguiendo.
Como puedo armar mi arduino para prender y apagar mi luz estando en otro pais.
.
Te recomiendo Arduino mkr1000 o las placas Esp
Para eso necesitarás módulos wifi esp8266
Tienes la placa diseñada en proteus 8
hola buenas tardes como haga que 5 leds prendan en ascendente y descendente cuando se tape la fotoresistencia y cuando no se tape se quede prendido el primer led
Perdón soy nuevo en esto, si el ldr ya viene con la placa electronica montada, o sea que sea un módulo ldr, hace falta que se le añada una resistencia fija al montaje??
Yo tambien ;)
Disculpa podría usar este código para controlar un motor con puente h?
Para ello necesitamos un sensor pir o Infrarrojo pasivo, puesto que tiene que ser de proximidad que dispare el motor, y tienes que hacer en H para que gire en ambos sentidos… Parte del código te sirve eso lo agregas con la línea If
si
Holaaaaa!
¿Que debo hacer si tengo 2 leds y quiero que uno se apague primero y no se vuelva a prender y después el otro se apague y no se vuelva a prender con el mismo valorLDR?
La línea 19 creo que no es correcta, debería ser int PinLDR= A0 ya que es entrada analógica
si queremos hacer encender un led por solo un tiempo determinado supongamos el led enciende cuando es menor a 100 (<100) que encienda solo una vez y ya no vuelva a encenderse. Mientras baje su valor y llegue menor a 100 que encienda por un tiempo y ya, aunque siga el valor menor de 100 no vuelva a encender
Hola tendrias que usar una variable (flag) para guardar que ya se encendió en algún momento en el pasao, utilizando una condición podrías decidir si ya se encendió al menos una vez y entonces no volver a encender.
Hola, excelente tutorial sólo me quedó una duda; ¿Cómo obtiene uno los valores del ADC para las conversiones? Saludos.
hola, se necesita alguna libreria para hacer funcionar el programa?
No, para nada. Mucha suerte.
Muy buen tutorial. Bien estructurado, bien redactado, buenas imágenes, etc. Muchas felicidades por tu web y este artículo. Un saludo amigo ;)
Hola, me gustaría cambiar los leds a una conexión en paralelo, como lo podría hacer?
Hola si quieres conectar muchos leds en paralelo al microcontrolador, lo recomendable es utilziar un transistor. Espero que eso sea lo que estas preguntando, un saludo.
hola, como puedo hacer que el ldr detecte 3 flashes antes de 10 segundos y que se enciendan los leds una vez que los detecte? ayuda!
haciendo uso del comando if junto a un delay.
Hola muy buenas, estoy intentando programar el photoresistor pero creo que en la foto no está al completo. Me podríais decir donde puedo descargar el skecht. Muchas gracias
como hago para que solo me prenda el color rojo si le pongo un papelito rojo?, solo el azul si le pongo un papelito rojo?, y solo el verde si le pongo un papel verde?…. gracias de ante mano
Hola que tal.
Si quieres hacerlo con LDR, podrías probar a encender leds del color que quieres detectar (verde, azul, rojo) y medir la resistencia del LDR mientras se enciende cada led (que alumbran el objeto a identificar). También hay sensores de color como este que manejamos en nuestra tienda:
https://www.geekfactory.mx/producto/sensor-de-reconocimiento-de-color-tcs230/
Saludos.
como puedo programarlo para que se prenda los led cuando no alla luz? es para un casa domotica ayudame porfavor
Hola puedes probar a invertir la condición: if(valorLDR < 256)
Saludos.
Obtuviste algun resultado, yo tambien lo ando haciendo.
como puedo variar la sensibilidad del LDR? osea que no se enciendan los leds tan facilmente, que necesite mas obscuridad para que prendan, es para un proyecto, agradeceria que me despejaras esta duda
Hola se pueden cambiar los valores en el programa (256, 512, 768), también puedes jugar con los valores de la resistencia en serie con el LDR o bien variar el voltaje de referencia del ADC con un potenciómetro en el pin AREF.
Saludos.
Hola amigo, cómo puedo hacer para regular la intensidad de luz de un bombillo, según la intensidad de luz que haya??
Ya sé que ocupo un relé para esto, ya tengo el trabajo casi terminado, lo que me falta es la programación en el arduino para que cuando haya poca luz, un bombillo empiece a alumbrar y a como haya más oscuridad, vaya aumentando su intensidad de luz
Mira, lo que te digo es teórico (porque lo probamos con un amigo pero en algo chico un par de veces y anduvo), pero lo.que podrías es utilizar una etapa de potencia con TRIACs. Colocas entre el arduino y el triac un MOC3021, y lo manejas por PWM (recordando qur según la red un bombillo “prende y apaga” 50 0 60 veces por segundo). Refrigera bien el TRIAC, aunque con el MOC3021 no debería haber grandes problemas. Saludos.
Hola, como podria programarlo para que se prendan los leds cuando falte luz?
Hola, se deben cambiar la parte de las condiciones en las siguientes partes.
// Encender los leds apropiados de acuerdo al valor de ADC
if(valorLDR > 256)
{
digitalWrite(pinLed1, HIGH);
}
if(valorLDR > 512)
{
digitalWrite(pinLed2, HIGH);
}
if(valorLDR > 768)
{
digitalWrite(pinLed3, HIGH);
}
Si claro, puedes ocupar hasta los pines analógicos si así lo quisieras. En este caso corresponden a los pines 14,15,16,17,18,19. Solo en caso de que hiciera falta! En este caso tendrías que dividir los 1024 niveles entre el número de pines y ajustar los valores a los que va a encender cada led.
hola, ya pude solucionar el problema, era tan solo el puerto COM, ahora tengo una inquietud, quisiera saber hasta que pines puedo poner salidas de leds, osea tu utilizas 3 pines q son el 2,3,y 4, puedo acaso ocupar 10 pines, quiero decir hasta el pin 11? Gracias
cuando meto la programacion al skecht de arduino me dice q hubo un problema al carga la placa a q se puede deber?
Probablemente tienes mal configurado el puerto, aunque pueden ser varias cosas. Podrías mandarnos la captura, a ver si te puedo ayudar.
por que tomas los valores 256, 512 y 768 para enceder los leds?
Hola.
Esto es así por que el convertidor A/D de arduino puede leer el voltaje en 1024 “escalones” (resolución de 10 bits). Estos números corresponden a 1/4 de la escala completa que puede medir el ADC.
Sabes como modificar el código para que cuando encienda el primer led, éste dure 5 segundos encendido y se apague si que sea cíclico? Igual para led 2 Gracias.
Checa la función millis() de arduino. Creo que viendo unos ejemplos de esta, puedes implementar lo que requieres.
Saludos.