Capteur ultrason intérrompt autres fonctions

Bonjour, dans le cadre de mes études je réalise un projet qui consiste à modéliser un régulateur adaptatif de vitesse. Etant débutant je me confronte à pas mal d'erreurs. tout d'abord excusez mon manque de rigueur dans le code :cold_sweat: ...

Voila mon soucis, je souhaite calculer la distance séparant les deux véhicules (robots) pendant que mon robot roule, lorsqu'il y a un obstacle devant le capteur, le programme agit comme je le souhaite, cependant quand j'enlève l'obstacle devant, le calcul de la distance prend beaucoup de temps, ce qui interrompt les moteurs pendant une certaine durée (moins d'une seconde) mais empeche mon robot de continuer son mouvement.
Je voulais donc essayer de filtrer ces calculs de grandes distances puisque dans mon cas celles-ci ne m'intéressent pas, cependant ceci ne résout pas mon problème.
Si vous pouviez m'apportez des pistes de reflexions, parceque la je bloque :confused:

//Codeur: dfrobot SEN0038
long coder = 0;
int lastSpeed = 0;  
int front = 2;  // pin sur laquelle est le signal. Attention sur UNO, la fonction ATTACHINTERRUPT n'est possible que sur 2 & 3
unsigned long timer = 0;//c'est le temps écoulé en ms depuis lancement du programme
float N = 0;
float V = 0;

 //Arduino PWM Speed Control:
int E1 = 5;  
int M1 = 4; 

//récepteur IR
const int PIN_IR = 11;
IRrecv irRecv(PIN_IR);       
decode_results results;  

//capteur us
int trig = 5;
int echo = 3;
long lecture_echo;
long cm;

void setup() { 

  Serial.begin(9600);  //initialise la com série à 9600 bds

  pinMode(M1, OUTPUT);   //pin sortie moteur
  pinMode(E1, OUTPUT);   
 
  pinMode(front,INPUT);   //codeur_roue
  attachInterrupt(digitalPinToInterrupt(front), LwheelSpeed, CHANGE);    //initialise le "Interrupt mode" pour la pin 2. Mode "CHANGE": compte tous les fronts



  irRecv.enableIRIn();
  
  
  pinMode(trig, OUTPUT);    //US
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT);
} 


void loop() { 

    int value1 = 255; // valeur de 0 à 255, codé donc sur un octet (Byte)
      digitalWrite(M1,HIGH);      
      analogWrite(E1,value1);   //Le fait d'utiliser la cde analogwrite définie la sortie E1 (pin 5) en sortie PWM (variation)
   delay(100);
   codeur() ;
   distance();




 /* if (irRecv.decode(&results)){ //si un message est reçu
    int key = results.value; //touche pressée
    Serial.println(key, DEC);

    if (key == TEL_POWER) {
    } else if (key == TEL_5) { //touche d'arrêt de l'action en cours
      Serial.println("Touche 5 pressée");
      arreterMoteurs();  
}
}*/
}

//*****************Fonctions************

int distance() { //calcul distance entre les deux véhicules
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  lecture_echo = pulseIn(echo,HIGH);
  if (lecture_echo<8000){
    Serial.print(lecture_echo);
    cm = lecture_echo /58;
    Serial.print("Distance en cm :");
    Serial.println(cm);
  //delay(1500);
    return (cm);}
      else  { 
        Serial.println("distance trop importante");

}
}


/*
void RegulMot() { //\\ ajouter un PID
  int value1 = 255; // valeur de 0 à 255, codé donc sur un octet (Byte)
    digitalWrite(M1,HIGH);      
    analogWrite(E1, value1);   //Le fait d'utiliser la cde analogwrite définie la sortie E1 (pin 5) en sortie PWM (variation)
}


void arreterMoteurs() { //arrête les deux moteurs
  digitalWrite(E1, LOW);
}
*/
void codeur(){
                 
    //Serial.print("Coder value: ");
    //Serial.println(coder);
    Serial.print("Vitesse m/s: ");
    Serial.println(vit((coder)));

    lastSpeed = coder;   //enregistre la dernière valeur de CODER
    coder = 0;           //écrase la mémoire       
    //delay(100);
}
void LwheelSpeed(){
  coder ++;  //compte les interruptions donc les fronts du capteur roue
}
int vit(int coder){
  N=coder*600/11;
  V=N*20*0.032*M_PI/60;
  return V; 
}

Lu le code en diagonale. S'il n'y a pas de delay, le problème peut venir de pulseIn qui a un timeout. Vérifie sur la doc (Google pulseIn arduino)