Arduino ESP32使用外部中断

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino ESP32使用外部中断相关的知识,希望对你有一定的参考价值。

Arduino ESP32使用外部中断


  • ESP32支持库版本:3.0.1
  • esp32型号:esp32 Dev Module

实例程序

// toggles LED when interrupt pin changes state

int led = 2;//板载led灯

volatile int state = LOW;
const byte interruptPin_0 = 25;  //设置中断的目标对应的那个引脚
const byte interruptPin_1 = 23;  //设置中断的目标对应的那个引脚

volatile int interruptCounter = 0;  //0号中断发生中断的次数
volatile int interruptCounter_1 = 0;  //1号中断发生中断的次数

portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;  //声明一个portMUX_TYPE类型的变量,
portMUX_TYPE mux_1 = portMUX_INITIALIZER_UNLOCKED;//利用其对主代码和中断之间的同步进行处理

void handleInterrupt() {//中断服务函数
  portENTER_CRITICAL_ISR(&mux);//进入中断程序
  delay(20);  //延时20ms作为消抖,如果是很稳定的中断可以不加或者加很少的消抖时间
  if(digitalRead(interruptPin_0) == 0)    //因为是下拉触发,所以在消抖时间完后读取引脚高低电平,如果还是为低那么就代表出现了一次稳定的中断
  {
    interruptCounter++;
    Serial.println("0号中断对应的引脚发生中断!!!");
    Serial.print("0号中断发生次数:");Serial.println(interruptCounter);
     state=!state;//状态翻转
  } 
  portEXIT_CRITICAL_ISR(&mux);//处理完中断后,记得要退出中断。

}

void handleInterrupt_1() {//中断服务函数
  portENTER_CRITICAL_ISR(&mux_1);//进入中断程序
  delay(20);  //延时20ms作为消抖,如果是很稳定的中断可以不加或者加很少的消抖时间
  if(digitalRead(interruptPin_1) == 1)  //因为是上拉触发,所以在消抖时间完后读取引脚高低电平,如果还是为高那么就代表出现了一次稳定的中断
  {
    interruptCounter_1++;
    Serial.println("1号中断对应的引脚发生中断!!!");
    Serial.print("1号中断发生次数:");Serial.println(interruptCounter_1);
    state=!state;//状态翻转
  }
  portEXIT_CRITICAL_ISR(&mux_1);//处理完中断后,记得要退出中断。
}

void setup() {
  Serial.begin(115200);
  pinMode(led,OUTPUT);
  digitalWrite(led,state);
  Serial.println("中断测试实验"); 
  pinMode(interruptPin_0, INPUT_PULLUP);  //先把引脚设置为上拉输入模式
  pinMode(interruptPin_1, INPUT_PULLDOWN);  //这个我们设置为下拉
  //通过调用attachInterrupt函数将中断附加到引脚
  //handleInterrupt 是中断触发后的触发函数
  //FALLING 代表下拉触发,也就是由高电平向低电平转化时触发  RISING当然就是上拉触发
  attachInterrupt(digitalPinToInterrupt(interruptPin_0), handleInterrupt, FALLING);
  attachInterrupt(digitalPinToInterrupt(interruptPin_1), handleInterrupt_1, RISING);
}
/*****************
 * LOW: 当引脚为低电平时触发中断服务程序
CHANGE: 当引脚电平发生变化时触发中断服务程序
RISING: 当引脚电平由低电平变为高电平时触发中断服务程序
FALLING: 当引脚电平由高电平变为低电平时触发中断服务程序
 ******************/

void loop() {
}

以上是关于Arduino ESP32使用外部中断的主要内容,如果未能解决你的问题,请参考以下文章

Arduino ESP32:测试GPIO中断功能

Arduino ESP32:测试GPIO中断功能二

Arduino ESP32 深度睡眠与外部唤醒(EXT0)

MicroPython ESP32外部中断使用示例

Arduino ESP32 WIFI &蓝牙模式触控按键切换

IoTESP32 Arduino GPIO 使用简析