Mejorar detección de obstáculos - HC-SR04

Hola! tengo una duda con el sensor ultrasonico, lo estoy queriendo implementar en un bastón para ciegos y tengo el inconveniente que con cualquier movimiento me da lecturas falsas por unos instantes (como si detectara algún objeto) lo que hace accionar mi mecanismo de aviso.
Buscando por Internet encontré que es un problema habitual del sensor, me decían que tenia que hacer varias tomas y luego hacer un promedio de las mismas para tratar de minimizar los errores y evitar las “lecturas fantasmas”.
hice cambios en mi código y me funciona medianamente bien. habría alguna forma de optimizar mi código para que haga las lecturas mas rápido? ya que se toma unos instantes en reaccionar debido a las tomas y al calculo eso hace que no detecte algunos obstáculos que pasen algo rapidos…

#define PIN_TRIG 6  //Cambiar según sea mas comodo
#define PIN_ECO  5  //Cambiar según sea mas comodo

long duracion, distancia;  // Variables

int toma1=0;
int toma2=0;
int toma3=0;
int toma4=0;
int toma5=0;

int distaciaMinima=80;  //Distacia minima en cm para accionar led

  void lectura(){
  
  /* Hacer el disparo */
  digitalWrite(PIN_TRIG, LOW);  
  delayMicroseconds(2); 
  digitalWrite(PIN_TRIG, HIGH);  // Flanco ascendente
  delayMicroseconds(10);        // Duracion del pulso
  digitalWrite(PIN_TRIG, LOW);  // Flanco descendente
  
  /* Recepcion del eco de respuesta */
  duracion = pulseIn(PIN_ECO, HIGH);
  
  /* Calculo de la distancia efectiva */
  distancia = (duracion/2) / 29;
  }
  
void setup() {
  // Inicializacion de la comunicacion serial
  Serial.begin (9600);  
  // Inicializacion de pines digitales
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECO, INPUT);
  pinMode(2, OUTPUT);

}

void loop() {
  
  lectura();
  toma1=distancia;
  // Retardo para disminuir la frecuencia de las lecturas
  delay(100); 
  lectura();
  toma2=distancia;
  // Retardo para disminuir la frecuencia de las lecturas
  delay(100);
  lectura();
  toma3=distancia;
  // Retardo para disminuir la frecuencia de las lecturas
  delay(100);
  lectura();
  toma4=distancia;
  // Retardo para disminuir la frecuencia de las lecturas
  delay(100);
  lectura();
  toma5=distancia;
  if(toma1<=distaciaMinima&&toma2<=distaciaMinima&&toma3<=distaciaMinima&&toma4<=distaciaMinima&&toma5<=distaciaMinima){
  digitalWrite(2,HIGH);
  delay(100);
toma1=0;
toma2=0;
toma3=0;
toma4=0;
toma5=0;
  }else digitalWrite(2,LOW);

  
   
}

quieres hacerlo mas rápido saca los delay(100) y has mas promedios si quieres.

surbyte: quieres hacerlo mas rápido saca los delay(100) y has mas promedios si quieres.

Al quitar los delay(s) no realizara malas lecturas con los ecos? y al hacer mas promedios no tardaría mas en calcular? gracias por responder

Lo acabo de probar lo coloque por un palo (simulando un bastón) funciona bien con obstáculos grandes pero con objetos pequeños ni los detecta... ya es el problema del sensor creo yo >:(

No tienes una rutina que llamas lectura() esa es la rutina que hace la medición, los demás delay() estan por tu gusto y si los retiras todo será mas rápido.
Los que estan dentro de la subrutina lectura dejalos asi.
estos puedes jugar con ellos a tu gusto
Que tal con 20 muestras o pon las que gustes.

#define PIN_TRIG           6  //Cambiar según sea mas comodo
#define PIN_ECO            5  //Cambiar según sea mas comodo
#define CANTIDAD_LECTURAS 20

long duracion;  // Variables

int suma = 0;
float distancia;
float distaciaMinima = 80.0;  //Distacia minima en cm para accionar led

long lectura(){
  
  long distancia;
  /* Hacer el disparo */
  digitalWrite(PIN_TRIG, LOW);  
  delayMicroseconds(2); 
  digitalWrite(PIN_TRIG, HIGH);  // Flanco ascendente
  delayMicroseconds(10);        // Duracion del pulso
  digitalWrite(PIN_TRIG, LOW);  // Flanco descendente

  /* Recepcion del eco de respuesta */
  duracion = pulseIn(PIN_ECO, HIGH);

  /* Calculo de la distancia efectiva */
  distancia = (duracion/2) / 29;
  return distancia;
}
  
void setup() {
  // Inicializacion de la comunicacion serial
  Serial.begin (9600);  
  // Inicializacion de pines digitales
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECO, INPUT);
  pinMode(2, OUTPUT);

}

void loop() {
  
  suma = 0;
  for (byte i=0; i<CANTIDAD_LECTURAS; i++) {
      suma += lectura();
  }
  distancia = suma/CANTIDAD_LECTURAS;

  if (distancia <= distaciaMinima){
      digitalWrite(2, HIGH);
  }
  else 
      digitalWrite(2, LOW);
}