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.
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.
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
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
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.
Componentes necesarios
Asegrate que tienes los siguientes componentes para montar el
circuito.
Arduino UNO (o equivalente)
6 resistencias 220
2 resistencias 10 k
3 LEDs verdes
3 LEDs amarillos
3 LEDs rojos
2 pulsadores
Es una buena prctica utilizar cables de colores agrupados para los mltiples LEDs y
rpidamente.
3. Semforo 1 activo
1. Semforo 1 activo
1. Si pulsado
2. Semforo 2 activo
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
1 // Variables
2 bool activo1 = true; // Indica si el semforo 1 est activo, de lo contrario ser el semforo 2
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).
1 void setup() {
3 Serial.begin(9600);
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);
1 digitalWrite(LEDVERDE1, LOW);
3 digitalWrite(LEDAMARILLO1, LOW);
1 digitalWrite(LEDROJO1, LOW);
4 digitalWrite(LEDVERDE2, LOW);
1 digitalWrite(LEDAMARILLO2, LOW);
5 digitalWrite(LEDROJO2, LOW);
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() {
3 if (activo1)
4 {
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
22
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
2 {
3 // Apagamos semforo 1
4 // Esperamos
5 delay(tiempoEspera);
8 digitalWrite(LEDVERDE1, LOW);
9 digitalWrite(LEDAMARILLO1, HIGH);
10
11 // Esperamos
12 delay(tiempoCambio);
13
15 digitalWrite(LEDAMARILLO1, LOW);
16 digitalWrite(LEDROJO1, HIGH);
17
18 // Encendemos semforo 2
19 // Esperamos
20 delay(tiempoCambio);
21
23 digitalWrite(LEDROJO2, LOW);
24 digitalWrite(LEDVERDE2, HIGH);
25 }
26
27 void ecenderSemaforo1()
28 {
29 // Apagamos semforo 2
30 // Esperamos
31 delay(tiempoEspera);
32
34 digitalWrite(LEDVERDE2, LOW);
35 digitalWrite(LEDAMARILLO2, HIGH);
36
37 // Esperamos
38 delay(tiempoCambio);
39
41 digitalWrite(LEDAMARILLO2, LOW);
42 digitalWrite(LEDROJO2, HIGH);
43
44 // Encendemos semforo 1
45 // Esperamos
46 delay(tiempoCambio);
47
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
16
17 void setup() {
19 Serial.begin(9600);
20
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
40 digitalWrite(LEDVERDE1, HIGH);
41 digitalWrite(LEDROJO2, HIGH);
42 }
43
44 void loop() {
46 if (activo1)
47 {
50
52 if (valor2 == HIGH)
53 {
54 // Encender semforo 2
55 ecenderSemaforo2();
56
57 // Semforo 2 activo
58 activo1 = false;
59 }
60 }
61 else
62 {
65
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
85 digitalWrite(LEDVERDE1, LOW);
86 digitalWrite(LEDAMARILLO1, HIGH);
87
88 // Esperamos
89 delay(tiempoCambio);
90
92 digitalWrite(LEDAMARILLO1, LOW);
93 digitalWrite(LEDROJO1, HIGH);
94
95 // Encendemos semforo 2
96 // Esperamos
97 delay(tiempoCambio);
98
10 digitalWrite(LEDROJO2, LOW);
0 digitalWrite(LEDVERDE2, HIGH);
10 }
10 void ecenderSemaforo1()
2 {
10 // Apagamos semforo 2
3 // Esperamos
10 delay(tiempoEspera);
5 digitalWrite(LEDVERDE2, LOW);
10 digitalWrite(LEDAMARILLO2, HIGH);
10 // Esperamos
7 delay(tiempoCambio);
10
10 digitalWrite(LEDAMARILLO2, LOW);
9 digitalWrite(LEDROJO2, HIGH);
11
0 // Encendemos semforo 1
11 // Esperamos
1 delay(tiempoCambio);
11
11 digitalWrite(LEDROJO1, LOW);
3 digitalWrite(LEDVERDE1, HIGH);
11 }
4
11
11
11
11
11
12
12
12
12
12
12
12
12