button - 在arduino中创建一个定时三态按钮

标签 button arduino esp8266 timed arduino-esp8266

由于arduino中的esp8266上的引脚短缺,我需要一种方法来检测按钮的位置;

  momentary press runs snooze() 
  15 sec press runs conf_Desk() 
  30 sec press runs calibration()

预配置;

  int buttonPin = D7;
  pinMode( buttonPin , INPUT_PULLUP);

同时允许主循环运行。

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

这些函数已经写好了,我似乎无法想出如何跟踪和确认保持长度,以根据正确的时间调用正确的函数,而不停止必须保持循环的其他进程。

最佳答案

恕我直言,使用中断有点过分了。当您需要快速回复刺激而按下按钮的速度很慢时,就会产生中断。除非你的循环被阻塞,否则我强烈建议不要这么做。

补充:正如帕特里克在评论中指出的那样,实际上使用中断还有另一个原因: sleep 模式。事实上,如果你想进入休眠模式并通过按钮唤醒,你必须使用中断来稍后唤醒。然而,通常你必须连续做一些事情,而不仅仅是回复按钮输入。如果您无法进入休眠模式,那么在我看来,使用中断进行按钮检测仍然是过分的。

因此,如果您正确设计循环不被阻塞,这里是执行我认为您应该实现的代码的简短部分:

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 秒,它将触发贪睡功能)。

关于button - 在arduino中创建一个定时三态按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41515161/

相关文章:

linux - Intel Galileo - 启动时运行命令

jquery - 在按钮上单击重定向到 url,并从输入框中抓取查询字符串

Arduino - 用 for 循环编写 int 数组不起作用

c++ - Xively API : can´t upload two variables

ESP8266 发送和接收套接字

ESP8266 NONOS SDK : How to compile C++ code?

java - Java中的 "org.eclipse.paho.client.mqttv3-1.2.0"库是否可以一次获取多个MQTT消息?

reactjs - 链接中包含的自定义 HTML 按钮不起作用

ios - 在 ios 中使用 sdk 时自定义谷歌登录按钮

button - 如何从 Xamarin Forms XAML 中的按钮中删除边距?