How can I stop my circuit from repeating when a new distance has been detected?

I have an Arduino project that uses a 7-segment display, an ultrasonic sensor, a LED, and a buzzer to display a countdown based on the measured distance. My problem is it keeps repeating when the distance changes, even though it's still greater than 100 cm. Please help! Here's my code:

unsigned const int A = 13;
unsigned const int B = 12;
unsigned const int C = 11;
unsigned const int D = 10;
unsigned const int E = 9;
unsigned const int F = 8;
unsigned const int G = 7;
unsigned const int H = 6;
unsigned const int DP = 3;
int buzzer = 4;
int trig = 6;
int echo = 5;
const int ledPin = 2;

void setup(void)
{
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  pinMode(C, OUTPUT);
  pinMode(D, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(F, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(H, OUTPUT);
  pinMode(DP,OUTPUT);
  Serial.begin(9600);
  pinMode(buzzer, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  none(); 
  digitalWrite(ledPin, LOW);
}


void none(void) {
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  digitalWrite(C, LOW);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(H, LOW);
  digitalWrite(DP, LOW);
}

void one(void) {
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(H, HIGH);
  digitalWrite(DP, HIGH);
}

void two(void) {
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, LOW);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(H, HIGH);
  digitalWrite(DP, HIGH);
}

void three(void) {
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, HIGH);
  digitalWrite(H, HIGH);
  digitalWrite(DP, HIGH);
}

void four(void) {
  digitalWrite(A, LOW);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(H, HIGH);
  digitalWrite(DP, HIGH);
}

void five(void) {
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(H, HIGH);
  digitalWrite(DP, HIGH);
}

void six(void) {
  digitalWrite(A, HIGH);
  digitalWrite(B, LOW);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(H, HIGH);
  digitalWrite(DP, HIGH);
}

void seven(void) {
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, LOW);
  digitalWrite(E, LOW);
  digitalWrite(F, LOW);
  digitalWrite(G, LOW);
  digitalWrite(H, HIGH);
  digitalWrite(DP, HIGH);
}

void eight(void) {
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(H, HIGH);
  digitalWrite(DP, HIGH);
}

void nine(void) {
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, LOW);
  digitalWrite(F, HIGH);
  digitalWrite(G, HIGH);
  digitalWrite(H, HIGH);
  digitalWrite(DP, HIGH);
}

void zero(void) {
  digitalWrite(A, HIGH);
  digitalWrite(B, HIGH);
  digitalWrite(C, HIGH);
  digitalWrite(D, HIGH);
  digitalWrite(E, HIGH);
  digitalWrite(F, HIGH);
  digitalWrite(G, LOW);
  digitalWrite(H, HIGH);
  digitalWrite(DP, HIGH);
}

void loop() {
  // Trigger the ultrasonic sensor
  digitalWrite(trig, LOW);
  delayMicroseconds(5);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);

  // Measure the pulse duration and calculate distance in cm
  int a = pulseIn(echo, HIGH);
  float d = a * 0.034 / 2; // Distance in cm
  float distanceInInches = d * 0.3937; // Convert cm to inches

  // Print distances to the Serial Monitor
  Serial.print("Distance: ");
  Serial.print(d, 2); // Print cm with 2 decimal places
  Serial.print(" cm, ");
  Serial.print(distanceInInches, 2); // Print inches with 2 decimal places
  Serial.println(" inches");

  if (d >= 100) { 
    digitalWrite(ledPin, HIGH); // Turn on LED
    // Countdown sequence
    for (int i = 9; i >= 0; i--) { // Use a for loop for the countdown
      switch (i) {
        case 9: nine(); break;
        case 8: eight(); break;
        case 7: seven(); break;
        case 6: six(); break;
        case 5: five(); break;
        case 4: four(); break;
        case 3: three(); break;
        case 2: two(); break;
        case 1: one(); break;
        case 0: zero();  break;
      }
      delay(1000); // 1-second delay for the countdown

      // Check distance during each delay
      digitalWrite(trig, LOW);
      delayMicroseconds(5);
      digitalWrite(trig, HIGH);
      delayMicroseconds(10);
      digitalWrite(trig, LOW);
      a = pulseIn(echo, HIGH);
      d = a * 0.034 / 2; // Update distance in cm
      distanceInInches = d * 0.3937; // Update distance in inches

      if (d < 100) { 
        none(); // Clear the 7-segment display
        digitalWrite(ledPin, LOW); // Turn off LED
        break; // Break out of the for loop
      }

      // Insert buzzer sound for each count
      digitalWrite(buzzer, HIGH);
      delay(500); // Short buzzer duration
      digitalWrite(buzzer, LOW);
    }

  } else {
    none(); // Clear the 7-segment display
    digitalWrite(ledPin, LOW); // Turn off LED
    
    
  }

  delay(200); // Short delay before next loop iteration
}

Welcome to the forum

You need to detect when the distance becomes greater than 100 rather than when it is greater than 100

See the StateChangeDetection example in the IDE

After a quick look thru, your code would seem to be detecting the state of being > 100 cm.

But what you seem to be saying is that you want it to do it detect the event of changing from <= 100 cm to > 100 cm.

They're two completely different things.

I don't see anywhere in your code where you do anything like:

  static float lastDistance = 0;
   .
   .
   .
   if( lastDistance <= 100 && distance > 100 ) {
      // so something
   } else if( lastDistance > 100 && distance <= 100 ) {
      // do something else
   }
   lastDistance = distance;

The above is purely off the top of my head after a single quick read thru. No warranty of fitness for purpose is expressed or implied. :slight_smile:

You have used pin 6 twice.

by "repeat" i assume you mean the count-down. But isn't the code written to do that count-down as long as the d, distance > 100?

or do you want it to only do it once when the distance > 100? If so, do you need to keep track of what the distance was previously and only do a count-down when d > 100 but was previously < 100?