我需要有关按钮去抖的帮助。有时它会向串行链接发送两次相同的字符串,但我不知道为什么。有人可以帮助我,问题出在哪里?
int reading;
int exbutton= LOW;
unsigned long ddelay= 200;
unsigned long last= 0;
void loop(){
reading= digitalRead(prkgbrake);
if (reading== HIGH && exbutton == LOW && millis() - last> ddelay){
if (brake == 0){
Serial.write("brake:1\n");
while( digitalRead(prkgbrake) == HIGH){
}
}
else{
Serial.write("brake:0\n");
while( digitalRead(prkgbrake) == HIGH){
}
}
last = millis();
}
提前谢谢。
答案 0 :(得分:0)
我希望你没有从某个地方复制这段代码,有些代码没有意义。
例如,什么是'prkgbrake'?什么是'刹车'?它们没有被宣布。你为什么没有'setup()'函数?
然而,可以通过多种方式实现去抖动。我将修复你的代码。这样你就会明白你做错了什么。
double (*)[n]
解释:
假设您的按钮与数字引脚2连接。当您使用带按钮的数字引脚时,最好使用pullup / pulldown。您可以使用外部电阻或内部电阻。内部电阻仅支持上拉。
要了解有关上拉/下拉结帐的详情,请Arduino page。最重要的是,当您使用引脚作为输入时,它就像一个天线,可以捕获来自周围环境的信号,称为浮动状态。因此最好将引脚保持在已知状态。如果使用内部上拉,引脚将始终为int exbutton = LOW;
unsigned int _delay = 200;
int pushButton = 2;
void setup()
{
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
pinMode(pushButton, INPUT_PULLUP);
}
void loop()
{
while (digitalRead(pushButton) == LOW && exbutton == LOW)
{
if((millis() - last) > _delay)
{
Serial.println("Button Pressed");
while(digitalRead(pushButton) == LOW);
}
}
last = millis();
}
。因此,按钮配置必须采用某种方式,以便在按下时,引脚应为HIGH
。
代码LOW
使数字引脚2作为输入使能上拉功能。
pinMode(pushButton, INPUT_PULLUP);
应该像这样工作:
1)检查按钮是否被按下(即,如果是loop()
)。
2)如果不更新LOW
变量。
3)如果是,则不要更新last
,并输入last
循环。
4)现在继续检查while
是否大于millis()-last
。如果不是,它将返回_delay
循环并检查按钮是否仍然按下。如果是,那么它将返回并检查while
是否超过millis()-last
。它将继续这样做,直到它超过上述的去抖延迟量。
5)如果在'_delay'时间之前按钮被按下(即转到_delay
),它将更新HIGH
并检查按钮是否被按下并开始计算延迟时间。
N.B。使用last
变量进行游戏。它将定义按钮的响应性。