c++ - 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 秒)。
解决方案
尝试将所有按钮状态合并为一个变量,例如:
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;
并相应地计算所有条件。希望有帮助!
推荐阅读
- python - 无法让 Heroku 检测 Flask 应用程序中的 json 文件
- python - 用于读取 excel 文档并验证扫描文书工作的信息是否在列表中的 Python 代码,然后将不同文件中的项目分开
- javascript - 使用 array.reduce 计算对象数组中的出现次数
- python - 在 python 中使用 OrderedDict 元素拆分 csv 文件
- elasticsearch - Kibana 显示您看到的数据可能不完整或错误
- spring-boot - Embedded Tomcat Hardening - 如何将 NONDETERMINISTICVALUE 设置为关闭命令值?
- javascript - 如何动态更改处于 React 状态的对象的值
- javascript - Vue beforeRouteEnter 等待子组件完成请求
- python - 如何使用 NetworkX 的 rescale_layout?
- firebase - 如何从 firebase 获取图像/文件列表?