Lógica del programa
- Estado Reposo:
- Led Rojo apagado
- Led Verde apagado
- Si sensor detecta vehículo:
- Rojo encendido
- Si se pulsa el botón (vehículo autorizado):
- Verde encendido 5 segundos
- Rojo apagado
- Durante esos 5 segundos:
- Si entra otro vehículo → Verde se apaga inmediatamente y vuelve a rojo
- Al terminar:
- Todo vuelve a reposo
Componentes
- Arduino UNO
- Sensor ultrasónico HC-SR04
- 2 LEDs (rojo y verde) con resistencias de 220 Ω
- Pulsador
- Cables de conexión
Conexiones
1. Sensor ultrasónico HC-SR04
- VCC → 5V
- GND → GND
- Trig → pin 5
- Echo → pin 6
2. Botón pulsador
- Un lado → pin 7
- Otro lado → GND
- En código:
pinMode(7, INPUT_PULLUP)
3. LEDs
- LED Rojo: ánodo → pin 8, cátodo → GND (resistencia 220 Ω)
- LED Verde: ánodo → pin 9, cátodo → GND (resistencia 220 Ω)
codigo ejemplo para probar en Tinkercad
const int trigPin = 5;
const int echoPin = 6;
const int botonPin = 7;
const int ledRojo = 8;
const int ledVerde = 9;
long duracion;
int distancia;
bool enVerde = false;
unsigned long tiempoVerde = 0;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(botonPin, INPUT_PULLUP);
pinMode(ledRojo, OUTPUT);
pinMode(ledVerde, OUTPUT);
digitalWrite(ledRojo, LOW);
digitalWrite(ledVerde, LOW);
}
void loop() {
// Medir distancia
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duracion = pulseIn(echoPin, HIGH);
distancia = duracion * 0.034 / 2; // cm
bool vehiculoDetectado = (distancia > 0 && distancia < 20); // Ajusta según distancia
// Si está en verde y entra otro vehículo
if(enVerde && vehiculoDetectado){
enVerde = false;
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, HIGH);
}
// Estado reposo
if(!vehiculoDetectado && !enVerde){
digitalWrite(ledRojo, LOW);
digitalWrite(ledVerde, LOW);
}
// Vehículo detectado, rojo encendido
if(vehiculoDetectado && !enVerde){
digitalWrite(ledRojo, HIGH);
}
// Botón pulsado → verde
if(digitalRead(botonPin) == LOW && vehiculoDetectado){
enVerde = true;
tiempoVerde = millis();
digitalWrite(ledVerde, HIGH);
digitalWrite(ledRojo, LOW);
}
// Mantener verde 5s
if(enVerde && millis() - tiempoVerde >= 5000){
enVerde = false;
digitalWrite(ledVerde, LOW);
digitalWrite(ledRojo, LOW);
}
delay(50);
}