You are on page 1of 21

Buscar

INIC IO

OPEN SOURC E

IMPRESIN 3D

NOTIC IAS

YOUTUBE

C URSOS Y TALLERES

FORO

Tutorial Arduino # 0004 Sensor LDR


27 nov 2011 A REF, BA SICO, ILUMINA CIN, LDR by Pablo Murillo

23

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

# Tutorial Arduino 0004 Sensor LDR


Bienvenidos a un nuevo tutorial para sacar el mximo partido a vuestro Arduino, comenzamos a introducir en nuestros proyectos sensores que respondern a situaciones fsicas concretas, empecemos por el LDR!! Nivel: Bsico Coste: < 30 Tiempo: 25

Parte 1: Qu vamos a hacer?


En este proyecto, vamos a utilizar un LDR (Light Dependent Resistor o resistencia dependiente de la luz) para simular una hipottica compensacin lumnica de 5 niveles, es decir, a travs de una resistencia que varia su valor dependiendo de la luz recibida, aprovecharemos dicha variacin para hacer un programa que nos encienda o apague una serie de LED dependiendo de si hay ms luz o menos luz, esto podramos extrapolarlo a un sistema de regulacin de luz de un jardn con cinco lineas de luz que se vayan encendiendo segn va cayendo la noche compensando progresivamente la deficiencia de luz. Adems le hemos implementado un potencimetro para ajustar el nivel crtico mnimo de luz que queremos soportar, a partir del cual se activar nuestro circuito y empezar a aumentar la luz del lugar progresivamente. Veamos un video con el resultado final!

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Material necesario para este proyecto: 1 x Arduino Uno 1 x Protoboard 1 x LDR 1 x Potencimetro 10k 5 x Diodos LED 5 x Resistencias 220 1 x Resistencia 1K 1 x Juego de Cables

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Parte 2: Diseando el hardware


En este proyecto lo que queremos conseguir es que, a partir de una resistencia que vara su valor hmico en funcin de que haya ms o menos luz, controlar 5 salidas de nuestro Arduino, a las que podramos conectar lneas de iluminacin para un jardn por ejemplo, de manera que segn va anocheciendo, nuestra iluminacin artificial va aumentando. Adems, vamos a colocar un potencimetro para regular el umbral de luz mnima, a partir del cual, comenzar a funcionar nuestro circuito de luz artificial para que sea adaptable a cualquier entorno. Dividamos el circuito en tres partes: Salidas LDR Regulador

Para las salidas, ya hemos aprendido en otros tutoriales como conectar unos diodos LED y como calcular su resistencia ptima. En cuanto al LDR, es nuevo para nosotros, en breve tendris disponible un tutorial sobre este componente, as que de momento nos vamos a quedar en que funciona como una resistencia variable de manera que, cuanta ms cantidad de luz reciba, menor ser su resistencia, para que quede claro, si en un potencimetro varibamos la resistencia deslizando un patn por la pista de material resistivo, aqu lo har la cantidad de luz que reciba la foto-resistencia. Qu podemos deducir con esto? Que si aadimos una resistencia ms, podemos utilizar el LDR para hacer el ya conocido divisor de tensin de donde sacaremos la seal para conectar a nuestra entrada analgica de Arduino. Podemos conectarlo de dos maneras diferentes:

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Si utilizamos el LDR como resistencia inferior del divisor de tensin, nos dar la tensin mxima cuando tengamos el LDR en plena oscuridad, ya que estar oponiendo el mximo de su resistencia al paso de la corriente derivndose esta por Vout al completo, si lo utilizamos como resistencia superior, el resultado ser el inverso, tendremos la tensin mxima cuando est completamente iluminado, ya que se comportar prcticamente como un cortocircuito, con una resistencia de 50 o 100 . En este caso lo hemos utilizado como resistencia superior, de manera que cuanta ms luz haya, ms tensin tendremos a la entrada de nuestra entrada analgica pudiendo ajustar as, de una manera muy intuitiva, la tensin de referencia que ahora explicar. Como tercera parte del circuito, hemos colocado un potencimetro configurado como divisor de tensin para hacer las funciones de regulacin del rango de iluminacin a partir del cual se activar nuestro circuito de iluminacin. Como hemos conseguido esto? Primero hay que pensar un par de cosas, nuestra foto-resistencia configurada como divisor resistivo, nos va a dar 0v cuando este COMPLETAMENTE a oscuras, y +5v cuando est COMPLETAMENTE iluminada, situaciones que pueden ser difciles de conseguir dependiendo del entorno en el que trabajemos, y por otra parte, ese rango de 0v a 5v habr que dividirlo en 1024 pasos que va a leer nuestro Arduino, pero quizs solo vayamos a trabajar en 500 o 600 pasos, desperdiciando mucha resolucin. Para solucionar esto, adems de evitar cambiar el programa de Arduino cada vez que lo cambiemos de entorno, he decido usa una funcin que nos proporciona Arduino muy internaste, el pin Aref

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Qu es el pin AREF? Cuando Arduino toma una seal analgica y la convierte a digital en 1024 cachitos, lo hace por defecto pensando que la seal que va a recibir puede variar entre 0v y 5v lo que nos da aproximadamente un valor por cada 4,88 mV, pero nosotros podemos decirle que no, que realmente va a trabajar entre 0v y 3v, obteniendo as 1024 cachitos distribuidos entre 0v y 3v, lo que nos da un valor por cada 2,9 mV, es decir una resolucin mucho mayor. Debemos tener en cuenta que este pin lleva internamente una resitencia de 32K para evitar daar el chip, de manera que si vamos a conectar el pin mediante una resistencia fija, se va a producir un nuevo divisor de tensin, con lo que habr que calcular la resistencia adecuada para la tensin exacta que queremos introducir mediante una sencilla frmula:

Donde: Vin = Tensin que introducimos a Vref Rinterna = Resistencia interna de Arduino de 32K Rexterna = Resistencia mediante la cual alimentamos Vref Vrefencia = La tensin sobre que tomar referencia nuestro programa.

De manera que si por ejemplo, estamos introduciendo una tensin de +3v a travs de una resistencia de 5K , la tensin real de referencia en nuestro Arduino ser de: (32000/(32000+5000)) x 3 = 2,59v Porqu evita cambiar el programa continuamente? Por que variando la seal de referencia, le estamos diciendo que nos tome 1024 valores entre 0v una determinada tensin mxima, y el reparto de esos valores ya los hemos fijado equitativamente en nuestro programa para que haga una activacin progresiva de las lneas de iluminacin, por tanto, aunque tengamos un rango muy bajo de iluminacin con el que jugar, de 1v por ejemplo, nos va a distribuir siempre proporcionalmente la activacin de las salidas.

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Esa tensin de referencia, ser el punto de iluminacin a partir del cual, si decrece la luz ambiente, empezar a decrecer los valores obtenidos en la seal analgica de entrada. Si ponemos esa referencia muy baja, empezar a funcionar los led con menos luz ambiente que si ponemos una seal muy alta, recordemos: Ms luz = Menos Resistencia = Mayor Vout Menos luz = Mayor resistencia = Menor Vout Veamos el esquema elctrico del circuito al completo:

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Y aqu un a posible distribucin del circuito en vuestra protoboard:

Parte 3: Programando
Este programa es algo ms largo que los anteriores, pero desgranndolo poco a poco seguro que seremos capaces de entenderlo. Primero veamos el cdigo al completo:

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

/* Tutorial # 0004 Arduino Academy - Sensor LDR Conectamos una foto-resistencia a la entrada analgica para controlar cinco salidas en funcin de la luz ambiente. Este proyecto es de dominio pblico. */ //Aqu almacenamos los datos recogidos del LDR: int valorLDR = 0; //Decimos que int pinLed1 = int pinLed2 = int pinLed3 = int pinLed4 = int pinLed5 = pines vamos a utilizar para LED 12; 11; 10; 9; 8;

//Y que pin para la LDR int pinLDR = 0; void setup() { //Establecemos como salida los pines para LED pinMode(pinLed1, OUTPUT); pinMode(pinLed2, OUTPUT); pinMode(pinLed3, OUTPUT); pinMode(pinLed4, OUTPUT); pinMode(pinLed5, OUTPUT); //Le decimos que vamos a usar una referencia externa analogReference(EXTERNAL); } void loop() { //Guardamos el valor leido en una variable valorLDR = analogRead(pinLDR); //Y comenzamos las comparaciones: if(valorLDR >= 1023)
Are you a developer? Try out the HTML to PDF API

open in browser PRO version

pdfcrowd.com

44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

if(valorLDR >= 1023) { digitalWrite(pinLed1, LOW); digitalWrite(pinLed2, LOW); digitalWrite(pinLed3, LOW); digitalWrite(pinLed4, LOW); digitalWrite(pinLed5, LOW); } else if((valorLDR >= 823) & (valorLDR < 1023)) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, LOW); digitalWrite(pinLed3, LOW); digitalWrite(pinLed4, LOW); digitalWrite(pinLed5, LOW); } else if((valorLDR >= 623) & (valorLDR < 823)) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, LOW); digitalWrite(pinLed4, LOW); digitalWrite(pinLed5, LOW); } else if((valorLDR >= 423) & (valorLDR < 623)) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, LOW); digitalWrite(pinLed5, LOW); } else if((valorLDR >= 223) & (valorLDR < 423)) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, HIGH); digitalWrite(pinLed5, LOW); } else { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH);
Are you a developer? Try out the HTML to PDF API

open in browser PRO version

pdfcrowd.com

88 89 90 91 92 93 1

} }

digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, HIGH); digitalWrite(pinLed5, HIGH);

En este programa os tiene que resultar casi todo conocido de los anteriores proyectos, si no, os recomiendo echar un vistazo alos anteriores tutoriales Arduino que tenemos en la despensa. La instruccin que no hemos visto nunca es la siguiente: 1 analogReference(EXTERNAL);
?

Con esta instruccin le estamos diciendo a nuestro Arduino, que no use su tensin de referencia por defecto (+5v) sino la que nosotros introduzcamos por el pin AREF de nuestra placa, como explicamos en la seccin de hardware. A continuacin podemos ver que en el loop, lo primero que hacemos es almacenar la lectura de la entrada analgica en una variable para luego, dependiendo de los datos obtenidos, hacer una cosa u otra. 1 valorLDR = analogRead(pinLDR);
?

Y una vez obtenida la lectura empezamos la discriminacin mediante sentencias if.. if else.. else.. Utilizamos if else para aadir varias condiciones seguidas, y un ltimo else para cerrar las condiciones. En el siguiente diagrama de flujo de programa podemos ver como actuar Arduino a nuestras comparaciones:

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Podramos haber acortado alguna lnea de programa con un par de cambios, pero creo que de esta manera se entiende mejor dado que estamos

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

empezando, ya habr tiempo de complicar el tema! Y eso es todo por hoy! Y si hay algn resquicio del proyecto que no acabis de entender, escribir un comentario con vuestras dudas. Hasta pronto!!
Comprtelo: Mename Twitter 35 Facebook 94 Google LinkedIn

Sobre el autor...
Pablo Murillo. Tcnico electrnico apasionado por la tecnologa y el mundo de la impresin 3D. Comprometido en difundir el movimiento maker en cualquiera de sus vertientes. Fundador de Arduteka.com Colaborador en Arduino.cc

Comparte en tu red social!

23 Comments
Pingback: Componentes El sensor LDR | ARDUINO ACADEMY Pingback: Tutorial Arduino # 0004 - Sensor LDR | ARDUINO ACADEMY | arduino-jd | Scoop.it Pingback: Tutorial Arduino # 0005 - Sensor de temperatura NTC | ARDUINO ACADEMY

Lluis Sales
open in browser PRO version

31 diciembre, 2011 at 9:40

Responder

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Felididades por estos tutoriales que encuentro muy tiles. Una observacin, creo que en esta frase,d onde dices circuito abierto, deberia decir cortocircuito ya que se comportar prcticamente como un circuito abierto, con una resistencia de 50 o 100 . Feliz 2012 Saludos

Arduino Academy
Gracias!!

31 diciembre, 2011 at 10:39

Responder

Son pequeos lapsus entre tantas palabras..

Entre todos haremos que estos tutoriales queden completamente pulidos, esa es la filosofa! Al igual que si creis que debo aadir algo ms, lo har encantado! Un saludo!!!

flacoloco

16 enero, 2012 at 1:21

Responder

No es por ser un pureta pero me gustara comentar que en la siguiente parte del cdigo: if(valorLDR >= 1023) { ... } else if((valorLDR >= 823) & (valorLDR < 1023))

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

La segunda condicin no hace falta, ya que est implicita en el else de la primera. Es decir, bastara con: if(valorLDR >= 1023) { ... } else if(valorLDR >= 823) y as sucesivamente. Un saludo y gracias por este proyecto!!

Roberto

27 enero, 2012 at 16:02

Responder

Muchsimas Gracias Arduino Academy, espero solucionar el problema pronto con vuestra ayuda. Un saludo!!

Gatoloco65
Saludo !!!

26 marzo, 2012 at 15:06

Responder

Por fin de una manera clara pude entender como funciona el pin AREF. Mil Gracias !!! P.D. Excelentes tutoriales, sobre todo para los que somos novatos y tenemos escasos conocimientos (estudio) sobre electrnica, programacin, etc

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

David

29 marzo, 2012 at 5:16

Responder

Hola! tengo una pequea duda. de donde sale el valor 1023? porque se empieza con ese valor las comparaciones? le he dado muchas vueltas y no s de donde sale. espero que me resuelvan esta pequea duda,muchas gracias!

Javi

29 abril, 2012 at 20:54

Responder

Hola David, soy novato en todo esto, pero me parece que el valor 1023 viene de que Arduino es un cacharrin digital y las entradas y salidas ANALOGICAS que tiene son simuladas (si se puede llamar a si), por tanto los valores que puede recoger por una entrada analogica se van dividiendo en cachitos siendo el valor mas bajo que puede registrar el de 0 y el ams alto el de 1024. Por eso en el programa empieza preguntando SI EL VALOR ALMACENADO EN LA VARIABLE valorLDR ES MAYOR O IGUAL A 1023, significa que si el sensor LDR esta reciviendo el valor mas alto que puede registrar (1024-1023) No se si lo habre explicado bien, que algun veterano me corrija. Un saludo y gracias por los tutoriales

Javi

29 abril, 2012 at 20:59

Responder

Una cosa que no me ha quedado clara es la declaracion de esta variable> int pinLDR = 0 por que se le da el valor 0?, se supone que ahi esta pinchado el LDR, no? es el PIN AREF, verdad?, por que 0? Un saludo y muchas gracias por todo

Pingback: El sensor LDR Pingback: Tutorial Arduino # 0005 - Sensor de temperatura NTC

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Dani

1 febrero, 2013 at 21:19

Responder

Montado y funcionando. El programa est as perfecto para entenderlo mas facilmente. Gracias, Ya se hacer una cosita mas!.

Pablo Murillo

3 febrero, 2013 at 12:07

Responder

Alberto

4 febrero, 2013 at 0:31

Responder

Funciona! Estoy aprendiendo Arduino desde 0 con estos tutoriales, aunque ya saba un poquito de electrnica son muy tiles! Una pregunta en el cdigo, donde dice: //Y que pin para la LDR int pinLDR = 0; sera as o: int pinLDR = A0; Un saludo, muchas gracias.

adolfo

28 febrero, 2013 at 14:45

Responder

estimado, excelente estoy aprendiendo arduino desde 0 y conocimiento de electrotecnia muy poco pero si avanzado de programacin pero estos tutoriales estn perfectos.. excelentes tus aportes!.. Gracias.

Moha

9 marzo, 2013 at 20:37

Responder

Hola, tengo una duda quiero hacer este proyecto pero para controlar luces a 230V, me gustaria saber si es posible y como seria la

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

programacion, muchas gracias

Pablo Murillo
Hola!

21 marzo, 2013 at 13:41

Responder

Psate por el foro http://www.arduteka.com/foro y all, entre todos, intentaremos solucionar tus dudas! Un saludo!

David

19 marzo, 2013 at 14:21

Responder

Hola, estoy empezando con el arduino, y siguiendo este tutorial la prctica funciona correctamente. Pero me surge una duda, al ver este y otros tutoriales parecidos. Como determinas aqu el valor de la resistencia que usas? Aqu se pone una resistencia de 1K. Por qu esta y no otra?. Esta duda se me plantea en cualquier ejemplo en el que hay una resistencia variable. He probado a poner otra resistencia, y los valores evidentemente cambian (exceptuando para oscuridad total y cuando una luz indice directamente sobre el sensor). Muchas gracias, un saludo.

Pablo Murillo
Hola!

21 marzo, 2013 at 13:38

Responder

Psate por el foro http://www.arduteka.com/foro y all, entre todos, intentaremos solucionar tus dudas! Un saludo!

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Matias

25 marzo, 2013 at 22:04

Responder

Me parece muy interesante incorporar el diagrama de flujo de los programas! Saludos!

Juan Carlos

28 abril, 2013 at 23:21

Responder

Hola muchas gracias por tus tutoriales, me gustaria saber si tienes alguna idea de un proyecto sobre RTOS(Real time Operating System) para un principiante, me estan pidiendo hacer algo sobre esto en la escuela pero la verdad no se me ocurre nada, no te pido el proyecto solo una idea para saber como puedo encaminarme, soy novato en arduino pero no programando en C. Muchisimas gracias

Djanos un comentario!
Name *

Email *

Website captcha

Anti-Spam *

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Publicar comentario Recibir un email con los siguientes comentarios a esta entrada. Recibir un email con cada nuevo post.

Sitios de inters
Arduino.cc Cursos y Talleres Impresoras 3D y Escner 3D Meneame Sicnova 3D open in browser PRO version

Recent Forum Posts

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

Arduteka by Arduteka is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License. Acceso

open in browser PRO version

Are you a developer? Try out the HTML to PDF API

pdfcrowd.com

You might also like