Sensor ultrasónico con Arduino (HC-SR04): conexión y código paso a paso
¿Quieres que tu Arduino "vea" a qué distancia está un objeto, como hacen los sensores de parqueo de los carros? El sensor ultrasónico HC-SR04 con Arduino es la forma más fácil y económica de lograrlo. En esta guía para principiantes te explico cómo funciona, cómo conectar sus cuatro pines, un código completo listo para copiar y un segundo proyecto: una alarma de proximidad con LED y buzzer. No necesitas instalar librerías.
Qué es el sensor ultrasónico HC-SR04 y para qué sirve
El HC-SR04 es un módulo que mide distancias sin tocar el objeto. Tiene dos "parlantes" redondos: el marcado con T (transmisor) emite un sonido de 40 kHz, demasiado agudo para que lo escuchemos, y el marcado con R (receptor) escucha el eco que rebota en el objeto.
Algunos usos típicos del sensor ultrasónico con Arduino:
- Robots que esquivan obstáculos.
- Sensor de parqueo con pitidos que se aceleran al acercarse.
- Medidor del nivel de agua de un tanque.
- Caneca de basura que abre la tapa sola con un servomotor.
Cómo funciona: Trig, Echo y la velocidad del sonido

Una medición tiene tres momentos:
- El Arduino pone el pin Trig en HIGH durante al menos 10 microsegundos (µs).
- El módulo emite una ráfaga de 8 pulsos de ultrasonido a 40 kHz y pone el pin Echo en HIGH.
- Cuando el eco regresa, Echo vuelve a LOW. El tiempo que Echo estuvo en HIGH es lo que tardó el sonido en ir hasta el objeto y volver.
Con ese tiempo aplicamos la fórmula de siempre: distancia = velocidad × tiempo. La velocidad del sonido en el aire, a unos 20 °C, es de aproximadamente 343 m/s, que equivale a 0,0343 cm por microsegundo. Como el sonido hizo el viaje de ida y de vuelta, dividimos entre 2:
distancia (cm) = tiempo (µs) × 0,0343 / 2
Ejemplo: si Echo dura 1.000 µs, la distancia es 1.000 × 0,0343 / 2 = 17,15 cm. Un atajo que trae la hoja de datos es dividir el tiempo entre 58: 1.000 / 58 ≈ 17 cm. La hoja de datos usa 340 m/s; la diferencia es menor al 1 %.
Características técnicas del HC-SR04
Estos son los datos de la hoja de datos del fabricante (ElecFreaks):
| Parámetro | Valor |
|---|---|
| Voltaje de trabajo | 5 V DC |
| Corriente de trabajo | 15 mA |
| Frecuencia del ultrasonido | 40 kHz |
| Rango de medición | 2 cm a 400 cm |
| Resolución | Hasta 3 mm en condiciones ideales |
| Ángulo de medición | 15° |
| Señal de disparo (Trig) | Pulso TTL de 10 µs |
| Señal de salida (Echo) | Pulso TTL de duración proporcional a la distancia |
| Tiempo recomendado entre mediciones | Más de 60 ms |
| Dimensiones | 45 × 20 × 15 mm |
En la práctica, con objetos reales, espera una precisión de más o menos 1 cm.
Pines del HC-SR04 y conexión con Arduino Uno
| Pin del HC-SR04 | Función | Se conecta en el Arduino Uno a |
|---|---|---|
| VCC | Alimentación de 5 V | 5V |
| Trig | Entrada de disparo | Pin digital 9 |
| Echo | Salida del pulso de eco | Pin digital 10 |
| GND | Tierra | GND |

Paso a paso para conectarlo
- Desconecta el Arduino del USB antes de cablear.
- Inserta el HC-SR04 en la protoboard con los transductores mirando hacia afuera, sin nada delante. Si nunca has usado una, revisa primero cómo usar una protoboard paso a paso.
- Conecta un cable rojo de VCC al pin 5V del Arduino.
- Conecta un cable negro de GND a cualquier pin GND del Arduino.
- Conecta Trig al pin 9 y Echo al pin 10.
- Revisa dos veces que VCC y GND no estén invertidos y conecta el USB.
Código para el sensor ultrasónico con Arduino (sin librerías)
Copia este sketch en el IDE de Arduino, elige la placa Arduino Uno y el puerto correcto, y súbelo:
// Sensor ultrasónico HC-SR04 con Arduino Uno
// Trig -> pin 9 | Echo -> pin 10 | VCC -> 5V | GND -> GND
const int PIN_TRIG = 9;
const int PIN_ECHO = 10;
void setup() {
Serial.begin(9600);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
digitalWrite(PIN_TRIG, LOW);
}
void loop() {
// 1. Pulso de disparo de 10 us
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
// 2. Medir cuánto tiempo queda Echo en HIGH (máximo 30 ms)
unsigned long tiempo = pulseIn(PIN_ECHO, HIGH, 30000UL);
// 3. Calcular y mostrar la distancia
if (tiempo == 0) {
Serial.println("Sin eco: fuera de rango");
} else {
float distancia = tiempo * 0.0343 / 2.0; // en cm
Serial.print("Tiempo: ");
Serial.print(tiempo);
Serial.print(" us -> Distancia: ");
Serial.print(distancia, 1);
Serial.println(" cm");
}
delay(100); // más de 60 ms entre mediciones
}
Qué hace cada parte del código
- Pulso de disparo: Trig en LOW 2 µs y luego en HIGH 10 µs.
- pulseIn(): espera a que Echo suba y mide en microsegundos cuánto dura en HIGH. El tercer parámetro (30000) es un límite de 30 ms: si no llega eco, devuelve 0 y el programa no se bloquea.
- delay(100): deja más de 60 ms entre mediciones, como recomienda el fabricante.
Ver las lecturas en el monitor serie

Abre Herramientas > Monitor serie y elige 9600 baudios. Acerca y aleja la mano o un cuaderno frente al sensor: verás cómo cambian el tiempo y la distancia. Compruébalo con una regla a 10, 20 y 30 cm.
¿Y la librería NewPing? Es una librería popular que simplifica el código (por ejemplo, con sonar.ping_cm()). Es opcional: este código funciona sin instalar nada.
Ejemplo 2: alarma de proximidad con LED y buzzer
Ahora haremos un sensor de parqueo: si algo se acerca a menos de 20 cm, se enciende un LED y suena un buzzer que pita más rápido cuanto más cerca esté el objeto.
Materiales y conexión adicional
- El mismo HC-SR04 conectado como antes (Trig al 9 y Echo al 10).
- Un LED rojo: el ánodo (pata larga) al pin 7 a través de una resistencia de 220 Ω, y el cátodo a GND. Si quieres saber por qué esa resistencia, mira los ejercicios resueltos de la ley de Ohm.
- Un buzzer activo de 5 V (o un módulo de buzzer): positivo al pin 8 y negativo a GND. Si es un buzzer grande, conéctalo a través de un transistor.
Si es tu primer LED con Arduino, te sirve la guía de cómo encender un LED con Arduino Uno.
// Alarma de proximidad con HC-SR04, LED y buzzer activo
const int PIN_TRIG = 9;
const int PIN_ECHO = 10;
const int PIN_LED = 7;
const int PIN_BUZZER = 8;
const float DISTANCIA_ALARMA = 20.0; // en cm
float medirDistancia() {
digitalWrite(PIN_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
unsigned long tiempo = pulseIn(PIN_ECHO, HIGH, 30000UL);
if (tiempo == 0) return -1; // no hubo eco
return tiempo * 0.0343 / 2.0;
}
void setup() {
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_BUZZER, OUTPUT);
}
void loop() {
float d = medirDistancia();
if (d > 0 && d < DISTANCIA_ALARMA) {
digitalWrite(PIN_LED, HIGH);
digitalWrite(PIN_BUZZER, HIGH);
delay(50);
digitalWrite(PIN_BUZZER, LOW);
delay((unsigned long)(d * 10)); // más cerca = pitidos más rápidos
} else {
digitalWrite(PIN_LED, LOW);
digitalWrite(PIN_BUZZER, LOW);
delay(100);
}
}
La función medirDistancia() agrupa el disparo y el cálculo para que el loop() quede corto. Cambia DISTANCIA_ALARMA según tu proyecto.
Errores comunes y cómo solucionarlos
| Síntoma | Causa probable | Solución |
|---|---|---|
| Siempre dice "Sin eco" o 0 cm | Trig y Echo invertidos, o pines distintos a los del código | Revisa que Trig vaya al 9 y Echo al 10, o cambia las constantes |
| No mide nada en un ESP32 o una placa de 3,3 V | El HC-SR04 clásico necesita 5 V | Aliméntalo con 5 V y baja la señal de Echo con un divisor de voltaje (por ejemplo 1 kΩ y 2 kΩ), o usa la versión HC-SR04P |
| Valores que saltan mucho | Mediciones muy seguidas, cables flojos u objeto inclinado | Deja 60 ms o más entre lecturas y promedia varias mediciones |
| Mide la mesa o el piso en vez del objeto | El sensor "ve" un cono de unos 15° | Súbelo un poco y apúntalo derecho al frente |
| No detecta ropa, espuma o un lápiz | Superficies blandas o muy delgadas devuelven poco eco | Prueba con objetos planos y duros; la hoja de datos recomienda un área de al menos 0,5 m² |
| Lecturas erradas a menos de 2 cm | Zona ciega del sensor | Mantén el objeto a más de 2 cm |
Preguntas frecuentes
¿Cuál es la distancia máxima del sensor ultrasónico HC-SR04?
Según la hoja de datos, 400 cm (4 m), y la mínima es de 2 cm. Más allá de 2 o 3 metros el eco se vuelve débil.
¿Se puede usar con Arduino Nano?
Sí. El Arduino Nano trabaja a 5 V igual que el Uno, así que la conexión es la misma (VCC a 5V, GND a GND, Trig y Echo a dos pines digitales) y el código funciona sin cambios.
¿Puedo simularlo en Tinkercad antes de armarlo?
Sí. Tinkercad Circuits incluye un sensor de distancia ultrasónico y un Arduino Uno virtual. Pega este código, inicia la simulación y mueve el objeto con el mouse.
¿Por qué se divide entre 2 en la fórmula?
Porque el pulso de Echo mide el viaje completo del sonido: de ida hasta el objeto y de vuelta al sensor. La distancia al objeto es solo la mitad de ese recorrido.
¿Afecta la temperatura a la medida?
Un poco. La velocidad del sonido aumenta con la temperatura (aproximadamente 331 + 0,6 × T m/s, con T en °C). Entre 20 °C y 30 °C cambia cerca de un 2 %, poco para un robot.
¿Puedo conectar varios HC-SR04 al mismo Arduino?
Sí, cada uno con su propio par de pines Trig y Echo. Hazlos medir por turnos, con unos 60 ms entre uno y otro, para que no se escuchen entre sí.
Conclusión
El sensor ultrasónico HC-SR04 es una excelente puerta de entrada a los sensores con Arduino: solo cuatro cables, una fórmula sencilla y resultados que se ven al instante en el monitor serie. Monta primero el ejemplo básico, luego la alarma, y después combínalo con motores para un robot que esquive obstáculos. ¡Manos a la obra!
Comentarios