Cruce Peatonal Inteligente: Semáforo con Detección de Velocidad
Descripción del proyecto
Nuestro proyecto consiste en un semáforo inteligente que mejora la seguridad y la eficiencia en los cruces urbanos. Detectamos la presencia de peatones en espera y activamos el semáforo para otorgarles prioridad. Además, implementamos un sistema de alertas que se dispara al identificar vehículos que se aproximan a alta velocidad, contribuyendo a prevenir situaciones de riesgo en la intersección.
Características del sistema
- Detección de peatones: Utilizamos un sensor PIR para detectar si hay peatones esperando para cruzar la calle, y si es el caso activar el semáforo en verde para ellos y poner en rojo el de los coches.
- Control de semáforos: Usamos LEDs para simular el semáforo destinado a vehículos y otro para peatones coordinándolos para gestionar el flujo de tráfico y dar prioridad cuando es necesario.
- Estimación de velocidad: Utilizamos un sensor ultrasónico para medir la velocidad de los vehículos conforme se aproximan al cruce. Esta medición nos ayuda a anticipar situaciones de riesgo y ajustar la operación del semáforo.
- Alarma por exceso de velocidad: Implementamos una alarma sonora que se activa al detectar que un vehículo se acerca a alta velocidad. Esta alerta inmediata contribuye a reducir potenciales incidentes y a asegurar el entorno del cruce.
- Cruce seguro: Establecemos un intervalo de tiempo seguro durante el cual los peatones pueden cruzar mientras emitimos zumbidos intermitentes como señal auditiva. Esta estrategia garantiza que el cruce sea lo más seguro posible para los usuarios.
- Visualización en consola serial: Mostramos mensajes en la consola serial para facilitar la depuración y el monitoreo del sistema en tiempo real. Esto nos permite analizar el comportamiento del sistema y realizar ajustes para optimizar su funcionamiento.
Implementación y desarrollo
Proceso creativo
PLANIFICACIÓN: Lluvia de Ideas y Visualización de Recursos
El proyecto comienza con una lluvia de ideas en la que definimos las funciones clave: detección de peatones, estimación de velocidad de vehículos y alertas sonoras. Tras determinar los componentes esenciales, como sensores PIR, ultrasónicos y LEDs, visualizamos cómo integrar todo el sistema en un circuito funcional, asegurando que todos los recursos y materiales fueran los adecuados para nuestro objetivo.
DISEÑO VIRTUAL: Desarrollo en Tinkercad
Con los componentes definidos, el diseño de nuestro semáforo se construyó virtualmente en Tinkercad. Simulamos el sistema completo, desde el sensor de peatones hasta los LEDs de los semáforos, comprobando en un entorno virtual si todo respondía correctamente y ajustando las conexiones para optimizar el rendimiento antes de la implementación física.
IMPLEMENTACIÓN MODULAR: Integración de Pieza por Pieza
La implementación comenzó por integrar cada módulo de manera independiente: comenzamos con la detección de peatones y vehículos, luego conectamos los LEDs para simular el semáforo, y finalmente, incorporamos el sistema de alarmas. Cada módulo fue probado por separado para garantizar su funcionalidad antes de ensamblar el sistema completo.
IMPLEMENTACIÓN FINAL: Integración Física en la Maqueta
La última fase consistió en montar físicamente todos los componentes en la maqueta real. Hicimos ajustes finales para asegurar que la comunicación entre sensores, LEDs y el microcontrolador funcionara correctamente en un entorno real, garantizando la eficiencia del semáforo inteligente en la detección de peatones y vehículos.
Componentes Hardware
Componente | Función |
---|---|
Arduino UNO / MEGA | Microcontrolador principal |
Sensor PIR | Detecta presencia de peatones |
Sensor ultrasónico | Mide distancia y calcula velocidad de vehículos |
LEDs (rojo, amarillo, verde) | Simulan el semáforo para vehículos |
LEDs (rojo y verde) | Simulan el semáforo para peatones |
Zumbador | Alarma sonora ante exceso de velocidad o aviso peatonal |
Cables y protoboard | Conexiones entre componentes |
Código fuente
#include <Wire.h>
// Pines
const int ledRojoCoches = 9;
const int ledAmarilloCoches = 10;
const int ledVerdeCoches = 11;
const int ledRojoPeaton = 7;
const int ledVerdePeaton = 6;
const int pinZumbador = 8;
const int pirSensor = 5;
const int trigPin = 3;
const int echoPin = 4;
// Estados
bool peatonEsperando = false;
bool vehiculoEsperando = false;
bool mostrandoVelocidad = false;
bool alarmaVelocidadActiva = false;
// Temporizadores
const unsigned long maxTiempoVerdePeaton = 10000;
unsigned long tiempoUltimaVelocidad = 0;
unsigned long tiempoInicioAlarma = 0;
unsigned long tiempoUltimoPasoPeatonal = 0;
const unsigned long tiempoEsperaPIR = 3000; // 3 segundos
void setup() {
inicializarHardware();
}
void inicializarHardware() {
pinMode(ledRojoCoches, OUTPUT);
pinMode(ledAmarilloCoches, OUTPUT);
pinMode(ledVerdeCoches, OUTPUT);
pinMode(ledRojoPeaton, OUTPUT);
pinMode(ledVerdePeaton, OUTPUT);
pinMode(pinZumbador, OUTPUT);
pinMode(pirSensor, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
}
void activarAlarmaVelocidad(int duracionMs) {
alarmaVelocidadActiva = true;
tiempoInicioAlarma = millis();
unsigned long inicio = millis();
while (millis() - inicio < duracionMs) {
// Tono bajo
tone(pinZumbador, 1000); // Frecuencia baja 1000Hz
delay(100); // Mantén el tono bajo por 100ms
noTone(pinZumbador); // Apaga el tono
// Tono alto
tone(pinZumbador, 1500); // Frecuencia alta 1500Hz
delay(100); // Mantén el tono alto por 100ms
noTone(pinZumbador); // Apaga el tono
delay(100);
}
alarmaVelocidadActiva = false;
}
void cambiarLuzCoches(int rojo, int amarillo, int verde) {
digitalWrite(ledRojoCoches, rojo);
digitalWrite(ledAmarilloCoches, amarillo);
digitalWrite(ledVerdeCoches, verde);
}
void cambiarLuzPeaton(int rojo, int verde) {
digitalWrite(ledRojoPeaton, rojo);
digitalWrite(ledVerdePeaton, verde);
}
long medirDistancia() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duracion = pulseIn(echoPin, HIGH, 20000);
long distancia = duracion / 58;
return (distancia <= 2 || distancia > 400) ? 9999 : distancia;
}
void gestionarPasoPeatonal() {
while (alarmaVelocidadActiva) {
delay(100);
}
cambiarLuzCoches(0, 1, 0);
delay(3000);
cambiarLuzCoches(1, 0, 0);
cambiarLuzPeaton(0, 1);
digitalWrite(pinZumbador, HIGH);
unsigned long inicio = millis();
unsigned long lastBeep = 0, lastMovement = inicio, lastPrint = inicio;
while (millis() - inicio < maxTiempoVerdePeaton) {
if (digitalRead(pirSensor)) lastMovement = millis();
if (!alarmaVelocidadActiva && millis() - lastBeep >= 400) {
tone(pinZumbador, 1000, 100);
lastBeep = millis();
}
if (millis() - lastPrint >= 1000) {
unsigned long restante = (maxTiempoVerdePeaton - (millis() - inicio)) / 1000;
Serial.print("Quedan ");
Serial.print(restante);
Serial.println(" segundos para coches.");
lastPrint = millis();
}
delay(10);
}
noTone(pinZumbador);
cambiarLuzPeaton(1, 0);
cambiarLuzCoches(0, 1, 0);
delay(2000);
cambiarLuzCoches(0, 0, 1);
digitalWrite(pinZumbador, LOW);
tiempoUltimoPasoPeatonal = millis();
peatonEsperando = false;
}
void gestionarVehiculoDetectado() {
long dInicio = medirDistancia();
delay(200);
long dFinal = medirDistancia();
if (dFinal < 400 && abs(dFinal - dInicio) > 10) {
float velocidad = abs(dFinal - dInicio) / 0.2;
float velocidadKmH = velocidad * 0.07;
Serial.print("Velocidad estimada: ");
Serial.print(velocidadKmH, 1);
Serial.println(" km/h");
if (velocidadKmH > 20) {
if (digitalRead(ledVerdePeaton)) {
Serial.println("Coche rápido detectado mientras peatones cruzan. Alarma por 3s.");
activarAlarmaVelocidad(3000);
} else if (peatonEsperando) {
Serial.println("Coche rápido detectado mientras peatones esperan. Retrasando semáforo.");
activarAlarmaVelocidad(2000);
} else {
Serial.println("Coche rápido detectado. Alarma por 3s.");
activarAlarmaVelocidad(3000);
}
}
}
}
void loop() {
if (mostrandoVelocidad && millis() - tiempoUltimaVelocidad > 3000) {
Serial.println("Semaforo listo");
mostrandoVelocidad = false;
}
long distancia = medirDistancia();
bool movimiento = digitalRead(pirSensor);
if (movimiento && millis() - tiempoUltimoPasoPeatonal > tiempoEsperaPIR) {
peatonEsperando = true;
}
if (peatonEsperando) {
gestionarPasoPeatonal();
} else {
cambiarLuzCoches(0, 0, 1);
cambiarLuzPeaton(1,0);
if (distancia < 200) {
gestionarVehiculoDetectado();
}
}
Serial.print("PIR: ");
Serial.println(digitalRead(pirSensor));
delay(5);
}
Casos de uso
CASO DE USO | DESCRIPCIÓN |
---|---|
1. Sin coches ni peatones | Este es el estado por defecto del sistema. Si no hay peatones esperando para cruzar (el sensor PIR no detecta movimiento) y no se aproximan vehículos peligrosamente rápidos, el semáforo permanece en verde para coches y rojo para peatones. Así, se asegura una circulación continua sin interrupciones innecesarias. |
2. Cruzar la calle | Cuando un peatón se acerca y es detectado por el sensor PIR, el sistema activa una secuencia de cruce seguro: cambia la luz de los coches de verde a rojo de forma progresiva (verde → amarillo → rojo), activa el semáforo peatonal en verde, y emite pitidos intermitentes con el zumbador durante un tiempo limitado, indicando que se puede cruzar. Se muestra por el puerto serie cuánto tiempo queda antes de volver a abrir el paso a los vehículos. |
3. Vehículo sin exceso de velocidad | Si un vehículo pasa por el paso de peatones a una velocidad controlada (≤ 20 km/h), el sistema reconoce que no representa peligro y no realiza ninguna acción correctiva. Esto evita falsas alarmas o interrupciones innecesarias, permitiendo que los coches sigan circulando con normalidad cuando el entorno es seguro. |
4. Vehículo con exceso de velocidad | Si el sensor ultrasónico detecta que un coche se aproxima demasiado rápido (> 20 km/h), el sistema actúa de forma inmediata activando una alarma sonora mediante el zumbador para alertar del peligro. |
Reparto de tareas
En nuestro grupo, el reparto de tareas ha sido prácticamente equitativo en todos los aspectos del proyecto. Desde el principio, trabajamos de juntos en las salas de la universidad, colaborando todos en el desarrollo del código, el diseño en Tinkercad, el montaje del circuito y las pruebas con Arduino. Asimismo, también realizamos juntos el empotramiento del sistema, la grabación y edición de los vídeos explicativos, así como la redacción de la documentación final. Todo el proceso en general lo hemos realizado entre los 3.
Circuito en Tinkercad

Circuito con pantalla implementada:

Vídeo del sistema
Hemos subido un video enseñando el funcionamiento de los casos de prueba a YouTube. Además, hemos realizado un video enseñando la el proyecto y explicando las distintas piezas que componen el circuito, y otro explicando el código.
Para ver los vídeos se puede acceder a nuestro canal de YouTube a través de este link: https://www.youtube.com/channel/UCv8bZDBweqRqsPFkkBNFIQg
Problemas encontrados
Pantalla LED: En un principio intentamos usar una pantalla LED I2C para mostrar información, ya que en el tinkercad nos había funcionado, pero no encendía. Soldamos las patas, revisamos conexiones, la dirección y el código, pero seguía sin funcionar. No sabíamos si era por falta de voltaje, porque estaba dañada que pasaba, así que al final decidimos quitarla y mostrar la información por el monitor serial.
Interferencia entre sensor PIR Y ULTRASÓNICO: Al montar el proyecto, el sensor ultrasónico detectaba también peatones y el PIR también se activaba con vehículos. Esto generaba errores en el funcionamiento del semáforo, así que reorientamos el PIR y limitamos el paso de cebra a un solo lado, para que solo detectara peatones que venían de frente. A lo mejor podríamos haberlo solucionado con un segundo PIR en el otro lado del paso de cebra pero solo disponíamos de uno.
SENSOR PIR: El sensor PIR también nos causo problemas, ya que hacía lecturas de movimiento incorrectas, principalmente porque detectaba cosas que no se movían o no detectaba cuando sí debía. Pero finalmente con una buena colocación y ajustando correctamente los potenciómetros logramos que funcionase correctamente.
Fotos del sistema



Costes
Pieza | Coste (€) |
Sensor PIR HC-SR501 | 2,25 |
Sensor ultrasónico HC-SR04 | 2,20 |
LEDs y Resistencias | 0,05 |
Protoboard | 5,00 |
Arduino UNO | 30,00 |
Zumbador | 0,50 |
Cables | 2,50 |
Material para empotrar | 7,00 |
TOTAL | ~50,00 |
Integrantes
- Miguel Poza Sánchez
- Lucía Blanco San Segundo
- Lucas San Gregorio Domínguez