首页 > 解决方案 > arduino中的多个按钮按下管理

问题描述

所以我的问题更多是关于寻找一个优雅的解决方案。我有几个按钮连接到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 嵌套,我想很多人在设计固件之前都遇到过这个问题。所以我的问题是,是否以及如何以更清洁的方式完成。

杂项:

如果有人拿着按钮,我希望该动作一遍又一遍地重复。

编码是用 C++ 完成的。

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

标签: c++arduinomicrocontroller

解决方案


尝试将所有按钮状态合并为一个变量,例如:

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;并相应地计算所有条件。希望有帮助!


推荐阅读