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.
🧰 Lista de materiales
🎯 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.
| Distancia | Zona | LED | Cadencia pitido |
|---|---|---|---|
| > 50 cm | Segura | Verde | Silencio |
| 20–50 cm | Precaución | Amarillo | Lento |
| < 20 cm | Peligro | Rojo | Rápido / continuo |
🔌 Conexiones
| Componente | Pin |
|---|---|
| HC-SR04 Trig / Echo | D11 / D12 |
| LED verde | D2 vía 220 Ω |
| LED amarillo | D3 vía 220 Ω |
| LED rojo | D4 vía 220 Ω |
| Zumbador pasivo | D8 |
💻 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
- Coloca los 3 LEDs (verde, amarillo, rojo) con sus resistencias.
- Cablea el HC-SR04 (Trig→D11, Echo→D12).
- Conecta el zumbador pasivo a D8.
- Sube el sketch y acerca un objeto: cambia de zona y cadencia.
🧩 Resolución de problemas
| Síntoma | Causa | Solución |
|---|---|---|
| Siempre verde | Sin eco (devuelve 999) | Apunta a una superficie plana |
| Pitido continuo raro | Lógica de zonas | Ajusta los límites cm |
| No pita | Zumbador activo en vez de pasivo | Usa 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).