#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// 初始化LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // 设置LCD地址为0x27,16列2行
// 初始化舵机
Servo myServo;
// 超声波传感器引脚定义
const int trigPin1 = 4; // 前方超声波传感器Trig引脚
const int echoPin1 = 7; // 前方超声波传感器Echo引脚
const int trigPin2 = 10; // 后方超声波传感器Trig引脚
const int echoPin2 = 11; // 后方超声波传感器Echo引脚
// 彩色LED引脚定义
const int redPin = 6;
const int greenPin = 5;
const int bluePin = 3;
// 蜂鸣器引脚定义
const int buzzerPin = 12;
// 车辆计数器
int carCount = 0;
// 舵机状态标志
bool isServoUp = false;
void setup() {
// 初始化LCD
lcd.init();
lcd.backlight();
// 初始化舵机
myServo.attach(9);
// 设置超声波传感器引脚模式
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
// 设置彩色LED引脚模式
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
// 设置蜂鸣器引脚模式
pinMode(buzzerPin, OUTPUT);
}
void loop() {
// 检测前方是否有车辆
int distance1 = getDistance(trigPin1, echoPin1);
if (distance1 < 20) { // 假设20cm内为车辆进入
if (!isServoUp) {
myServo.write(90); // 抬杆
carCount++;
isServoUp = true;
// 显示 "09210159 Open X"
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("09210159 Open ");
lcd.print(carCount);
}
} else {
if (isServoUp) {
myServo.write(0); // 落杆
isServoUp = false;
// 显示 "09210159 Close"
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("09210159 Close");
}
}
// 检测后方距离
int distance2 = getDistance(trigPin2, echoPin2);
lcd.setCursor(0, 1);
lcd.print("Rear: ");
lcd.print(distance2);
lcd.print(" cm");
// 根据距离控制 RGB 灯和蜂鸣器
if (distance2 > 0 && distance2 <= 50) { // 近距离
setRGB(255, 0, 0); // 红色
beep(100); // 快速蜂鸣
// if (distance2 < 20) { // 假设20cm内为车辆进入
// if (!isServoUp) {
// myServo.write(90); // 抬杆
// carCount++;
// isServoUp = true;
// // 显示 "09210159 Open X"
// lcd.clear();
// lcd.setCursor(0, 0);
// lcd.print("09210159 Open ");
// lcd.print(carCount);
// }
// } else {
// if (isServoUp) {
// myServo.write(0); // 落杆
// isServoUp = false;
// // 显示 "09210159 Close"
// lcd.clear();
// lcd.setCursor(0, 0);
// lcd.print("09210159 Close");
// }
// }
} else if (distance2 > 10 && distance2 <= 100) { // 中距离
setRGB(0, 0, 255); // 蓝色
beep(300); // 中等蜂鸣
} else if (distance2 > 30 && distance2 <= 150) { // 远距离
setRGB(0, 255, 0); // 绿色
beep(500); // 长蜂鸣
} else { // 超出范围
setRGB(255, 255, 255); // 白色
noTone(buzzerPin); // 不响
}
delay(100); // 防抖
}
// 获取超声波传感器距离
int getDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
int distance = duration * 0.034 / 2;
return distance;
}
// 控制蜂鸣器发声
void beep(int duration) {
tone(buzzerPin, 1000);
delay(duration);
noTone(buzzerPin);
}
// 设置彩色LED颜色
void setRGB(int red, int green, int blue) {
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}