恕我直言,使用中断是矫枉过正。当您需要快速回复刺激时,会出现中断,而按下按钮则很慢。除非您的循环被阻塞,否则我非常不鼓励这样做。
补充:正如帕特里克在评论中指出的那样,实际上使用中断还有另一个原因:睡眠模式。事实上,如果你想进入睡眠模式并通过按钮唤醒,你必须使用中断来稍后唤醒。然而,通常你必须不断地做一些事情,而不仅仅是回复按钮输入。如果你不能进入睡眠模式,在我看来,使用中断来检测按钮仍然是矫枉过正的。
所以,如果你正确地设计你的循环不阻塞,这里有一小部分代码做我认为你应该实现的:
uint8_t buttonState;
unsigned long lastPressTime;
void setup()
{
...
buttonState = digitalRead(buttonPin);
lastPressTime = 0;
}
void loop()
{
uint8_t currRead = digitalRead(buttonPin);
if (buttonState != currRead)
{ // Button transition
buttonState = currRead;
if (buttonState == LOW)
{ // Button pressed, start tracking
lastPressTime = millis();
}
else
{ // Button released, check which function to launch
if (lastPressTime < 100)
{} // Discard (it is just a bounce)
else if (lastPressTime < 15000)
snooze();
else if (lastPressTime < 30000)
conf_Desk();
else
calibration();
}
}
...
}
由于您制作了三个非常遥远的间隔,我认为这部分更适合您的需求:
if ((lastPressTime > 100) && (lastPressTime < 7000))
snooze();
else if ((lastPressTime > 12000) && (lastPressTime < 20000))
conf_Desk();
else if ((lastPressTime > 26000) && (lastPressTime < 40000))
calibration();
所以你定义了有效范围,所以如果有人按下按钮 10 秒没有任何反应(这很有用,因为如果有人在前面的代码中按下按钮 14.9 秒,它将触发贪睡功能)。