我在 arduino Mega 2650 上连接了一个限位开关,用于运动控制。限位开关的两个常开触点连接到 Arduino 引脚和接地,这样当限位开关接合时,Arduino 引脚会短路到接地。
正如预期的那样,我在这个设置中遇到了弹跳问题。我使用 ISR 中的计数器确认了这一点。最后,我编写了以下代码,该代码似乎可以可靠地识别我的限位开关在任何给定时间点是接合还是分离。
const int lsOuterLeftIn = 18; // lsOuterLeftIn is my Limit Switch
const int LED = 9;
volatile bool lsEngaged = false; // flag for limit switch engaged
void setup() {
pinMode(lsOuterLeftIn, INPUT_PULLUP);
pinMode(LED, OUTPUT);
attachInterrupt(digitalPinToInterrupt(lsOuterLeftIn), ISR1, FALLING);
attachInterrupt(digitalPinToInterrupt(lsOuterLeftIn), ISR2, RISING);
}
void loop() {
if (lsEngaged) digitalWrite(LED, HIGH);
else digitalWrite(LED, LOW);
}
void ISR1(){
delay(100);
lsEngaged = (digitalRead(lsOuterLeftIn));
}
void ISR2(){
delay(100);
lsEngaged = (digitalRead(lsOuterLeftIn));
}
但是,这是我的问题。我来到了这个Arduino 文档页面,上面写着
“由于 delay() 需要中断才能工作,因此如果在 ISR 内调用它将无法工作。”
但是,我确实使用了delay()
内部 ISR,它似乎有效,这是怎么回事?我是否有一种情况,目前一切正常,但很容易中断,因为该delay()
功能可能会像文档所说的那样在我身上发生故障?