#include <NewPing.h>
// Ultrasonic sensor pins
#define TRIGGER_PIN 9
#define ECHO_PIN 10
#define MAX_DISTANCE 400
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
// Motor A connections
int enA = 8;
int in1 = 7;
int in2 = 6;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
// Piezo speaker pin
#define BUZZER_PIN 2
// Distance thresholds (in cm)
const float slowDistance = 7 * 2.54; // 7 inches β ~17.78 cm
const float stopDistance = 2 * 2.54; // 2 inches β ~5.08 cm
unsigned long previousBeepMillis = 0;
bool buzzerState = false;
void setup() {
Serial.begin(9600);
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
stopMotors();
}
void loop() {
unsigned int distance = sonar.ping_cm();
// Display on Serial Monitor
Serial.print("Distance = ");
Serial.print(distance);
Serial.println(" cm");
unsigned long currentMillis = millis();
if (distance == 0 || distance > slowDistance) {
// Full speed, no beep
moveMotors(255);
digitalWrite(BUZZER_PIN, LOW);
}
else if (distance <= slowDistance && distance > stopDistance) {
// Slow inching with intermittent beep
int motorSpeed = map(distance, stopDistance, slowDistance, 80, 150);
moveMotors(motorSpeed);
// Intermittent beep frequency scales with distance
int beepFreq = map(distance, stopDistance, slowDistance, 2000, 800);
if (currentMillis - previousBeepMillis >= 200) { // 200ms interval
previousBeepMillis = currentMillis;
buzzerState = !buzzerState;
if (buzzerState) manualBeep(beepFreq, 100); // 100ms beep
else digitalWrite(BUZZER_PIN, LOW);
}
}
else if (distance <= stopDistance) {
// Stop motors and hold long beep 2 seconds
stopMotors();
manualBeep(1500, 2000); // 2-second beep
digitalWrite(BUZZER_PIN, LOW);
}
delay(50); // Small loop delay
}
// Move motors forward at given speed
void moveMotors(int speed) {
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(enA, speed);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(enB, speed);
}
// Stop motors
void stopMotors() {
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
analogWrite(enA, 0);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
analogWrite(enB, 0);
}
// Generate a square wave on the piezo
void manualBeep(int frequency, int duration_ms) {
long delayValue = 1000000L / frequency / 2; // half-period in microseconds
long cycles = (long)frequency * duration_ms / 1000;
for (long i = 0; i < cycles; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delayMicroseconds(delayValue);
digitalWrite(BUZZER_PIN, LOW);
delayMicroseconds(delayValue);
}
}
Comments