#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信号,降低功耗并避免舵机持续受力
}