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

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

2 días hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

1 semana hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

1 semana hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

1 semana hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

1 semana hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

1 semana hace

Esta web usa cookies.