Obstacle avoiding car - Ultrasonic sensor only detects 1/4 of obstacles

Hello. have tried many variations of the code, but the problem remains. Can i please get some help please? This is a project i will have to present infront of a jury in 12 days, and i m having a major stepback.
Here's my circuit :

And here is the code i am using for it :

#include <Servo.h>

// Broches pour les drivers de moteur L293D (côté gauche et côté droit)
const int IN1_leftRear = 2;   // Driver gauche IN1 (moteur arrière gauche)
const int IN2_leftRear = 3;   // Driver gauche IN2 (moteur arrière gauche)
const int IN3_leftFront = 4;  // Driver gauche IN3 (moteur avant gauche)
const int IN4_leftFront = 5;  // Driver gauche IN4 (moteur avant gauche)

const int IN1_rightRear = 6;  // Driver droit IN3 (moteur arrière droit)
const int IN2_rightRear = 7;  // Driver droit IN4 (moteur arrière droit)
const int IN1_rightFront = 8; // Driver droit IN1 (moteur avant droit)
const int IN2_rightFront = 9; // Driver droit IN2 (moteur avant droit)

const int trigPin = 11;   // Broche TRIG du capteur ultrason HC-SR04
const int echoPin = 12;   // Broche ECHO du capteur ultrason HC-SR04
const int buzzerPin = 10; // Buzzer (signal)
const int servoPin = 13;  // Servomoteur (signal)

// Angles du servomoteur (inversé : 0° = droite, 90° = centre, 180° = gauche)
const int SERVO_LEFT   = 180;
const int SERVO_CENTER = 90;
const int SERVO_RIGHT  = 0;

// Seuils de distance (en centimètres)
const int THRESHOLD_STOP   = 25;  // arrêter et éviter si obstacle < 25 cm
const int THRESHOLD_BUZZER = 20;  // activer buzzer si obstacle < 20 cm

Servo servo;  // objet Servo pour le capteur ultrason

// Fonction pour mesurer la distance en cm avec le capteur ultrasonique
int measureDistance() {
    // Envoyer une impulsion ultrasonore
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    // Lire la durée de l'écho (pulseIn renvoie le temps en microsecondes)
    unsigned long duration = pulseIn(echoPin, HIGH, 30000UL);  // timeout après 30 ms (~5 m)
    if (duration == 0) {
        // Aucun écho reçu (obstacle hors de portée)
        return 300; // valeur élevée par défaut si pas d'obstacle détecté
    }
    // Calculer la distance en cm (≈58 µs aller-retour par cm)
    int distance = duration / 58;
    return distance;
}

// Fonctions de contrôle des moteurs
void stopMotors() {
    // Arrêter tous les moteurs (mettre toutes les entrées LOW)
    digitalWrite(IN1_leftRear, LOW);
    digitalWrite(IN2_leftRear, LOW);
    digitalWrite(IN3_leftFront, LOW);
    digitalWrite(IN4_leftFront, LOW);
    digitalWrite(IN1_rightRear, LOW);
    digitalWrite(IN2_rightRear, LOW);
    digitalWrite(IN1_rightFront, LOW);
    digitalWrite(IN2_rightFront, LOW);
}

void moveForward() {
    // Avancer : moteurs gauche en avant (IN1 HIGH, IN2 LOW) et moteurs droit en avant
    digitalWrite(IN1_leftRear, HIGH);
    digitalWrite(IN2_leftRear, LOW);
    digitalWrite(IN3_leftFront, HIGH);
    digitalWrite(IN4_leftFront, LOW);
    digitalWrite(IN1_rightRear, HIGH);
    digitalWrite(IN2_rightRear, LOW);
    digitalWrite(IN1_rightFront, HIGH);
    digitalWrite(IN2_rightFront, LOW);
}

void turnLeft() {
    // Tourner à gauche (pivot sur place) : gauche en arrière, droite en avant
    digitalWrite(IN1_leftRear, LOW);
    digitalWrite(IN2_leftRear, HIGH);
    digitalWrite(IN3_leftFront, LOW);
    digitalWrite(IN4_leftFront, HIGH);
    digitalWrite(IN1_rightRear, HIGH);
    digitalWrite(IN2_rightRear, LOW);
    digitalWrite(IN1_rightFront, HIGH);
    digitalWrite(IN2_rightFront, LOW);
    delay(500);       // pivoter pendant 0,5 s (ajuster si besoin)
    stopMotors();     // marquer un arrêt après le virage
}

void turnRight() {
    // Tourner à droite (pivot sur place) : gauche en avant, droite en arrière
    digitalWrite(IN1_leftRear, HIGH);
    digitalWrite(IN2_leftRear, LOW);
    digitalWrite(IN3_leftFront, HIGH);
    digitalWrite(IN4_leftFront, LOW);
    digitalWrite(IN1_rightRear, LOW);
    digitalWrite(IN2_rightRear, HIGH);
    digitalWrite(IN1_rightFront, LOW);
    digitalWrite(IN2_rightFront, HIGH);
    delay(500);       // pivoter pendant 0,5 s
    stopMotors();     // marquer un arrêt après le virage
}

void setup() {
    // Configurer les broches des moteurs en sortie
    pinMode(IN1_leftRear, OUTPUT);
    pinMode(IN2_leftRear, OUTPUT);
    pinMode(IN3_leftFront, OUTPUT);
    pinMode(IN4_leftFront, OUTPUT);
    pinMode(IN1_rightRear, OUTPUT);
    pinMode(IN2_rightRear, OUTPUT);
    pinMode(IN1_rightFront, OUTPUT);
    pinMode(IN2_rightFront, OUTPUT);
    stopMotors();  // s'assurer que les moteurs sont arrêtés au démarrage

    // Configurer les broches du capteur ultrason
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);

    // Configurer la broche du buzzer
    pinMode(buzzerPin, OUTPUT);
    digitalWrite(buzzerPin, LOW);

    // Initialiser le servomoteur (orientation centrale)
    servo.attach(servoPin);
    servo.write(SERVO_CENTER);
    delay(500);  // délai pour que le servo atteigne le centre
}

void loop() {
    // Mesurer la distance devant le robot
    int distance = measureDistance();

    if (distance < THRESHOLD_STOP) {
        // **Obstacle proche détecté (< 25 cm)**
        stopMotors();  // arrêt immédiat

        // Activer le buzzer si obstacle très proche (< 20 cm)
        if (distance < THRESHOLD_BUZZER) {
            digitalWrite(buzzerPin, HIGH);
        } else {
            digitalWrite(buzzerPin, LOW);
        }

        // Scanner à gauche puis à droite pour évaluer les distances
        int distanceLeft, distanceRight;
        servo.write(SERVO_LEFT);
        delay(200);  // attendre que le servo atteigne la position gauche
        distanceLeft = measureDistance();
        delay(50);
        servo.write(SERVO_RIGHT);
        delay(200);  // attendre que le servo atteigne la position droite
        distanceRight = measureDistance();
        delay(50);
        // Revenir au centre (face avant)
        servo.write(SERVO_CENTER);
        delay(100);

        // Choisir la direction la plus dégagée et tourner le véhicule
        if (distanceLeft > distanceRight) {
            turnLeft();
        } else {
            turnRight();
        }

        // Désactiver le buzzer après le virage (direction changée)
        digitalWrite(buzzerPin, LOW);
        // (La boucle loop continue, le robot avancera à nouveau si la voie est libre)
    } 
    else {
        // **Aucun obstacle proche** : avancer tout droit
        moveForward();
        digitalWrite(buzzerPin, LOW);  // s'assurer que le buzzer est éteint
    }

    delay(50);  // petite pause pour éviter des mesures trop fréquentes
}

Can i please get some help?

I am not a mind reader, nor do I have a crystal ball. Please describe the problem, in excruciating detail.

Please edit your post to add code tags, using the post editor <code> button.

Clearly describe the problem and explain what you have done to debug it. "only detects 1/4 of obstacles" does not convey useful information. What obstacles? What conditions?

Sorry i thought i was clear. In fact, whenever i let the vehicle move on its own, the ULTRASONIC Sensor (an HC SR 04) only detects the obstacle about 1/4 of all the times. (a wall, or my hand, or whatever). When it does detect, everything goes well, it reads the better direction to go to, then it switches. But the 3/4 or 2/3 remaining cases, it just goes right into the wall or the obstacle on its way.

That sounds like nonsense. Explain exactly what you do, and what happens.

Put in Serial.print() statements to see what distances the ultrasonic sensor is returning in both cases.

Your program is filled with delay() statements. Do you realize that delay(500) means do absolutely nothing for 500 milliseconds? That includes not sending ultrasonic signals to detect obstacles.

1 Like

I fixed the code issue.

Lemme try again to explain. In the code, the ultrasonic sensor is supposed to detect every obstacle, measure the distance and if it's 35 cm or less away, it looks at LEFT & RIGHT, then chooses the direction which is EMPTIER.

Now. When i do let the vehicle go, generally i let it go about 3 meters of the wall, It does not detect the obstacle that is the wall, and it hits it, nothing i wrote in the code is happening. (let's say, if i re-do the same experiment 4 times, the detection by ULTRASONIC SENSOR & change of direction only happens 1 time).

Sorry, that is not useful.

Once again, put in Serial.print() statements to see what distances the sensor returns.

In your next post, report the results printed for cases where the obstacle is detected, and those where it is not detected.

In applications like this, delay() is one of the least useful statements possible and you should avoid using it unless absolutely necessary.

So, what are the published specifications for your mystery sensor? What is the surface of the wall made of? Will it reflect ultrasonic sound? Is the wall 90 degrees to the sensor?

OP has already disclosed it is an HC SR04.

If we fix it do we get your degree?

Which one? Hint - there are several.

Another hint - when you change your code, as you say you did, post the new version, in code tags, so that others may advise about further issues, or problems with your purported fix.

The servo movement blocks everything - no measuring, no driving.
Removing the many delay() function...
At 26cm, all four motors drive forward.
At 25cm, left side motors drive forward and right side motors are in brake condition.
At 24cm, all motors are in brake condition, and servo sweep blocks motor movement.
At 20cm, buzzer sounds.

Most likely you also have a wiring mistake.

When you change your code we expect to see the new code posted in a new post. Or better still in the post where you claim to have fixed something.

Now you have some mystery code that may or may not be fixed, but we now have no idea what code you have.

Also as you don't want to show us a schematic (what you posted was a physical layout diagram not a schematic) How about you take some high resolution photographs of your actual circuit.

#include <Servo.h>

// Broches pour les drivers de moteur L293D (côté gauche et côté droit)
const int IN1_leftRear = 2;   // Driver gauche IN1 (moteur arrière gauche)
const int IN2_leftRear = 3;   // Driver gauche IN2 (moteur arrière gauche)
const int IN3_leftFront = 4;  // Driver gauche IN3 (moteur avant gauche)
const int IN4_leftFront = 5;  // Driver gauche IN4 (moteur avant gauche)

const int IN1_rightRear = 6;  // Driver droit IN3 (moteur arrière droit)
const int IN2_rightRear = 7;  // Driver droit IN4 (moteur arrière droit)
const int IN1_rightFront = 8; // Driver droit IN1 (moteur avant droit)
const int IN2_rightFront = 9; // Driver droit IN2 (moteur avant droit)

const int trigPin = 11;   // Broche TRIG du capteur ultrason HC-SR04
const int echoPin = 12;   // Broche ECHO du capteur ultrason HC-SR04
const int buzzerPin = 10; // Buzzer (signal)
const int servoPin = 13;  // Servomoteur (signal)

// Angles du servomoteur (inversé : 0° = droite, 90° = centre, 180° = gauche)
const int SERVO_LEFT   = 180;
const int SERVO_CENTER = 90;
const int SERVO_RIGHT  = 0;

// Seuils de distance (en centimètres)
const int THRESHOLD_STOP   = 25;  // arrêter et éviter si obstacle < 25 cm
const int THRESHOLD_BUZZER = 20;  // activer buzzer si obstacle < 20 cm

Servo servo;  // objet Servo pour le capteur ultrason

// Fonction pour mesurer la distance en cm avec le capteur ultrasonique
int measureDistance() {
    // Envoyer une impulsion ultrasonore
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    // Lire la durée de l'écho (pulseIn renvoie le temps en microsecondes)
    unsigned long duration = pulseIn(echoPin, HIGH, 30000UL);  // timeout après 30 ms (~5 m)
    if (duration == 0) {
        // Aucun écho reçu (obstacle hors de portée)
        return 300; // valeur élevée par défaut si pas d'obstacle détecté
    }
    // Calculer la distance en cm (≈58 µs aller-retour par cm)
    int distance = duration / 58;
    return distance;
}

// Fonctions de contrôle des moteurs
void stopMotors() {
    // Arrêter tous les moteurs (mettre toutes les entrées LOW)
    digitalWrite(IN1_leftRear, LOW);
    digitalWrite(IN2_leftRear, LOW);
    digitalWrite(IN3_leftFront, LOW);
    digitalWrite(IN4_leftFront, LOW);
    digitalWrite(IN1_rightRear, LOW);
    digitalWrite(IN2_rightRear, LOW);
    digitalWrite(IN1_rightFront, LOW);
    digitalWrite(IN2_rightFront, LOW);
}

void moveForward() {
    // Avancer : moteurs gauche en avant (IN1 HIGH, IN2 LOW) et moteurs droit en avant
    digitalWrite(IN1_leftRear, HIGH);
    digitalWrite(IN2_leftRear, LOW);
    digitalWrite(IN3_leftFront, HIGH);
    digitalWrite(IN4_leftFront, LOW);
    digitalWrite(IN1_rightRear, HIGH);
    digitalWrite(IN2_rightRear, LOW);
    digitalWrite(IN1_rightFront, HIGH);
    digitalWrite(IN2_rightFront, LOW);
}

void turnLeft() {
    // Tourner à gauche (pivot sur place) : gauche en arrière, droite en avant
    digitalWrite(IN1_leftRear, LOW);
    digitalWrite(IN2_leftRear, HIGH);
    digitalWrite(IN3_leftFront, LOW);
    digitalWrite(IN4_leftFront, HIGH);
    digitalWrite(IN1_rightRear, HIGH);
    digitalWrite(IN2_rightRear, LOW);
    digitalWrite(IN1_rightFront, HIGH);
    digitalWrite(IN2_rightFront, LOW);
    delay(500);       // pivoter pendant 0,5 s (ajuster si besoin)
    stopMotors();     // marquer un arrêt après le virage
}

void turnRight() {
    // Tourner à droite (pivot sur place) : gauche en avant, droite en arrière
    digitalWrite(IN1_leftRear, HIGH);
    digitalWrite(IN2_leftRear, LOW);
    digitalWrite(IN3_leftFront, HIGH);
    digitalWrite(IN4_leftFront, LOW);
    digitalWrite(IN1_rightRear, LOW);
    digitalWrite(IN2_rightRear, HIGH);
    digitalWrite(IN1_rightFront, LOW);
    digitalWrite(IN2_rightFront, HIGH);
    delay(500);       // pivoter pendant 0,5 s
    stopMotors();     // marquer un arrêt après le virage
}

void setup() {
    // Configurer les broches des moteurs en sortie
    pinMode(IN1_leftRear, OUTPUT);
    pinMode(IN2_leftRear, OUTPUT);
    pinMode(IN3_leftFront, OUTPUT);
    pinMode(IN4_leftFront, OUTPUT);
    pinMode(IN1_rightRear, OUTPUT);
    pinMode(IN2_rightRear, OUTPUT);
    pinMode(IN1_rightFront, OUTPUT);
    pinMode(IN2_rightFront, OUTPUT);
    stopMotors();  // s'assurer que les moteurs sont arrêtés au démarrage

    // Configurer les broches du capteur ultrason
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);

    // Configurer la broche du buzzer
    pinMode(buzzerPin, OUTPUT);
    digitalWrite(buzzerPin, LOW);

    // Initialiser le servomoteur (orientation centrale)
    servo.attach(servoPin);
    servo.write(SERVO_CENTER);
    delay(100);  // délai pour que le servo atteigne le centre
}

void loop() {
    // Mesurer la distance devant le robot
    int distance = measureDistance();

    if (distance < THRESHOLD_STOP) {
        // **Obstacle proche détecté (< 25 cm)**
        stopMotors();  // arrêt immédiat

        // Activer le buzzer si obstacle très proche (< 20 cm)
        if (distance < THRESHOLD_BUZZER) {
            digitalWrite(buzzerPin, HIGH);
        } else {
            digitalWrite(buzzerPin, LOW);
        }

        // Scanner à gauche puis à droite pour évaluer les distances
        int distanceLeft, distanceRight;
        servo.write(SERVO_LEFT);
          // attendre que le servo atteigne la position gauche
        distanceLeft = measureDistance();
        
        servo.write(SERVO_RIGHT);
          // attendre que le servo atteigne la position droite
        distanceRight = measureDistance();
        
        // Revenir au centre (face avant)
        servo.write(SERVO_CENTER);
        

        // Choisir la direction la plus dégagée et tourner le véhicule
        if (distanceLeft > distanceRight) {
            turnLeft();
        } else {
            turnRight();
        }

        // Désactiver le buzzer après le virage (direction changée)
        digitalWrite(buzzerPin, LOW);
        // (La boucle loop continue, le robot avancera à nouveau si la voie est libre)
    } 
    else {
        // **Aucun obstacle proche** : avancer tout droit
        moveForward();
        digitalWrite(buzzerPin, LOW);  // s'assurer que le buzzer est éteint
    }

      // petite pause pour éviter des mesures trop fréquentes
}

I changed the code to this. I got ride of the delays in the main loop but it's not working right. Rarely avoids obstacles

Great, but you forgot to put in Serial.print() statements, to help figure out what is wrong. See posts #5 and #7.

It looks like this condition statement is missing the final close-brace, effectively saying, "If the distance is not less than THRESHOLD_STOP, to not do the rest of this. (left, right, servo)" which means you have an extra close brace after that.

#include <Servo.h>

// Broches pour les drivers de moteur L293D (côté gauche et côté droit)
const int IN1_leftRear = 2;   // Driver gauche IN1 (moteur arrière gauche)
const int IN2_leftRear = 3;   // Driver gauche IN2 (moteur arrière gauche)
const int IN3_leftFront = 4;  // Driver gauche IN3 (moteur avant gauche)
const int IN4_leftFront = 5;  // Driver gauche IN4 (moteur avant gauche)

const int IN1_rightRear = 6;  // Driver droit IN3 (moteur arrière droit)
const int IN2_rightRear = 7;  // Driver droit IN4 (moteur arrière droit)
const int IN1_rightFront = 8; // Driver droit IN1 (moteur avant droit)
const int IN2_rightFront = 9; // Driver droit IN2 (moteur avant droit)

const int trigPin = 11;   // Broche TRIG du capteur ultrason HC-SR04
const int echoPin = 12;   // Broche ECHO du capteur ultrason HC-SR04
const int buzzerPin = 10; // Buzzer (signal)
const int servoPin = 13;  // Servomoteur (signal)

// Angles du servomoteur (inversé : 0° = droite, 90° = centre, 180° = gauche)
const int SERVO_LEFT   = 180;
const int SERVO_CENTER = 90;
const int SERVO_RIGHT  = 0;

// Seuils de distance (en centimètres)
const int THRESHOLD_STOP   = 25;  // arrêter et éviter si obstacle < 25 cm
const int THRESHOLD_BUZZER = 20;  // activer buzzer si obstacle < 20 cm

Servo servo;  // objet Servo pour le capteur ultrason

// Fonction pour mesurer la distance en cm avec le capteur ultrasonique
int measureDistance() {
    // Envoyer une impulsion ultrasonore
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    // Lire la durée de l'écho (pulseIn renvoie le temps en microsecondes)
    unsigned long duration = pulseIn(echoPin, HIGH, 30000UL);  // timeout après 30 ms (~5 m)
    if (duration == 0) {
        // Aucun écho reçu (obstacle hors de portée)
        return 300; // valeur élevée par défaut si pas d'obstacle détecté
    }
    // Calculer la distance en cm (≈58 µs aller-retour par cm)
    int distance = duration / 58;
    return distance;
}

// Fonctions de contrôle des moteurs
void stopMotors() {
    // Arrêter tous les moteurs (mettre toutes les entrées LOW)
    digitalWrite(IN1_leftRear, LOW);
    digitalWrite(IN2_leftRear, LOW);
    digitalWrite(IN3_leftFront, LOW);
    digitalWrite(IN4_leftFront, LOW);
    digitalWrite(IN1_rightRear, LOW);
    digitalWrite(IN2_rightRear, LOW);
    digitalWrite(IN1_rightFront, LOW);
    digitalWrite(IN2_rightFront, LOW);
}

void moveForward() {
    // Avancer : moteurs gauche en avant (IN1 HIGH, IN2 LOW) et moteurs droit en avant
    digitalWrite(IN1_leftRear, HIGH);
    digitalWrite(IN2_leftRear, LOW);
    digitalWrite(IN3_leftFront, HIGH);
    digitalWrite(IN4_leftFront, LOW);
    digitalWrite(IN1_rightRear, HIGH);
    digitalWrite(IN2_rightRear, LOW);
    digitalWrite(IN1_rightFront, HIGH);
    digitalWrite(IN2_rightFront, LOW);
}

void turnLeft() {
    // Tourner à gauche (pivot sur place) : gauche en arrière, droite en avant
    digitalWrite(IN1_leftRear, LOW);
    digitalWrite(IN2_leftRear, HIGH);
    digitalWrite(IN3_leftFront, LOW);
    digitalWrite(IN4_leftFront, HIGH);
    digitalWrite(IN1_rightRear, HIGH);
    digitalWrite(IN2_rightRear, LOW);
    digitalWrite(IN1_rightFront, HIGH);
    digitalWrite(IN2_rightFront, LOW);
    delay(500);       // pivoter pendant 0,5 s (ajuster si besoin)
    stopMotors();     // marquer un arrêt après le virage
}

void turnRight() {
    // Tourner à droite (pivot sur place) : gauche en avant, droite en arrière
    digitalWrite(IN1_leftRear, HIGH);
    digitalWrite(IN2_leftRear, LOW);
    digitalWrite(IN3_leftFront, HIGH);
    digitalWrite(IN4_leftFront, LOW);
    digitalWrite(IN1_rightRear, LOW);
    digitalWrite(IN2_rightRear, HIGH);
    digitalWrite(IN1_rightFront, LOW);
    digitalWrite(IN2_rightFront, HIGH);
    delay(500);       // pivoter pendant 0,5 s
    stopMotors();     // marquer un arrêt après le virage
}

void setup() {
  Serial.begin(9600);
    // Configurer les broches des moteurs en sortie
    pinMode(IN1_leftRear, OUTPUT);
    pinMode(IN2_leftRear, OUTPUT);
    pinMode(IN3_leftFront, OUTPUT);
    pinMode(IN4_leftFront, OUTPUT);
    pinMode(IN1_rightRear, OUTPUT);
    pinMode(IN2_rightRear, OUTPUT);
    pinMode(IN1_rightFront, OUTPUT);
    pinMode(IN2_rightFront, OUTPUT);
    stopMotors();  // s'assurer que les moteurs sont arrêtés au démarrage

    // Configurer les broches du capteur ultrason
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);

    // Configurer la broche du buzzer
    pinMode(buzzerPin, OUTPUT);
    digitalWrite(buzzerPin, LOW);

    // Initialiser le servomoteur (orientation centrale)
    servo.attach(servoPin);
    servo.write(SERVO_CENTER);
    delay(300);  // délai pour que le servo atteigne le centre
}

void loop() {
    // Mesurer la distance devant le robot
    int distance = measureDistance();
Serial.println(distance);
    if (distance < THRESHOLD_STOP) {
        // **Obstacle proche détecté (< 25 cm)**
        stopMotors();  // arrêt immédiat

        // Activer le buzzer si obstacle très proche (< 20 cm)
        if (distance < THRESHOLD_BUZZER) {
            digitalWrite(buzzerPin, HIGH);
        } else {
            digitalWrite(buzzerPin, LOW);
        }

        // Scanner à gauche puis à droite pour évaluer les distances
        int distanceLeft, distanceRight;
        servo.write(SERVO_LEFT);
        delay(30);  // attendre que le servo atteigne la position gauche
        distanceLeft = measureDistance();
        delay(30);
        servo.write(SERVO_RIGHT);
        delay(20);  // attendre que le servo atteigne la position droite
        distanceRight = measureDistance();
        
        // Revenir au centre (face avant)
        servo.write(SERVO_CENTER);
        delay(30);

        // Choisir la direction la plus dégagée et tourner le véhicule
        if (distanceLeft > distanceRight) {
            turnLeft();
        } else {
            turnRight();
        }

        // Désactiver le buzzer après le virage (direction changée)
        digitalWrite(buzzerPin, LOW);
        // (La boucle loop continue, le robot avancera à nouveau si la voie est libre)
    } 
    else {
        // **Aucun obstacle proche** : avancer tout droit
        moveForward();
        digitalWrite(buzzerPin, LOW);  // s'assurer que le buzzer est éteint
    }

      // petite pause pour éviter des mesures trop fréquentes
}

Here it is. Whether i put very small delays (like in this one) or i delete them all together, the monitor goes something like : 300.. (repeating itself for hundreds of times, as in no detection) whether i put my hand, or a wall or a door to its face. But rarely, it reads some obstacles like 15, 19.. and it shows in the monitor. 19/17 instead of 300.

Try again after using Ctrl+T to autoformat your code.

Okay but what am i supposed to change it to?

Most likely, the problem is loose, intermittent wiring, bad solder joints and/or the sensor is partially defective. Solderless breadboards are unreliable.

Rewire the setup and use your multimeter to check wiring continuity.

Post a closeup, focused picture of your setup.