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
}