Arduino使用RCSwitch库控制遥控车长按按钮重复触发问题咨询
问题根因
你当前逻辑的问题出在:遥控器长按期间会持续、重复发射相同的信号码,RCSwitch库每收到一次完整信号就会触发mySwitch.available()为真,每次你更新remoteValue后虽然处理完会清0,但下一轮循环只要还在长按,就又会收到相同的信号码赋值给remoteValue,导致running_flag反复切换,出现车辆反复启停的问题。
解决思路
通过按键冷却防抖+边沿触发检测实现单次按键只触发一次逻辑:
- 新增冷却时间变量,同一个按键信号250ms内仅处理一次,过滤长按期间的重复信号
- 仅在收到新的遥控信号时才执行动作判断,不需要每次循环都扫描
remoteValue - 保留原有「单次按执行动作、再次按同一按键停止」的逻辑不变
代码修改说明
首先在全局变量区域新增3个变量:
unsigned long lastRemoteCode = 0; // 存储上一次处理的遥控码 unsigned long lastProcessTime = 0; // 存储上一次处理按键的时间戳 const unsigned long KEY_COOLDOWN = 250; // 按键冷却时间250ms,可根据实际使用调整
然后修改loop()函数中遥控信号接收和处理的部分,修改后的完整loop代码如下:
void loop() { potValue = map(analogRead(pot), 0, 1023, 0, 255); analogWrite(Rspeed, potValue); analogWrite(Lspeed, (potValue*0.96)); // 仅当收到新的遥控信号时处理 if (mySwitch.available()) { remoteValue = mySwitch.getReceivedValue(); mySwitch.resetAvailable(); // 冷却时间判断:距离上次处理不足250ms且信号和上次相同,直接跳过 if (millis() - lastProcessTime < KEY_COOLDOWN && remoteValue == lastRemoteCode) { return; } // 处理按键逻辑,合并原有冗余判断 if (remoteValue == 5592323) { running_flag == 0 ? FOR() : STOPM(); running_flag = !running_flag; } else if (remoteValue == 5592332) { running_flag == 0 ? REV() : STOPM(); running_flag = !running_flag; } else if (remoteValue == 5592368) { running_flag == 0 ? LEFT() : STOPM(); running_flag = !running_flag; } else if (remoteValue == 5592512) { running_flag == 0 ? RIGHT() : STOPM(); running_flag = !running_flag; } // 更新处理记录 lastRemoteCode = remoteValue; lastProcessTime = millis(); remoteValue = 0; } /* if (US() > 9) { FOR(); } else if (US() < 9) { RIGHT(); } */ }
可选优化
如果需要支持不同按键直接切换动作(比如当前前进的时候按后退直接切后退,不需要先按前进停止),可以把running_flag修改为存储当前动作类型,对应调整判断逻辑即可。
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

