gpt4 book ai didi

c++ - arduino中的多按钮按下管理

转载 作者:行者123 更新时间:2023-11-30 01:03:18 25 4
gpt4 key购买 nike

所以我的问题更多是关于寻找一个优雅的解决方案。我有几个连接到 arduino 的按钮,它们可以按预期单独工作。为简单起见,只看两个。我想要同时按下按钮 A、B 和 A + B 时执行不同的操作 (AB)。我可以检查在任何给定时刻按下了哪些按钮并执行操作,问题是,总是先按下一个按钮,以便立即调用方法,我没有真正确定性的行为。我所做的是延迟并检查在给定时间内是否也按下了另一个按钮:

void loop() {

delay(100);
A = digitalRead(ButtonA);
B = digitalRead(ButtonB);
if (A == 0) {
delay(150);
B = digitalRead(ButtonB);
if (B == 0) {
doAB();
}
else {
doA();
}
}

A = digitalRead(ButtonA);
B = digitalRead(ButtonB);
if (B == 0) {
delay(150);
A = digitalRead(ButtonA);
if (A == 0) {
doAB();
}
else {
doB();
}
}

问题是,这段代码依赖于按钮的按下行为。我确信我可以通过大量测试和检查何时按下什么来找到足够的解决方案。虽然有更多的按钮,但这似乎会产生大量的 if 嵌套,我想很多人在设计固件之前都遇到过这个问题。所以我的问题是是否以及如何以更清洁的方式完成此操作。

杂项:

如果有人按住按钮,我希望这个 Action 一遍又一遍地重复。

编码是用 C++ 完成的。

doA、B、AB Action 需要一些时间(1-2 秒)。

最佳答案

尝试将所有按钮状态组合到一个变量中,例如:

int allBtnStates;
unsigned long btnTimeStamp = 0;
void loop() {
A = digitalRead(ButtonA);
B = digitalRead(ButtonB);
allBtnStates = A + 2*B;
if(allBtnStates < 3){ //Any button pressed
if(btnTimeStamp == 0) btnTimeStamp = millis(); //Create timestamp
else if(millis() - btnTimeStamp > 150){
switch(allBtnStates){
case 2: doA(); break; //Only A pressed
case 1: doB(); break; //Only B pressed
case 0: doAB(); break; //Both A and B pressed
}
btnTimeStamp = 0; //Reset timestamp
}
}
//Monitor other input if needed
}

如果您有按钮 C,则将 allBtnStates = A + 2*B; 更改为 allBtnStates = A + 2*B + 4*C; 并计算出所有相应的条件。希望对您有所帮助!

关于c++ - arduino中的多按钮按下管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53900441/

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