Semáforo básico con peatones y botón (Previsualizar)

Esquema de conexion LEDs y boton con Arduino
Primero debes completar Semáforo básico con peatones antes de ver esta lección

Hasta ahora hemos creado un semáforo para coches y peatones. Pero cada vez es más frecuente encontrarnos con semáforos a los que para poder cruzar la calle tengamos que pulsar un botón, consiguiendo con esto una circulación, tanto de coches como de peatones, más eficiente. Pues vamos a incorporarle a nuestro semáforo un pulsador.

¿Has usado alguna vez el botón? Si no lo has hecho, te recomendamos echar un vistazo a “Entradas digitales con botones”

Conexión del circuito

El pequeño pulsador que vamos a usar tiene cuatro conexiones, cuatro pines, los cuales pueden ser un poco confusos. Realmente, en el interior del botón, sólo hay dos conexiones eléctricas A-D y B-C.

esquema-boton-mini

Esto quiere decir que A y D son el mismo punto eléctrico, por lo que conectarlo a uno u otro es lo mismo, y todo lo que conectes a cualquiera de los dos estará conectado entre sí. Lo mismo ocurre con B y C.

Para conectar el botón necesitamos una resistencia de varios k. Los valores comunes son: 1.8k, 4.7k, 5.6k y 10k.

¿Por qué es importante usar una resistencia?

Ya hemos visto que los pines digitales de Arduino pueden configurarse como salidas, y así decidir si ponerlos a 5V (nivel alto) o 0V (nivel bajo) para encender y apagar un LED. Estos pines digitales también pueden funcionar como entradas, de forma que nuestro Arduino puede leer si en ese pin hay 5V o 0V. El circuito que tenemos que construir utiliza un botón para poner un pin digital de Arduino a 5V y 0V según esté presionado o no.

Lo primero que podríamos hacer es poner un botón entre el pin digital y 5 voltios.

boton-pin-5v

En este caso, cuando el botón está presionado, Arduino detecta 5V en su entrada digital.

boton-cerrado-pin-5v

Pero, ¿qué ocurre cuando está relajado?

boton-abierto-pin-5v

El pin de Arduino queda completamente desconectado. Esto deja el pin “flotando”, lo que quiere decir que cuando leamos su estado no podemos garantizar que esté a nivel alto o bajo. Para solucionar este estado, hay que “tirar” del pin hacia 0V. Esto se consigue con una resistencia entre el pin y 0V (GND).

boton-pin-pulldown

La corriente siempre fluye por donde menor resistencia encuentra. Cuando el botón está presionado el pin se conecta directamente a 5V, por lo que la corriente fluye entre estos dos puntos y Arduino lee este valor. Sin embargo, cuando el botón está relajado no hay camino posible entre 5V y el pin, por lo que la corriente solo puede fluir por GND, haciendo que Arduino lea 0 voltios en su pin.

boton-pin-corrientes

De esta forma, cuando presionamos el botón, Arduino lee “nivel alto”. Mientras que, cuando lo dejamos relajado, lee “nivel bajo”. También podemos cambiar este comportamiento intercambiando la resistencia y el botón.

Estas resistencias que “tiran” de un punto eléctrico hacia 0 o 5V se llaman pull-down y pull-up respectivamente.

boton-pin-pullup

De esta forma la lectura de nivel alto se corresponde con un estado alto del botón (relajado), y cuando lo bajamos/presionamos Arduino lee nivel bajo. Ambas formas son válidas y puedes elegir la que más te convenga. Yo voy a usar para el semáforo un pull-down de forma que, cuando el botón esté pulsado Arduino lea 5V (HIGH) y cuando esté relajado lea 0V (LOW).

Esquema de conexion LEDs y boton con Arduino

Los LEDs están conectados de la misma forma que en “Semáforo básico con peatones”. El botón ha sido conectado al pin 2 de Arduino con resistencia pull-up, es decir, la resistencia va desde una de las patas del botón a GND para cuando el botón esté relajado Arduino lea LOW y cuando esté pulsado lea HIGH. La otra pata del botón está conectada 5V (cable rosa y cable rojo)

Programación con Arduino IDE

1. Creamos las variables constantes que van a guardar el valor de los pines a los que hemos conectado cada uno de los LEDs y el botón:

const int LED_ROJO_COCHE = 13;
const int LED_AMBAR_COCHE = 11;
const int LED_VERDE_COCHE = 9;
const int LED_ROJO_PEATON = 7;
const int LED_VERDE_PEATON = 5;
const int BOTON = 2;

2. Creamos la variable que va a almacenar el estado del botón. Esto es, la variable va a cambiar a lo largo del programa porque guarda la posición en la que se encuentra el botón (presionado o relajado, HIGH o LOW). Por lo tanto, esta variable va a almacenar un número entero NO constante:

int estadoBoton = 0;

Es buena pŕactica de programación nombrar a las variables que NO son constantes en minúsculas. Si el nombre de la variable lo componen varias palabras, la primera inicial de cada palabra se pone en mayúsculas, excepto la de la primera palabra.

3. Inicializamos los LEDs como salidas y el botón como entrada en la función void setup():

pinMode (LED_ROJO_COCHE, OUTPUT);
pinMode(LED_AMBAR_COCHE, OUTPUT);
pinMode(LED_VERDE_COCHE, OUTPUT);
pinMode(LED_ROJO_PEATON, OUTPUT);
pinMode(LED_VERDE_PEATON, OUTPUT);
pinMode(BOTON, INPUT);

Ahora, en la función loop() vamos a programar qué queremos que ocurra en nuestro semáforo, de qué forma queremos regular el tráfico tanto de coches como de peatones. ¿Estás preparado?

La primera pregunta que debemos hacernos es: ¿Cuándo queremos que actúe nuestro botón? Parece razonable pensar que el momento idóneo es cuando el semáforo de peatones está en rojo y el de coches en verde.

La función que queremos que tenga nuestro botón es que invierta la posición de los semáforos, que pare el tráfico para los coches y permita que los peatones crucen la calle. Entonces debemos de hacernos una serie de preguntas:

  • Si no hay peatones, ¿cómo debe de estar el semáforo?
  • Si un peatón pulsa el botón, ¿qué secuencia queremos que haga nuestro semáforo?

La respuesta lógica a la primera pregunta, es que si no hay ningún peatón que quiera cruzar la calle el semáforo de los coches permanezca en verde y el semáforo para peatones en rojo. Mientras que, si un peatón pulsa el botón el semáforo de los coches debería de pasar de verde a ámbar y de ámbar a rojo y, el de los peatones ponerse en verde para que estos puedan cruzar sin peligro la calle. Por lo tanto, en la función void loop () tendremos el siguiente código:

digitalWrite(LED_VERDE_COCHE, HIGH);
digitalWrite(LED_ROJO_PEATON, HIGH);

Si el peatón pulsa el botón, Arduino detecta el cambio, ¿cómo lo hace? Para ello, tenemos que leer el estado en el que se encuentra el botón contínuamente y guardar ese estado en la variable estadoBoton:

estadoBoton = digitalRead(BOTON);

De forma que cuando la variable almacenada sea modificada, Arduino ejecutará la secuencia que queremos que el semáforo haga. Es decir:

if (estadoBoton == HIGH) {
  digitalWrite(LED_VERDE_COCHE, LOW);
  digitalWrite(LED_AMBAR_COCHE, HIGH);
  delay(500);
  digitalWrite(LED_AMBAR_COCHE, LOW);
  digitalWrite(LED_ROJO_COCHE, HIGH);
  digitalWrite(LED_ROJO_PEATON, LOW);
  digitalWrite(LED_VERDE_PEATON, HIGH);
  delay(5000);
  digitalWrite(LED_ROJO_COCHE, LOW);
}

En definitiva, nuestro código completo es:

Cacharrea, crea y comparte tus proyectos.

  • Agotado
    Genuino UNO Rev. 3
    Genuino UNO Rev. 3
    Leer más
    Vista rápida
    25,00  (20,66  excl. IVA)
    Temporalmente no disponible
  • Kit de botones con resistencias pull-up/down
    Kit de botones con resistencias pull-up/down
    Añadir al carrito
    Vista rápida
    2,00  (1,65  excl. IVA)
    En tienda
  • ¡Oferta!
    Kit de LEDs de 5mm con resistencias
    Kit de LEDs de 5mm con resistencias
    Seleccionar opciones
    Vista rápida
    4,00  1,00  (0,83  excl. IVA)
    ¡Liquidación!
Volver a: Semáforo con Arduino

©2017 Fábrica Digital desde Jerez de la Frontera, España.

956 05 77 07 (llamadas) / 717 717 452 (Whatsapp) / hola@fabricadigital.org

De Lunes a Viernes de 9 a 13h y de 14 a 18h. Sábados de 10 a 14h.

Calle Manuel Yélamo Crespillo, Edif. Los Ramos, 11401 Jerez de la Frontera, Cádiz. - Cómo llegar

Información Legal - Aceptamos

 

Inicia Sesión con tu Usuario y Contraseña

o    

¿Olvidó sus datos?

Create Account