Anda di halaman 1dari 24

Mltiples LEDs y pulsadores, proyecto de un

semforo inteligente
Luis del Valle Hernndez
Uno de los proyectos tpicos cuando nos iniciamos con Arduino, es
hacer un semforo. En este artculo vamos a darle una vuelta de
tuerca, vamos a crear un semforo inteligente. Simularemos esa
inteligencia con dos pulsadores, mltiples LEDs y mucha
imaginacin.

El objetivo de este tutorial es mostrarte cmo utilizar mltiples LEDs


con Arduino y tambin como integrarlo con dos pulsadores. Estos
ltimos se pueden sustituir por algn sensor de presencia ya
sea ultrasonidos (ya hemos visto un ejemplo en el sensor de
aparcamiento) o con infrarrojos.

Vamos a simular un cruce de semforos en una calle. Los


semforos van a tener una caracterstica especial, van a funcionar
solos. Con los mltiples LEDs crearemos las luces de los
semforos. Los pulsadores simularn sensores de presencia.

El funcionamiento es muy simple. Cuando un coche llega a un


semforo en rojo se detiene. Esta situacin la simularemos activando
el pulsador asociado (como si fuera un sensor de presencia). Tras un
tiempo de espera, se pondr en rojo el otro semforo y el semforo
donde est esperando el coche, se pondr en verde.

Indice de contenidos
1 LEDs con Arduino, todo lo que necesitas saber
2 Pulsadores con Arduino, controla el flujo de la corriente
3 Circuito semforo inteligente con mltiples LEDs y pulsadores
4 Programando el semforo inteligente con mltiples LEDs y
pulsadores
5 Conclusin de los mltiples LEDs y pulsadores con el semforo
inteligente
LEDs con Arduino, todo lo que
necesitas saber
Lo primero que debemos saber antes de utilizar mltiples LEDs, es
que se trata de un diodo. Este tipo de componentes son muy
particulares ya que solo dejan pasar la electricidad en un sentido.

Pero cul es ese sentido? Es muy sencillo y con la prctica, te


acostumbrars a utilizarlos. Los LEDs tienen una patilla ms
larga que otra, esa patilla se conoce como nodo (el polo positivo). Es
por donde tiene que entrar la corriente. La patilla ms pequea se
conoce como ctodo (polo negativo) y es por donde saldr la corriente
de electrones.

Teniendo claro esto ya podemos conectar mltiples LEDs a nuestro


circuito. Ahora solo nos hace falta saber qu resistencia poner. Para
ello debemos hacer uso de la Ley de Ohm. Esta Ley es la base
fundamental sobre la que debemos construir nuestros circuitos.

Por qu debemos conectar una resistencia? Siempre tenemos que mirar la hoja d
un LED tpico de 500 mm, el voltaje de operacin est entre 1,8 V y 2,2 V. En cas

disminuir la vida til del componente.

Ley de Ohm
Esta Ley relaciona las tres magnitudes bsicas de un circuito voltaje,
corriente y resistencia. Debes conocer y memorizar las frmulas que
nos ayudan a calcular una magnitud en relacin a las otras. Existe
un crculo que te ayuda fcilmente a recordar esta relacin.
Tapando la magnitud que quieres calcular te dice cmo hacerlo en
base a las otras dos magnitudes.

Donde:

V es voltaje

I es intensidad

R es resistencia
Calcular Voltaje Calcular Intensidad

Con esta frmula ya podemos calcular cualquier magnitud. En


principio, necesitamos conocer dos de las magnitudes para calcular la
tercera. En el ejemplo del semforo inteligente con mltiples LEDs y
pulsadores, tendremos que calcularlo una sola vez. Veamos cmo
hacerlo.

Obteniendo la informacin para conectar un LED


con Arduino
Vamos a recopilar la informacin que tenemos. Imagnate este circuito.
En un circuito en serie como el del ejemplo, da lo mismo colocar la
resistencia antes que despus. Si aplicas la Ley de Ohm se obtiene
el mismo valor. En ningn momento esta Ley nos dice la posicin de
los componentes. Esto tambin es aplicable a mltiples LEDs.

Segn aumentemos el valor de la resistencia, el Arduino LED suministrar menos lumi

Es un circuito muy simple, un LED y yba resistencia en paralelo.


Pero, cmo calculamos el valor de la resistencia? Slo tenemos
que aplicar la Ley de Ohm. Conocemos el voltaje, por los pines
digitales se suministran 5 V. La intensidad la podemos sacar de
la hoja de caractersticas tcnicas del propio Arduino. Si nos
dirigimos a su web oficial podemos ver el detalle que te muestro en la
siguiente imagen.
La intensidad es de 20 mA (miliamperios) que son 0,02
A (Amperios). El voltaje que tiene que caer en la resistencia es 5 V
menos lo que consume el LED, entre 1,8 V y 2,2 V. Esto nos da que la
resistencia debe consumir como mnimo 3,2 V.

Ya tenemos todo, solo hace falta sustituir los valores y calcular el valor
de la resistencia.
Ojo, que este es el mnimo. Por debajo de ese valor de resistencia
podemos daar el LED, ya que aumentara el voltaje y nos saldramos
del rango de operacin. En mi caso voy a utilizar resistencias de 220
por comodidad. Esto me da como resultado que en la resistencia se
consumirn 4,4 V y quedaran 0,6 V para consumir en el LED. Estoy
por debajo de lo recomendado pero no daar el LED.

Pulsadores con Arduino, controla el


flujo de la corriente
Otro componente que vamos a utilizar y que debemos conocer son los
pulsadores. Gracias a estos componentes podemos dejar pasar o no
la corriente. Al utilizar un pulsador con Arduino tenemos que tener
ciertas precauciones, sobre todo cuando la salida la conectamos a un
pin digital, como es el caso. Lo primero es ver un esquema
general de un pulsador.

El tpico tiene cuatro patillas. Estn conectadas entre ellas dos a


dos y entre ellas forman el interruptor. Un pulsador no es ms que un
interruptor, deja pasar la corriente o no. Seguro que te suena todo
esto, dos estados posibles :). Exacto, a travs de un pin digital
podemos saber si se ha pulsado o no un pulsador.

Resistencia pull down, evita indeterminaciones


en los pulsadores
Seguramente hayas odo hablar de las resistencias pull down y pull
up. Se trata de dos configuraciones que nos permiten tener un
estado bajo (0 Voltios) o estado alto (5 Voltios) cuando un cable est al
are.

Esto es lo que sucede con los pulsadores, mientras que no pulsemos,


tenemos el pin al aire y se produce una indeterminacin. Las dos
configuraciones posibles son las siguientes.

El valor tpico de la resistencia debe ser el mayor posible.


Los 10k es el aconsejable para utilizar un pulsador con Arduino.

Circuito semforo inteligente con


mltiples LEDs y pulsadores
Pues ya tenemos todo claro de cmo utilizar mltiples LED,
pulsadores y Arduino para crear el semforo inteligente. Ahora te
detallar los componentes que vamos a necesitar.

Componentes necesarios
Asegrate que tienes los siguientes componentes para montar el
circuito.
Arduino UNO (o equivalente)

Protoboard donde conectamos los componentes

6 resistencias 220

2 resistencias 10 k

3 LEDs verdes

3 LEDs amarillos

3 LEDs rojos

2 pulsadores

Mltiples LEDs y pulsadores, Montando el


circuito del semforo inteligente
En este circuito, al utilizar tantos componentes tenemos que llevar
mucho cuidado con los cortocircuitos. Esto hara que el sistema no
se comporte como esperamos. Ves conectando poco a poco y una vez
conectado, prueba cada componente para asegurarte de que todo
funciona correctamente.

Los mltiples LEDs van a formar los semforos de un cruce. Los


pulsadores simularn sensores de presencia. El circuito sera el
siguiente.
Las resistencias conectadas a los mltiples LEDs son de 220 y la de
los pulsadores 10 k.

Es una buena prctica utilizar cables de colores agrupados para los mltiples LEDs y

rpidamente.

Programando el semforo inteligente


con mltiples LEDs y pulsadores
Lo primero es comprender el problema. Vamos a simular un cruce de
calles con mltiples LEDS, que harn de semforos, y dos
pulsadores, que harn de sensores de presencia. El objetivo es que
cuando se site un coche en un semforo que est en rojo, permita
que se ponga en verde y cierre el otro semforo.

Para empezar tenemos que partir de unas condiciones iniciales,


qu semforo comienza abierto y qu semforo comienza
cerrado? Empezaremos con el semforo 1 abierto y el semforo 2
cerrado. Para entendernos, en el esquema del circuito elctrico, de
izquierda a derecha ser semforo 1, semforo 2, pulsador 1 (simula
sensor de presencia del semforo 1) y pulsador 2 (simula sensor de
presencia del semforo 2).

Una vez que un coche est parado ante un semforo en rojo


(simulamos pulsando su pulsador), pasar un determinado tiempo y
comenzar la secuencia para apagar el otro semforo y abrir el suyo.
Sencillo no?. Pues vamos a ver el algoritmo.

1. Establecer condiciones iniciales

1. LED verde semforo 1 encendido

2. LED rojo semforo 2 encendido

3. Semforo 1 activo

2. Comprobar que semforo est activo

1. Semforo 1 activo

1. Comprobar pin pulsador 2

1. Si pulsado

1. Cambiar semforo 1 a rojo

2. Cambiar semforo 2 a verde

2. Semforo 2 activo

1. Comprobar pin pulsador 1


1. Si pulsado

1. Cambiar semforo 2 a rojo

2. Cambiar semforo 1 a verde

Variables y constantes
Lo primero es declarar las constantes que identifiquen los mltiples
LEDs y los pulsadores. Eso lo hacemos en la parte de arriba del
sketch o programa.

1 // Pines utilizados

2 #define LEDVERDE1 2

3 #define LEDAMARILLO1 3

4 #define LEDROJO1 4

5 #define LEDVERDE2 5

6 #define LEDAMARILLO2 6

7 #define LEDROJO2 7

8 #define PULSADOR1 8

9 #define PULSADOR2 9

Luego vamos a declarar tres variables. La primera ser del tipo


booleano, solo admite dos valores a True (verdadero) o False (falso).
Esta variable nos permitir saber que semforo est activo. Cuando
solo tenemos dos posibilidades, es una buena prctica utilizar este tipo
de variables.

En nuestro caso ponemos el nombre activo1. Si es True indica que el


semforo 1 est activo y en verde y por lo tanto el semforo 2 est no
activo y en rojo. Si activo 1 es False, indicar que el semforo 2 est
activo y en verde y el semforo 1 estar no activo y en rojo.
Las otras dos variables son los tiempos de espera. La primera es el
tiempo que esperamos para cambiar de luces (de verde a amarillo y
luego a rojo) y la segunda es un tiempo ms largo. Sirve para esperar
un tiempo prudencial antes de hacer el cambio de semforos.

1 // Variables

2 bool activo1 = true; // Indica si el semforo 1 est activo, de lo contrario ser el semforo 2

3 int tiempoCambio = 1500; // Tiempo de espera entre transicin de LEDs

4 int tiempoEspera = 5000; // Tiempo de espera hasta comenzar transicin

Funcin setup
Ahora vamos a pasar a indicar las condiciones iniciales. Ya lo he
comentado anteriormente. Comenzaremos con el semforo 1 activo
(verde) y el semforo 2 no activo (rojo). Pero antes de hacer esto,
iniciamos el monitor serie, ponemos los pines de los mltiples LEDs en
modo salida (OUTPUT) y los pines de los pulsadores en modo entrada
(INPUT).

Por ltimo, apagamos los mltiples LEDs.

1 void setup() {

2 // Iniciamos el monitor serie

3 Serial.begin(9600);

5 // Modo entrada/salida de los pines

6 pinMode(LEDVERDE1, OUTPUT);

7 pinMode(LEDAMARILLO1, OUTPUT);

8 pinMode(LEDROJO1, OUTPUT);
9 pinMode(LEDVERDE2, OUTPUT);

1 pinMode(LEDAMARILLO2, OUTPUT);

0 pinMode(LEDROJO2, OUTPUT);

1 pinMode(PULSADOR1, INPUT);

1 pinMode(PULSADOR2, INPUT);

2 // Apagamos todos los LEDs

1 digitalWrite(LEDVERDE1, LOW);

3 digitalWrite(LEDAMARILLO1, LOW);

1 digitalWrite(LEDROJO1, LOW);

4 digitalWrite(LEDVERDE2, LOW);

1 digitalWrite(LEDAMARILLO2, LOW);

5 digitalWrite(LEDROJO2, LOW);

6 // Estado inicial: semforo 1 activo, semforo 2 no activo

1 digitalWrite(LEDVERDE1, HIGH);

7 digitalWrite(LEDROJO2, HIGH);

1 }

5
2

Funcin loop
Esta funcin es la que se va a repetir indefinidamente. Aqu
comprobaremos el estado de los pulsadores, encenderemos y
apagaremos los mltiples LEDs segn corresponda. He dividido el
cdigo en dos funciones, a parte de la funcin loop(). Si tenemos que
encender el semforo 1, llamamos a la funcin encenderSemaforo1(),
y si tenemos que encender el semforo 2, llamamos a la
funcin encenderSemaforo2().

1 void loop() {

2 // Dependiendo del semforo que tengamos activo

3 if (activo1)

4 {

5 // Est encendido el semforo 1, comprobamos el pulsador 2

6 int valor2 = digitalRead(PULSADOR2);

8 // Si hay un coche esperando, pulsador pulsado

9 if (valor2 == HIGH)

10 {

11 // Encender semforo 2

12 ecenderSemaforo2();

13

14 // Semforo 2 activo

15 activo1 = false;

16 }

17 }

18 else

19 {
20 // Est encendido el semforo 1, comprobamos el pulsador 1

21 int valor1 = digitalRead(PULSADOR1);

22

23 // Si hay un coche esperando, pulsador pulsado

24 if (valor1 == HIGH)

25 {

26 // Encender semforo 1

27 ecenderSemaforo1();

28

29 // Semforo 1 activo

30 activo1 = true;

31 }

32 }

33 }

Es importante cambiar de semforo activo. Eso se hace poniendo a True o False la variable activo

activo1; Esto quiere decir que coger el valor contrario False si es True o True si es False.

Existen dos palabras reservadas dentro de la API de Arduino que indican el estado d

definen igual que las constantes para indicar el nmero de un pin que hemos utilizado p

LOW tiene asociado el valor 0 u HIGH tiene asociado el valor 1. Por eso podemos gu

del tipo int.

La funcin encenderSemaforo1() y encenderSemaforo2() se encargan


de hacer la secuencia correspondiente para apagar y encender un
semforo. Primero esperamos el tiempo de espera definido
por tiempoEspera. Luego apagamos el otro semforo y por ltimo
encendemos el semforo activo.
1 void ecenderSemaforo2()

2 {

3 // Apagamos semforo 1

4 // Esperamos

5 delay(tiempoEspera);

7 // Pasamos a luz amarilla

8 digitalWrite(LEDVERDE1, LOW);

9 digitalWrite(LEDAMARILLO1, HIGH);

10

11 // Esperamos

12 delay(tiempoCambio);

13

14 // Pasamos a luz roja

15 digitalWrite(LEDAMARILLO1, LOW);

16 digitalWrite(LEDROJO1, HIGH);

17

18 // Encendemos semforo 2

19 // Esperamos

20 delay(tiempoCambio);

21

22 // Pasamos a luz amarilla

23 digitalWrite(LEDROJO2, LOW);

24 digitalWrite(LEDVERDE2, HIGH);

25 }

26

27 void ecenderSemaforo1()

28 {

29 // Apagamos semforo 2

30 // Esperamos
31 delay(tiempoEspera);

32

33 // Pasamos a luz amarilla

34 digitalWrite(LEDVERDE2, LOW);

35 digitalWrite(LEDAMARILLO2, HIGH);

36

37 // Esperamos

38 delay(tiempoCambio);

39

40 // Pasamos a luz roja

41 digitalWrite(LEDAMARILLO2, LOW);

42 digitalWrite(LEDROJO2, HIGH);

43

44 // Encendemos semforo 1

45 // Esperamos

46 delay(tiempoCambio);

47

48 // Pasamos a luz amarilla

49 digitalWrite(LEDROJO1, LOW);

50 digitalWrite(LEDVERDE1, HIGH);

51 }

Aunque es un tema algo ms complejo, podemos utilizar interrupciones para realizar este ejercicio

espera. Con las funciones callback de las interrupciones no podemos utilizar la funcin delay().

Cdigo final
Como siempre, te dejo todo el cdigo unido para que lo utilices en tus
proyectos con Arduino. Intenta hacerlo tu slo, ya que copiar y pegar
no te ayuda a entender las cosas. Recuerda que hemos utilizado
mltiples LEDs y pulsadores.
1 // Pines utilizados

2 #define LEDVERDE1 2

3 #define LEDAMARILLO1 3

4 #define LEDROJO1 4

5 #define LEDVERDE2 5

6 #define LEDAMARILLO2 6

7 #define LEDROJO2 7

8 #define PULSADOR1 8

9 #define PULSADOR2 9

10

11 // Variables

12 bool activo1 = true; // Indica si el semforo 1 est activo, de lo contrario ser el semforo

13 2

14 int tiempoCambio = 1500; // Tiempo de espera entre transicin de LEDs

15 int tiempoEspera = 5000; // Tiempo de espera hasta comenzar transicin

16

17 void setup() {

18 // Iniciamos el monitor serie

19 Serial.begin(9600);

20

21 // Modo entrada/salida de los pines

22 pinMode(LEDVERDE1, OUTPUT);

23 pinMode(LEDAMARILLO1, OUTPUT);

24 pinMode(LEDROJO1, OUTPUT);

25 pinMode(LEDVERDE2, OUTPUT);

26 pinMode(LEDAMARILLO2, OUTPUT);

27 pinMode(LEDROJO2, OUTPUT);

28 pinMode(PULSADOR1, INPUT);

29 pinMode(PULSADOR2, INPUT);

30
31 // Apagamos todos los LEDs

32 digitalWrite(LEDVERDE1, LOW);

33 digitalWrite(LEDAMARILLO1, LOW);

34 digitalWrite(LEDROJO1, LOW);

35 digitalWrite(LEDVERDE2, LOW);

36 digitalWrite(LEDAMARILLO2, LOW);

37 digitalWrite(LEDROJO2, LOW);

38

39 // Estado inicial: semforo 1 abierto, semforo 2 cerrado

40 digitalWrite(LEDVERDE1, HIGH);

41 digitalWrite(LEDROJO2, HIGH);

42 }

43

44 void loop() {

45 // Dependiendo del semforo que tengamos activo

46 if (activo1)

47 {

48 // Est encendido el semforo 1, comprobamos el pulsador 2

49 int valor2 = digitalRead(PULSADOR2);

50

51 // Si hay un coche esperando, pulsador pulsado

52 if (valor2 == HIGH)

53 {

54 // Encender semforo 2

55 ecenderSemaforo2();

56

57 // Semforo 2 activo

58 activo1 = false;

59 }

60 }

61 else

62 {

63 // Est encendido el semforo 1, comprobamos el pulsador 1


64 int valor1 = digitalRead(PULSADOR1);

65

66 // Si hay un coche esperando, pulsador pulsado

67 if (valor1 == HIGH)

68 {

69 // Encender semforo 1

70 ecenderSemaforo1();

71

72 // Semforo 1 activo

73 activo1 = true;

74 }

75 }

76 }

77

78 void ecenderSemaforo2()

79 {

80 // Apagamos semforo 1

81 // Esperamos

82 delay(tiempoEspera);

83

84 // Pasamos a luz amarilla

85 digitalWrite(LEDVERDE1, LOW);

86 digitalWrite(LEDAMARILLO1, HIGH);

87

88 // Esperamos

89 delay(tiempoCambio);

90

91 // Pasamos a luz roja

92 digitalWrite(LEDAMARILLO1, LOW);

93 digitalWrite(LEDROJO1, HIGH);

94

95 // Encendemos semforo 2

96 // Esperamos
97 delay(tiempoCambio);

98

99 // Pasamos a luz amarilla

10 digitalWrite(LEDROJO2, LOW);

0 digitalWrite(LEDVERDE2, HIGH);

10 }

10 void ecenderSemaforo1()

2 {

10 // Apagamos semforo 2

3 // Esperamos

10 delay(tiempoEspera);

10 // Pasamos a luz amarilla

5 digitalWrite(LEDVERDE2, LOW);

10 digitalWrite(LEDAMARILLO2, HIGH);

10 // Esperamos

7 delay(tiempoCambio);

10

8 // Pasamos a luz roja

10 digitalWrite(LEDAMARILLO2, LOW);

9 digitalWrite(LEDROJO2, HIGH);

11

0 // Encendemos semforo 1

11 // Esperamos

1 delay(tiempoCambio);

11

2 // Pasamos a luz amarilla

11 digitalWrite(LEDROJO1, LOW);

3 digitalWrite(LEDVERDE1, HIGH);

11 }

4
11

11

11

11

11

12

12

12

12

12

12

12

12

Conclusin de los mltiples LEDs y


pulsadores con el semforo inteligente
Bueno pues otro ejercicio prctico para comenzar a cacharrear con
Arduino y cualquier dispositivo del movimiento Maker. Es importante ir
practicando con esto ejemplos antes de enfrentarnos a cualquier otro
proyecto de mayor magnitud. La idea es que lo hagas tu slo, sin
fijarte en lo que yo hago salvo que te quedes atascado.
Hemos utilizado mltiples LEDs para simular los semforos y
pulsadores para simular los sensores de presencia. Prueba a
cambiar estos componentes por otros.

Anda mungkin juga menyukai