arduino

Semáforo doble con cruces peatonales en Arduino

Último post sobre simulación de semáforos en Arduino. En este ejercicio veremos cómo simular el comportamiento de un semáforo doble (o dos semáforos) que tienen además un cruce peatonal.

En total vamos a usar 10 leds: 3 para el semáforo 1, 3 para el semáforo 2 y finalmente 4 para los dos cruces peatonales (verde y rojo)

El ejercicio anterior trató sobre un semáforo doble en Arduino; el presente es la “continuación” del mismo.

Instrucciones

Realizar un sketch en Arduino que permita encender 10 LED’s con la lógica de dos semáforos con cruce y, adicionalmente, con cruce de peatones; cuando uno de ellos esté en ROJO, un led debe indicar el paso peatonal en VERDE.

Previo a que el semáforo dé paso a los automóviles, el cruce de peatones debe parpadear 4 veces; al colocarse el semáforo en verde, el cruce peatonal debe estar en ROJO; dicho comportamiento debe replicarse en el segundo semáforo.

Circuito de semáforo doble con cruces peatonales

Tiene 2 semáforos y dos cruces peatonales. Cada cruce peatonal está ligado a un semáforo; se sigue la misma lógica que en los ejercicios anteriores respetando las instrucciones previamente presentadas.

1.3 Semáforo doble con cruces peatonales

Usamos, como siempre, resistencias de 220 ohms. La distribución es:

  • Pines 2, 3 y 4 para el semáforo 1
  • Pines 5 y 6 para el cruce 1
  • Pines 7, 8 y 9 para el semáforo 2
  • Pines 10 y 11 para el cruce 2

El Arduino alimenta a la protoboard a través de los pines de voltaje, los leds también van conectados a la tierra de la placa.

Código de semáforos con cruces peatonales en Arduino

El código es una evolución de los anteriores, se utilizan más pines pero al final el comportamiento es casi el mismo.

He puesto los semáforos y cruces peatonales en arreglos, además de haber creado varias funciones útiles y amigables como parpadear_led_verde_cruce_1 que indican lo que hacen por su nombre.

/**
  Prueba 3: Semáforo doble con cruces peatonales
  INSTRUCCIONES: Realizar un sketch en Arduino que permita
  encender 10 LED’s con la lógica de dos semáforos con cruce y,
  adicionalmente, con cruce de peatones; cuando uno de ellos esté en ROJO,
  un led debe indicar el paso peatonal en VERDE. Previo a que el semáforo
  dé paso a los automóviles, el cruce de peatones debe parpadear 4 veces;
  al colocarse el semáforo en verde, el cruce peatonal debe estar en ROJO;
  dicho comportamiento debe replicarse en el segundo semáforo
  
  @author parzibyte
  Visita: parzibyte.me/blog
*/const int semaforo1[] = {
  2, 3, 4
},
cruce1[] = {
  5, 6
},
semaforo2[] = {
  7, 8, 9
},
cruce2[] = {
  10, 11
},
duracion_verde_rojo = 2000,
duracion_amarillo = 1000,
duracion_parpadeo = 150;
const boolean DEBUG = true;


void encender_verde_semaforo_1() {
  digitalWrite(semaforo1[0], HIGH);
  if (DEBUG) Serial.println("Semaforo 1: VERDE");
}


void apagar_verde_semaforo_1() {
  digitalWrite(semaforo1[0], LOW);
}

void parpadear_verde_semaforo_1() {
  if (DEBUG) Serial.println("Semaforo 1: VERDE PARPADEANDO");
  for (int x = 0; x < 2; x++) {
    digitalWrite(semaforo1[0], HIGH);
    delay(duracion_parpadeo);
    digitalWrite(semaforo1[0], LOW);
    delay(duracion_parpadeo);
  }
  if (DEBUG) Serial.println("Semaforo 1: VERDE HA TERMINADO DE PARPADEAR");
}
void encender_amarillo_semaforo_1() {
  if (DEBUG) Serial.println("Semaforo 1: AMARILLO");
  digitalWrite(semaforo1[1], HIGH);
}


void apagar_amarillo_semaforo_1() {
  digitalWrite(semaforo1[1], LOW);
}

void encender_rojo_semaforo_1() {
  if (DEBUG) Serial.println("Semaforo 1: ROJO");
  digitalWrite(semaforo1[2], HIGH);
}


void apagar_rojo_semaforo_1() {
  digitalWrite(semaforo1[2], LOW);
}


void encender_verde_semaforo_2() {
  if (DEBUG) Serial.println("Semaforo 2: VERDE");
  digitalWrite(semaforo2[0], HIGH);
}


void apagar_verde_semaforo_2() {
  digitalWrite(semaforo2[0], LOW);
}

void parpadear_verde_semaforo_2() {
  if (DEBUG) Serial.println("Semaforo 2: VERDE PARPADEANDO");
  for (int x = 0; x < 2; x++) {
    digitalWrite(semaforo2[0], HIGH);
    delay(duracion_parpadeo);
    digitalWrite(semaforo2[0], LOW);
    delay(duracion_parpadeo);
  }
  if (DEBUG) Serial.println("Semaforo 2: VERDE HA TERMINADO DE PARPADEAR");
}
void encender_amarillo_semaforo_2() {
  if (DEBUG) Serial.println("Semaforo 2: AMARILLO");
  digitalWrite(semaforo2[1], HIGH);
}


void apagar_amarillo_semaforo_2() {
  digitalWrite(semaforo2[1], LOW);
}

void encender_rojo_semaforo_2() {
  if (DEBUG) Serial.println("Semaforo 2: ROJO");
  digitalWrite(semaforo2[2], HIGH);
}


void apagar_rojo_semaforo_2() {
  digitalWrite(semaforo2[2], LOW);
}

void esperar_duracion_verde_o_rojo() {
  if (DEBUG) Serial.println("Esperando que acabe el tiempo del verde o del rojo");
  delay(duracion_verde_rojo);
  if (DEBUG) Serial.println("Tiempo del verde o del rojo terminado");
}
void esperar_duracion_amarillo() {
  if (DEBUG) Serial.println("Esperando que acabe el tiempo del amarillo");
  delay(duracion_amarillo);
  if (DEBUG) Serial.println("Tiempo del amarillo terminado");
}

void parpadear_verde_cruce_1() {
  if (DEBUG) Serial.println("Cruce peatonal 1: VERDE PARPADEANDO");
  for (int x = 0; x < 5; x++) {
    digitalWrite(cruce1[0], HIGH);
    delay(duracion_parpadeo);
    digitalWrite(cruce1[0], LOW);
    delay(duracion_parpadeo);
  }
  if (DEBUG) Serial.println("Cruce peatonal 1: VERDE HA TERMINADO DE PARPADEAR");
}

void encender_verde_cruce_1() {
  if (DEBUG) Serial.println("Cruce peatonal 1: VERDE");
  digitalWrite(cruce1[0], HIGH);
}
void apagar_verde_cruce_1() {
  digitalWrite(cruce1[0], LOW);
}

void encender_rojo_cruce_1() {
  if (DEBUG) Serial.println("Cruce peatonal 1: ROJO");
  digitalWrite(cruce1[1], HIGH);
}
void apagar_rojo_cruce_1() {
  digitalWrite(cruce1[1], LOW);
}

void parpadear_verde_cruce_2() {
  if (DEBUG) Serial.println("Cruce peatonal 2: VERDE PARPADEANDO");
  for (int x = 0; x < 5; x++) {
    digitalWrite(cruce2[0], HIGH);
    delay(duracion_parpadeo);
    digitalWrite(cruce2[0], LOW);
    delay(duracion_parpadeo);
  }
  if (DEBUG) Serial.println("Cruce peatonal 2: VERDE HA TERMINADO DE PARPADEAR");
}

void encender_verde_cruce_2() {
  if (DEBUG) Serial.println("Cruce peatonal 2: VERDE");
  digitalWrite(cruce2[0], HIGH);
}
void apagar_verde_cruce_2() {
  digitalWrite(cruce2[0], LOW);
}

void encender_rojo_cruce_2() {
  if (DEBUG) Serial.println("Cruce peatonal 2: ROJO");
  digitalWrite(cruce2[1], HIGH);
}
void apagar_rojo_cruce_2() {
  digitalWrite(cruce2[1], LOW);
}
void setup() {
  if (DEBUG) Serial.begin(9600);
  for (int x = 0; x < 3; x++) {
    pinMode(semaforo1[x], OUTPUT);
    pinMode(semaforo2[x], OUTPUT);
  }
  for (int x = 0; x < 2; x++) {
    pinMode(cruce1[x], OUTPUT);
    pinMode(cruce2[x], OUTPUT);
  }
}

void loop() {
  if (DEBUG) Serial.println("\n");
  encender_verde_semaforo_1();
  encender_rojo_semaforo_2();
  encender_rojo_cruce_1();
  encender_verde_cruce_2();
  esperar_duracion_verde_o_rojo();


  parpadear_verde_semaforo_1();
  apagar_verde_semaforo_1();
  encender_amarillo_semaforo_1();
  parpadear_verde_cruce_2();


  apagar_rojo_semaforo_2();
  apagar_amarillo_semaforo_1();
  encender_verde_semaforo_2();
  encender_rojo_semaforo_1();
  apagar_rojo_cruce_1();
  encender_verde_cruce_1();
  apagar_verde_cruce_2();
  encender_rojo_cruce_2();
  esperar_duracion_verde_o_rojo();

  parpadear_verde_semaforo_2();
  apagar_verde_semaforo_2();
  encender_amarillo_semaforo_2();
  parpadear_verde_cruce_1();
  apagar_rojo_semaforo_1();
  apagar_amarillo_semaforo_2();
  apagar_verde_cruce_1();
  apagar_rojo_cruce_2();
}

Si quieres probarlo directamente en tu navegador, haz click aquí.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • tengo dos preguntas acerca de: Circuito de semáforo doble con cruces peatonales
    1. como se haría el código iniciando 5 veces intermitente el rojo del vehicular que no lleva la vía, el amarillo del vehicular que lleva la vía, el rojo de los peatones?
    2. como se haría el código utilizando tiempo real, por ejemplo: que de las 6pm a las 8 pm el semáforo quede intermitente como en la primera pregunta?

    gracias por su aporte, estoy atento

Entradas recientes

Servidor HTTP en Android con Flutter

El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…

4 días hace

Imprimir automáticamente todos los PDF de una carpeta

En este post te voy a enseñar a designar una carpeta para imprimir todos los…

5 días hace

Guía para imprimir en plugin versión 1 desde Android

En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…

1 semana hace

Añadir tasa de cambio en sistema de información

Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…

2 semanas hace

Comprobar validez de licencia de plugin ESC POS

Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…

2 semanas hace

Imprimir euro € en impresora térmica

Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…

4 semanas hace

Esta web usa cookies.