// Pin de la tarjeta Arduino donde se haya conectado el pin Echo del sensor ultrasonidos 
int pinEcho = 6;   
// Pin de la tarjeta Arduino donde se haya conectado el pin Trig del sensor ultrasonidos 
int pinTrig = 4; 
 
void setup() { 
  // Activación del pin TRIG como salida, para enviar el pulso ultrasónico 
  pinMode(pinTrig, OUTPUT);  
  // Activación del pin ECHO como entrada, para recibir el pulso ultrasónico 
  pinMode(pinEcho, INPUT); 
 
  // Activación del monitor serie para mostrar mensajes posteriormente 
  Serial.begin(9600); 
} 
 
void loop() {  
  // Envío del pulso ultrasónico por el pin TRIG. Requiere establecer previamente 
  //  la señal LOW y luego enviar el pulso con el valor HIGH. Se establece una 
  //  pausa entre cada orden para dar tiempo a su ejecución 
  digitalWrite(pinTrig, LOW);  
  delayMicroseconds(10); 
  digitalWrite(pinTrig, HIGH);  
  delayMicroseconds(10); 
 
  // Obtener el tiempo que se tarda en recibir la señal HIGH que fue enviada 
  //  por el pin Trig, y que será recibido por el pin Echo.  
  // Se esperará a recibir la señal durante un tiempo máximo marcado por el  
  //  tercer parámetro (en microsegundos). 
  // En caso de no recibir la señal en el tiempo máximo establecido, se obtiene 0 
  long pulseDuration = pulseIn(pinEcho, HIGH, 10000); 
 
  // Una vez recibida la señal, se calculará la distancia en función de la velocidad 
  //  del sonido 340 m/s 
  int distance = (int)(0.034 * pulseDuration / 2); 
   
  if(distance > 0) { 
    // Mostrar el resultado por el monitor serie 
    Serial.print("Distancia "); 
    Serial.print(distance); 
    Serial.println(" cm"); 
  } else { 
    Serial.println("Distancia desconocida"); 
  } 
}

Problema de bloqueo en sensores "baratos"

Se ha detectado que algunos sensores HC-SR04, sobre todo en los modelos más económicos, se produce un bloqueo de manera que inicialmente se detectan bien las distancias cortas, pero al intentar calcular una distancia mayor en la que finalice el tiempo de espera (timeout) de la señal de retorno, el sensor deja de detectar las distancias cortas que se intenten obtener a partir de ese momento. La medición vuelve a hacerse correctamente tras producir un sonido cerca del sensor como un chasquido de los dedos o una palmada.

Para comprobar si tu sensor tiene este problema, se puede utilizar el código anterior, y si tras detectar una "Distancia desconocida" no se vuelven a mostrar las distancias cortas, el sensor tendrá este problema con mucha probabilidad.

Tras realizar varias pruebas por código siguiendo algunas indicaciones encontradas en foros, la única solución que me ha funcionado ha sido la que se documenta en el artículo "Repair faulty HC-SR04 ultrasonic sensor (solve erratic no-readings problems)" de Therandomlab.

La solución consiste en soldar una resitencia de 10K entre el pin TRIG y una de las conexiones de uno de los sensores, como se muestra en la siguiente imagen obtenida del artículo anterior.

hc sr04 repair detail

Programación usando la librería NewPing

La librería NewPing es una librería externa, no incluída inicialmente en el entorno de desarrollo de Arduino, que mejora el rendimiento y evita algunos problemas encontrados en algunos tipos de sensores de detección de distancias. Además, incluye algunas funciones que facilitan la obtención de las distancias como se puede apreciar en el siguiente ejemplo que realiza la misma función que el código anterior pero de una manera más sencilla:

#include <NewPing.h>
 
int pinEcho = 6;   
int pinTrig = 4; 
int max_distance = 200; // Distancia máxima a detectar en cm
 
NewPing sonar(pinTrig, pinEcho, max_distance);
 
void setup() {
  Serial.begin(9600);
}
 
void loop() {
  int distance = sonar.ping_cm();
  if(distance > 0) { 
    Serial.print("Distancia "); 
    Serial.print(distance); 
    Serial.println(" cm"); 
  } else { 
    Serial.println("Distancia desconocida"); 
  }
} 

Para poder usar esta librería, se debe descargar desde el enlace que se indica en la página de información de la librería y añadirla a la carpeta de librerías que utiliza el IDE de Arduino, lo que se puede hacer fácilmente desde el menú Programa > Incluir librería > Añadir librería .ZIP

Más información y ejemplos de programación