在arduino中创建一个定时3状态按钮

use*_*320 3 arduino timed button esp8266 arduino-esp8266

由于arduino中esp8266的引脚不足,我需要一种方法来检测按钮在哪里;

  momentary press runs snooze() 
  15 sec press runs conf_Desk() 
  30 sec press runs calibration()
Run Code Online (Sandbox Code Playgroud)

preconfig;

  int buttonPin = D7;
  pinMode( buttonPin , INPUT_PULLUP);
Run Code Online (Sandbox Code Playgroud)

同时允许主循环运行.

如果我捕获一个中断,它会停止循环循环(),几毫秒的延迟是可以的,但是延迟的秒数太多了.

功能已经写好了我似乎无法提出如何跟踪并确认保持长度以根据正确的时间调用正确的功能而不停止其他必须保持循环的过程.

fra*_*i87 5

使用中断是,恕我直言,矫枉过正.当您需要快速回复刺激时按下中断,按下按钮的速度很慢.除非你的循环阻塞,否则我强烈反对.

附加:正如帕特里克在评论中指出的那样,实际上还有另一个使用中断的理由:睡眠模式.实际上,如果您想进入睡眠模式并使用按钮唤醒,则必须使用中断稍后唤醒.但是通常你必须连续做一些事情而不仅仅是回复按钮输入.如果你不能进入睡眠模式,在我看来,使用中断进行按钮检测仍然有点过头了.

所以,如果你正确设计你的循环不阻止,这里是我认为你应该实现的代码的一小部分:

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();
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

既然你做了三个非常遥远的时间间隔,我认为这部分更适合你的需要:

if ((lastPressTime > 100) && (lastPressTime < 7000))
    snooze();
else if ((lastPressTime > 12000) && (lastPressTime < 20000))
    conf_Desk();
else if ((lastPressTime > 26000) && (lastPressTime < 40000))
    calibration();
Run Code Online (Sandbox Code Playgroud)

所以你定义有效范围,所以如果有人按下按钮10秒没有任何反应(这很有用,因为如果有人在前面的代码中按下按钮14.9秒,它将触发贪睡功能).