gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:17:16 25 4
gpt4 key购买 nike

由于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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com