c++ - Arduino 按钮弹跳
问题描述
我的按钮有什么问题,它不能正常工作,我想知道为什么。我不明白。按钮通过 5V 连接,然后连接一个 10k 电阻并用电线接地。我认为 isr 已正确实施。而且功能也是正确的。但我真的不明白 Button 的问题是什么。我尝试了一个电容器,但效果不佳……我直接在按钮之前连接了它。
#include <LiquidCrystal.h>
LiquidCrystal lcd(5, 6, 9, 10, 11, 12);
unsigned long volatile startTime = 0;
unsigned long volatile endTime = 0;
unsigned long volatile sec;
volatile boolean buttonState;
const int button = 2;
long ms;
long timeT;
long z;
void setup() {
Serial.begin(9600);
// put your setup code here, to run once:
pinMode(button, INPUT_PULLUP);
lcd.setCursor(0, 0);
lcd.print("Stopwatch");
attachInterrupt(digitalPinToInterrupt(button), isr, FALLING);
}
void loop() {
if (buttonState == LOW) {
startTime = millis();
}
while (buttonState == HIGH) {
z = (millis() - startTime);
sec = (z / 1000);
ms = z % 1000;
lcd.setCursor(0, 1);
lcd.print(sec);
lcd.print(".");
lcd.print(ms);
lcd.setCursor(9, 1);
lcd.print("Secs");
}
}
//Interrupt Service Routines
void isr() {
buttonState = !buttonState;
}
解决方案
按钮是古怪的东西。他们可能会发送多个信号(相反,联系人不会立即稳定)。冷凝器可能会有所帮助,但这也可以输出波形信号并触发多个“事件”,无论如何,它会引入延迟。
所以,延迟延迟,你可以做这样的事情应该更可控:
if (buttonState !== previousState) {
startTime = millis();
previousState = buttonState;
triggered = 0;
} else {
if (0 == triggered) {
if ((millis() - startTime) > threshold) {
triggered = 1;
// Okay, buttonState is now reliably LOW or HIGH
...
}
} else {
// Continuous event (pressed or not-pressed)
}
}
在实践中,这应该只在按钮被不间断地按下或释放“阈值”毫秒时做出反应。假设 BTN 是按钮的实际信号,没有任何其他参与硬件,
1 2 3 4 5 6
BTN: LLLLLLLLLLLLLLHLHHLHHHLHHHHHHHHHHHHHHHHHHHHHHHHHHHLHHHLLHHLLLLLLLLL
FLT: ___________________________-----------------------------------_____
Time --------------------------------------------------------------->
1 button is physically pressed
2 button is now truly pressed
3 stable button press is detected
4 button begins to be released
5 button is now fully released
6 stable button release is detected
推荐阅读
- html - 同一行上的引导按钮/输入字段
- sql - 需要使用与各自唯一值条件匹配的唯一值更新许多列
- java - SNMP4J 客户端给出“不支持的安全级别”
- excel - 如何在数据透视表的 2 列中查找值之间的百分比变化?
- python - IndexError:使用 MapReduce 列出超出范围的索引
- python - 长度大于预期的 Python 列表
- django - 如何使用 Django REST 框架(API)修复将用户添加到组
- mysql - 我在编译语句时不断收到此错误 Hive 中的错误:FAILED: ParseException line 2:16 mismatched input 'NOT' expecting ) near 'STRING'
- android - 有没有办法预测和防止 OOM 异常?
- javascript - Dynamics 365 中电话号码格式的 Javascript