我正在学习arduino,在坐开源硬件的任务,设计了一款垃圾桶,有红外识别和容量检测功能,逻辑是在红外检测到有人经过时舵机启动打开垃圾桶,然后当无人后等待五秒然后舵机复位。然后超声波模块在垃圾桶顶部,一直检测下面垃圾到顶部的距离,然后转化为四个小灯亮的数量。同时设置一个开关,当按下开关时直接打开垃圾桶,同时停止红外工作,当再次按下开关时关闭垃圾桶并继续红外工作,自己实在是学不会代码,就让ai做了下代码,但是代码不好使,想找人帮我看一下代码
#include <Servo.h>
// 定义引脚
const int irSensorPin = 2;
const int ultrasonicTriggerPin = 3;
const int ultrasonicEchoPin = 4;
const int servoPin = 5;
const int buttonPin = 8;
const int ledPins[] = {9, 10, 11, 12};
// 定义常量
const int numLEDs = 4;
const int maxDistance = 15;
const int minDistance = 5;
const int debounceDelay = 50; // 按钮去抖延迟
Servo myservo;
int buttonState = 0;
int lastButtonState = 0;
unsigned long lastDebounceTime = 0;
bool irSensorEnabled = true;
void setup() {
pinMode(irSensorPin, INPUT);
pinMode(ultrasonicTriggerPin, OUTPUT);
pinMode(ultrasonicEchoPin, INPUT);
pinMode(buttonPin, INPUT_PULLUP);
myservo.attach(servoPin);
myservo.write(0);
for (int i = 0; i < numLEDs; i++) {
pinMode(ledPins[i], OUTPUT);
}
}
void loop() {
int irSensorValue = digitalRead(irSensorPin);
int reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == LOW) {
irSensorEnabled = !irSensorEnabled;
myservo.write(irSensorEnabled ? 0 : 90);
}
}
}
lastButtonState = reading;
if (irSensorEnabled) {
if (irSensorValue == HIGH) {
myservo.write(90);
delay(5000);
myservo.write(0);
}
}
int distance = getDistance();
int level = map(distance, minDistance, maxDistance, numLEDs, 0);
for (int i = 0; i < numLEDs; i++) {
if (i < level) {
digitalWrite(ledPins[i], HIGH);
} else {
digitalWrite(ledPins[i], LOW);
}
}
delay(100);
}
int getDistance() {
digitalWrite(ultrasonicTriggerPin, LOW);
delayMicroseconds(2);
digitalWrite(ultrasonicTriggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(ultrasonicTriggerPin, LOW);
long duration = pulseIn(ultrasonicEchoPin, HIGH);
int distance = duration * 0.034 / 2;
return distance;
}