Tomo 3: ¡Tu Ciudad Inteligente! - El Semáforo Inclusivo

¡Hola de nuevo, inventores urbanos! Hasta ahora hemos encendido luces y aprendido a escuchar botones. Pero en el mundo real, la tecnología tiene un propósito más alto: resolver problemas reales y hacer el mundo más accesible.

Hoy nos convertiremos en ingenieros de tráfico urbano. Vamos a fusionar lo que ya conocemos para construir un Semáforo Inteligente e Inclusivo: un sistema que detenga el tráfico vehicular cuando un peatón lo solicite, y que además emita alertas sonoras intermitentes para ayudar a cruzar de forma segura a personas con debilidad visual.


🌟 El Protagonista de Hoy: El Zumbador Pasivo (Buzzer)

Es hora de hacer ruido. El buzzer pasivo es un pequeño componente que, a diferencia de un LED que emite luz continua, necesita recibir ondas eléctricas a diferentes velocidades para vibrar y generar tonos audibles. En Arduino usamos el comando tone(pin, frecuencia, duracion); para decirle exactamente qué nota tocar y por cuánto tiempo.

Vista frontal del buzzer pasivo Vista inferior del buzzer mostrando sus pines de conexión

🔌 El Circuito: Manos a la Obra

Montaremos una verdadera intersección vial en nuestra protoboard: 3 LEDs para los automóviles, 2 LEDs para los peatones, un botón pulsador con resistencia interna y nuestro nuevo Buzzer. ¡Cuida mucho tus conexiones y el orden de los cables!

Componentes Necesarios:

Cant. Componente
1 Placa Arduino UNO y Protoboard
3 LEDs de Autos (1 Rojo, 1 Amarillo, 1 Verde)
2 LEDs Peatonales (1 Rojo, 1 Verde)
5 Resistencias de 220Ω (una para cada LED)
1 Pulsador táctil (Botón)
1 Buzzer Pasivo
Varios Cables Jumper

⚡ Diagrama de armado: Intersección Vial

Diagrama de conexión del semáforo inclusivo con buzzer y botón

💡 Conceptos Clave

El Gran Dilema: El "Código Espagueti" y el Control del Tráfico

Imagina la escena: tienes que apagar el verde de autos, encender el amarillo, luego el rojo; inmediatamente después, apagar el rojo peatonal, encender el verde peatonal y hacer que el buzzer pite de forma intermitente. Si intentamos escribir todo esto directamente dentro del void loop(), se convertirá en lo que llamamos "Código Espagueti": un bloque de texto gigante, desordenado y casi imposible de leer. La solución de un verdadero programador es usar Funciones Personalizadas.


🧠 El Código: Creando Nuestro Propio Comando

En este programa, en lugar de amontonar código, sacaremos toda la secuencia de luces del loop() y la empaquetaremos en una función nueva que nosotros inventaremos llamada activarPasoPeatonal(). ¡Observa la limpieza!

Código Arduino - Misión 03

/*
 * Misión 03: ¡El Semáforo Inteligente Inclusivo!
 * Descripción: Aprendiendo a programar funciones personalizadas para coordinar
 * un sistema interactivo de tráfico con asistencia auditiva por buzzer.
 * Por: Profe Campos
 * CECyTEM 05 Guacamayas
 */

// Pines del Semáforo de Autos
int cocheVerde = 10;
int cocheAmarillo = 11;
int cocheRojo = 12;

// Pines del Semáforo Peatonal
int peatonVerde = 8;
int peatonRojo = 9;

// Asistentes del sistema
int pinBuzzer = 7;
int botonPeaton = 2;

void setup() {
  // Configuramos pines de iluminación y sonido como SALIDAS
  pinMode(cocheVerde, OUTPUT);
  pinMode(cocheAmarillo, OUTPUT);
  pinMode(cocheRojo, OUTPUT);
  pinMode(peatonVerde, OUTPUT);
  pinMode(peatonRojo, OUTPUT);
  pinMode(pinBuzzer, OUTPUT);

  // Activamos el pull-up interno para el botón (Recuerda: Presionado = LOW)
  pinMode(botonPeaton, INPUT_PULLUP);

  // Estado inicial seguro: Autos avanzan, peatones esperan en rojo
  digitalWrite(cocheVerde, HIGH);
  digitalWrite(peatonRojo, HIGH);
}

void loop() {
  // El loop se mantiene limpio y veloz, vigilando el botón constantemente
  if (digitalRead(botonPeaton) == LOW) {
    // ¡Invocamos nuestro comando personalizado! El programa salta a ejecutarlo
    activarPasoPeatonal(); 
  }
}

// =======================================================
// NUESTRO COMANDO PERSONALIZADO (Fuera del loop)
// =======================================================
void activarPasoPeatonal() {
  // 1. Transición de precaución para autos
  digitalWrite(cocheVerde, LOW);
  digitalWrite(cocheAmarillo, HIGH);
  delay(2000); 
  
  // 2. Autos se detienen
  digitalWrite(cocheAmarillo, LOW);
  digitalWrite(cocheRojo, HIGH);
  delay(1000); // Margen de seguridad antes de dar paso al peatón
  
  // 3. Cruce peatonal con asistencia sonora
  digitalWrite(peatonRojo, LOW);
  digitalWrite(peatonVerde, HIGH);
  
  // Pitido 1
  tone(pinBuzzer, 800, 300); // Emite tono de 800Hz por 300ms
  delay(600);                
  // Pitido 2
  tone(pinBuzzer, 800, 300);
  delay(600);
  // Pitido 3
  tone(pinBuzzer, 800, 300);
  delay(600);
  
  // 4. Advertencia de que el tiempo se acaba (Parpadeo y sonido rápido)
  digitalWrite(peatonVerde, LOW); tone(pinBuzzer, 1200, 150); delay(300);
  digitalWrite(peatonVerde, HIGH); delay(300);
  digitalWrite(peatonVerde, LOW); tone(pinBuzzer, 1200, 150); delay(300);
  digitalWrite(peatonVerde, HIGH); delay(300);
  
  // 5. Fin del cruce peatonal
  digitalWrite(peatonVerde, LOW);
  digitalWrite(peatonRojo, HIGH);
  delay(1000); // Margen de seguridad antes de arrancar autos
  
  // 6. Autos vuelven a avanzar
  digitalWrite(cocheRojo, LOW);
  digitalWrite(cocheVerde, HIGH);
}

🚀 ¡Inténtalo Tú Mismo! (Retos)