其实在loop循环函数里面读取对饮应引脚的值是可以实现和外部中断差不多的效果的,但是我们这里使用Ardunio ESP32 库里面的外部中断函数来完成我们的中断,但是大家尽量不要再中断函数里面执行太长时间的代码,否则的话就直接用循环读取的方法,我这里作为演示,因为我们代码很简单只有中断演示的部分,所以在里面加了一个消抖时间(因为我使用杜邦线把引脚拉高拉低所以一定会出现很大抖动),这个消抖时间如果太长在主函数需要cpu的时候就会托住整个执行。所以消抖是否要加,加多长时间自己根据自己用的什么决定,如果是很稳定的威廉希尔官方网站
板两个芯片之间的引脚交流或者传感器的引脚交流,那可以加很少的消抖时间甚至不加,而如果是按键这种,就加10ms左右,自己调一下,越小越好但还是要保证中断稳定,要是你也拿杜邦线做这个实验,最好20ms以上,人去用手连线,抖动非常大
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);
}
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);
}
portEXIT_CRITICAL_ISR(&mux_1);
}
void setup() {
Serial.begin(115200);
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);
}
void loop() {
}
其实在loop循环函数里面读取对饮应引脚的值是可以实现和外部中断差不多的效果的,但是我们这里使用Ardunio ESP32 库里面的外部中断函数来完成我们的中断,但是大家尽量不要再中断函数里面执行太长时间的代码,否则的话就直接用循环读取的方法,我这里作为演示,因为我们代码很简单只有中断演示的部分,所以在里面加了一个消抖时间(因为我使用杜邦线把引脚拉高拉低所以一定会出现很大抖动),这个消抖时间如果太长在主函数需要cpu的时候就会托住整个执行。所以消抖是否要加,加多长时间自己根据自己用的什么决定,如果是很稳定的威廉希尔官方网站
板两个芯片之间的引脚交流或者传感器的引脚交流,那可以加很少的消抖时间甚至不加,而如果是按键这种,就加10ms左右,自己调一下,越小越好但还是要保证中断稳定,要是你也拿杜邦线做这个实验,最好20ms以上,人去用手连线,抖动非常大
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);
}
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);
}
portEXIT_CRITICAL_ISR(&mux_1);
}
void setup() {
Serial.begin(115200);
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);
}
void loop() {
}
举报