Ú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.
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.
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.
Usamos, como siempre, resistencias de 220 ohms. La distribución es:
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.
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í.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.
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
Hola. Gracias por su comentario. Para consultas personalizadas puede contactarme en: https://parzibyte.me#contacto
Saludos :)