
#include <Servo.h> // 引入舵机控制库,用于驱动舵机
Servo myservo; // 创建舵机对象,命名为myservo
// 定义舵机的开盖角度和关盖角度(volatile修饰确保变量在中断或多任务中正确访问)
volatile int open_angle = 25; // 默认开盖角度为25度
volatile int close_angle = 120;// 默认关盖角度为120度
void setup() { // 初始化函数,程序上电后执行一次
// 关键:先不调用attach(),避免舵机初始化时发送默认90度信号导致自动回中
pinMode(12, OUTPUT); // 将舵机连接的引脚12设置为输出模式
digitalWrite(12, LOW); // 输出低电平,此时舵机无驱动信号,不会动作
delay(100); // 延迟100ms,确保引脚状态稳定
myservo.attach(12); // 绑定舵机到引脚12,完成舵机初始化
myservo.write(close_angle); // 立即发送关盖角度信号(120度),避免上电跳动
delay(150); // 延迟150ms,等待舵机转动到关盖位置
pinMode(A3, INPUT); // 将A3引脚设置为输入模式(用于检测外部红外触发信号)
}
void loop() { // 主循环函数,程序上电后重复执行
// 检测A3引脚输入状态(假设低电平为有效触发信号,如按钮按下)
if (digitalRead(A3) == 0) {
delay(150); // 延迟150ms,用于消抖(避免按钮或传感器误触发)
// 二次检测,确认触发信号稳定(防止干扰导致的误动作)
if (digitalRead(A3) == 0) {
delay(1350); // 延迟1350ms,用于等待手部放置物品动作并离开,防止舵机动作太快夹手
myservo.attach(12); // 重新绑定舵机到引脚12(若之前已解绑)
myservo.write(open_angle);// 发送开盖角度信号(25度),控制舵机打开
delay(300); // 延迟300ms,等待舵机转动到开盖位置
myservo.write(close_angle);// 发送关盖角度信号(120度),控制舵机关闭
delay(250); // 延迟250ms,等待舵机转动到关盖位置
}
}
myservo.detach(); // 解绑舵机,停止发送PWM信号,降低功耗并避免舵机持续受力
}