// 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 podrá apreciar en el siguiente ejemplo que realiza la misma función que el código anterior pero de una manera más sencilla.

Para instalar esta librería en Arduino (como cualquier otra librería externa), selecciona el menú Programa > Incluir Librería > Gestionar Librerías y busca el nombre de la librería, en este caso NewPing.

Captura de pantalla 2019 07 03 a las 17.53.48 42b98

Selecciona el elemento que aparece con el nombre NewPing by Tim Eckel y haz clic en el botón Instalar y cierra la ventana. Ya podrás utilizar el siguiente código de ejemplo, en el que tendrás que abrir la ventana del Monitor Serie para ver las mediciones de distancia que haga el sensor. Recuerda que puedes abrir el monitor serie con el botón de la parte superior derecha del entorno de Arduino.

Captura de pantalla 2019 07 02 a las 13.58.44 419a9

#include <NewPing.h>
 
// 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; 

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"); 
  }
} 

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