#include <Arduino.h>
const int INTERRUPT_PIN_1 = 17;
const int INTERRUPT_PIN_2 = 16;
const int OUTPUT_PIN_1 = 25;
const int OUTPUT_PIN_2 = 26;

// 函数声明
void IRAM_ATTR handleInterrupt1();
void IRAM_ATTR handleInterrupt2();

void setup() {
  // 初始化输出引脚
  pinMode(OUTPUT_PIN_1, OUTPUT);
  pinMode(OUTPUT_PIN_2, OUTPUT);

  // 初始化为低电平
  digitalWrite(OUTPUT_PIN_1, LOW);
  digitalWrite(OUTPUT_PIN_2, LOW);

  // digitalWrite(INTERRUPT_PIN_1, HIGH);
  // digitalWrite(INTERRUPT_PIN_2, HIGH);
  // 设置中断引脚为输入模式，启用上拉电阻
  pinMode(INTERRUPT_PIN_1, INPUT_PULLUP);
  pinMode(INTERRUPT_PIN_2, INPUT_PULLUP);

  // 附加中断服务函数
  attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN_1), handleInterrupt1, FALLING);
  attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN_2), handleInterrupt2, FALLING);
  /*参数说明：
  第一个参数digitalPinToInterrupt(INTERRUPT_PIN_1)：将数字引脚号转换为中断号。
  第二个参数handleInterrupt1：是中断触发后要执行的函数名，此函数不能带有参数，并且返回类型必须为void。
  第三个参数RISING：用来确定中断的触发方式。
  触发模式类型：
  LOW：当引脚为低电平时，会持续触发中断。
  CHANGE：只要引脚电平发生变化，无论是高变低还是低变高，都会触发中断。
  RISING：引脚电平从低电平变为高电平时，触发中断。
  FALLING：引脚电平从高电平变为低电平时，触发中断。
  HIGH（仅适用于 Arduino SAMD 板）：当引脚为高电平时，会持续触发中断。*/
  Serial.begin(115200);
  Serial.println("系统初始化完成");
}

void loop() {
  // 主循环可以处理其他任务
  // 中断会独立于主循环执行
  delay(5000);
  Serial.println("loop");
}

// 中断服务函数1：当INTERRUPT_PIN_1检测到上升沿时触发
void IRAM_ATTR handleInterrupt1() {
  static unsigned long lastInterruptTime = 0;
  unsigned long currentTime = millis();

  // 消抖处理
  if (currentTime - lastInterruptTime > 50) {
    lastInterruptTime = currentTime;
    // 翻转输出状态
    digitalWrite(OUTPUT_PIN_1, !digitalRead(OUTPUT_PIN_1));
  }
   //中断服务程序（ISR）必须简短，避免调用耗时函数（如串口打印、网络通信），否则可能引发看门狗超时或系统重启

}

// 中断服务函数2：当INTERRUPT_PIN_2检测到上升沿时触发
void IRAM_ATTR handleInterrupt2() {
  static unsigned long lastInterruptTime = 0;
  unsigned long currentTime = millis();

  // 消抖处理
  if (currentTime - lastInterruptTime > 50) {
    lastInterruptTime = currentTime;
    digitalWrite(OUTPUT_PIN_2, !digitalRead(OUTPUT_PIN_2));
  }
   //中断服务程序（ISR）必须简短，避免调用耗时函数（如串口打印、网络通信），否则可能引发看门狗超时或系统重启
}