ESP32中断配置函数:
attachInterrupt(digitalPinToInterrupt(pin), function, mode);
- pin 是中断引脚,ESP32 的每个 GPIO 引脚都可以配置为中断触发器,而作为中断引脚通常使用 digitalPinToInterrupt(pin) 将实际的 GPIO 设置为中断引脚。
- function 是每次触发中断时将调用的函数的名称
- mode:第三个参数是模式,有 5 种不同的模式:
- LOW:引脚低电平时触发
- HIGH:引脚高电平时触发
- CHANGE:引脚电平变化时触发
- RISING:引脚上升沿触发
- FALLING:引脚下降沿触发
中断实现 GPIO4 引脚变化时,点亮 LED 10s:
#include <Arduino.h>
#define timeSeconds 3 // 亮 LED 时间
const int LED = 2;
const int Sign = 4;
unsigned long now = millis(); // 当前时间
unsigned long lastTrigger = 0; // 上次时间
boolean startTimer = false; // 进入中断标志
boolean led_flag = false; // LED 开关标志位
void IRAM_ATTR detectsMovement()
{
digitalWrite(LED, HIGH);
startTimer = true;
lastTrigger = millis();
}
void setup()
{
Serial.begin(115200);
pinMode(Sign, INPUT_PULLDOWN);
attachInterrupt(digitalPinToInterrupt(Sign), detectsMovement, CHANGE); // 设置中断,指定CHANGE模式
pinMode(LED, OUTPUT);
digitalWrite(LED, LOW);
}
void loop()
{
now = millis();
if((digitalRead(LED) == HIGH) && (led_flag == false))
{
Serial.println("LED ON...");
led_flag = true;
}
// 10s 熄灭 LED
if(startTimer && (now - lastTrigger > (timeSeconds*1000)))
{
Serial.println("LED OFF...");
digitalWrite(LED, LOW);
startTimer = false;
led_flag = false;
}
}
* 中断里不要使用延时函数,函数不执行。