Vous êtes sur la page 1sur 11

# 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!




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

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:

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
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.
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:

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:
?
1
2
3
4
5
6
7
8
9
10
/*
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;
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
45
46
47
48
49
50
51
52
53
54
55
56
57

//Decimos que pines vamos a utilizar para LED
int pinLed1 = 12;
int pinLed2 = 11;
int pinLed3 = 10;
int pinLed4 = 9;
int pinLed5 = 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)
{
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);
}
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
89
90
91
92
93
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);
digitalWrite(pinLed4, HIGH);
digitalWrite(pinLed5, HIGH);
}

}
?
1
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:

Podramos haber acortado alguna lnea de programa con un par de cambios, pero creo
que de esta manera se entiende mejor dado que estamos empezando, ya habr tiempo
de complicar el tema!

Vous aimerez peut-être aussi