Ir al contenido
← Volver a Formación Arduino Intermedio

12. Aparcamiento asistido (sensor de proximidad)

Como el sensor de aparcamiento de un coche: pita más rápido cuanto más cerca está el obstáculo, con LEDs verde-amarillo-rojo.

Dificultad: Intermedio · Tiempo: 50 min · Cerebro: Arduino Uno

🧰 Lista de materiales

Arduino Uno R3 (ATmega328P)
Arduino Uno R3 (ATmega328P)
Mide y avisa por zonas
sin foto
Sensor ultrasónico HC-SR04
Mide la distancia al obstáculo
LED 5 mm verde difuso
LED 5 mm verde difuso
Zona segura
LED 5 mm amarillo difuso
LED 5 mm amarillo difuso
Zona de precaución
LED 5 mm rojo difuso
LED 5 mm rojo difuso
Zona de peligro
sin foto
Zumbador pasivo 12 mm
Pitido de frecuencia variable
sin foto
Resistencias película metálica 1/4 W
220 Ω ×3
Breadboard 830 puntos
Breadboard 830 puntos
Montaje

🎯 Qué vas a aprender

A traducir una medida continua en zonas de alerta y a generar un pitido cuya cadencia depende de la distancia, usando millis() para no bloquear el programa.

📚 Teoría: pitido sin bloquear con millis()

Si usáramos delay() para espaciar los pitidos, el programa se quedaría «congelado» y no podría seguir midiendo. La técnica millis() consulta el reloj interno y actúa solo cuando ha pasado el intervalo deseado, dejando el resto del tiempo libre para medir.

DistanciaZonaLEDCadencia pitido
> 50 cmSeguraVerdeSilencio
20–50 cmPrecauciónAmarilloLento
< 20 cmPeligroRojoRápido / continuo

🔌 Conexiones

ComponentePin
HC-SR04 Trig / EchoD11 / D12
LED verdeD2 vía 220 Ω
LED amarilloD3 vía 220 Ω
LED rojoD4 vía 220 Ω
Zumbador pasivoD8

💻 Código completo

// Aparcamiento asistido por zonas
const int TRIG = 11, ECHO = 12;
const int LED_V = 2, LED_A = 3, LED_R = 4, BUZZER = 8;

long medir() {
  digitalWrite(TRIG, LOW);  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH); delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  long t = pulseIn(ECHO, HIGH, 30000);
  return t == 0 ? 999 : t * 0.0343 / 2;
}

unsigned long ultimoBeep = 0;
bool beepOn = false;

void setup() {
  pinMode(TRIG, OUTPUT); pinMode(ECHO, INPUT);
  pinMode(LED_V, OUTPUT); pinMode(LED_A, OUTPUT);
  pinMode(LED_R, OUTPUT); pinMode(BUZZER, OUTPUT);
}

void loop() {
  long d = medir();
  digitalWrite(LED_V, d > 50);
  digitalWrite(LED_A, d <= 50 && d > 20);
  digitalWrite(LED_R, d <= 20);

  // intervalo de pitido según distancia
  int intervalo;
  if (d > 50)       intervalo = 0;      // silencio
  else if (d > 20)  intervalo = 500;    // lento
  else if (d > 8)   intervalo = 150;    // rápido
  else              intervalo = 0, tone(BUZZER, 1500); // continuo

  if (intervalo > 0) {
    if (millis() - ultimoBeep > intervalo) {
      ultimoBeep = millis();
      beepOn = !beepOn;
      if (beepOn) tone(BUZZER, 1500); else noTone(BUZZER);
    }
  } else if (d > 50) {
    noTone(BUZZER);
  }
}

🛠️ Montaje paso a paso

  1. Coloca los 3 LEDs (verde, amarillo, rojo) con sus resistencias.
  2. Cablea el HC-SR04 (Trig→D11, Echo→D12).
  3. Conecta el zumbador pasivo a D8.
  4. Sube el sketch y acerca un objeto: cambia de zona y cadencia.

🧩 Resolución de problemas

SíntomaCausaSolución
Siempre verdeSin eco (devuelve 999)Apunta a una superficie plana
Pitido continuo raroLógica de zonasAjusta los límites cm
No pitaZumbador activo en vez de pasivoUsa el pasivo con tone()

🚀 Para ir más lejos

  • Muestra la distancia en el display de 4 dígitos (proyecto 14).
  • Monta el sensor en la parte trasera de un robot (proyecto 24).
← Volver a Formación Arduino