#include <LiquidCrystal.h>
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);
int buzzerPin = 10;
int green = 11;
int yellow = 12;
int red = 13;
int trigPin = 2;
int echoPin = 3;
const int sampleCount = 5;
float distSamples[sampleCount];
float lastValidDistance = 0;
void setup() {
Serial.begin(9600);
lcd.begin(16,2);
lcd.print("Distance:");
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(green, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(red, OUTPUT);
pinMode(buzzerPin, OUTPUT);
}
float readSingleDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 10000);
if(duration == 0) return -1;
return duration / 58.0 ;
}
void loop() {
float sum = 0;
int validCount = 0;
for(int i = 0; i < sampleCount; i++) {
float d = readSingleDistance();
if(d > 2 && d < 400) {
distSamples[validCount++] = d;
sum += d;
}
delay(10);
}
float avgDistance;
if(validCount > 0) {
avgDistance = sum / validCount;
lastValidDistance = avgDistance;
} else {
avgDistance = lastValidDistance;
}
// LCD显示
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(avgDistance, 1);
lcd.print(" cm");
Serial.print("当前距离: ");
Serial.print(avgDistance, 1);
Serial.println(" cm");
if( avgDistance > 15 ) {
// 安全区:绿灯常亮
digitalWrite(green, HIGH);
digitalWrite(yellow, LOW);
digitalWrite(red, LOW);
noTone(buzzerPin);
}
else if (avgDistance > 10 && avgDistance < 15) {
// 预警区:黄灯常亮,蜂鸣2声
digitalWrite(green, LOW);
digitalWrite(yellow, HIGH);
digitalWrite(red, LOW);
for(int i = 0; i < 2; i++){
tone(buzzerPin, 1800);
delay(150);
noTone(buzzerPin);
delay(150);
}
}
else {
// 危险区:红灯闪烁 + 蜂鸣同步、频率随距离拉近变快
digitalWrite(green, LOW);
digitalWrite(yellow, LOW);
// 距离越近,间隔越小,闪烁、蜂鸣越快
int interval = map(avgDistance, 0, 30, 40, 200);
// 红灯亮 + 蜂鸣响
digitalWrite(red, HIGH);
tone(buzzerPin, 2000);
delay(interval);
// 红灯灭 + 蜂鸣停
digitalWrite(red, LOW);
noTone(buzzerPin);
delay(interval);
}
}