我试图实现一个逻辑,以检测按键和保持从射频遥控器。目前,我能够检测到按钮按在我的控制器射频接收器。我收到了每一个媒体的中断回音。现在,我如何检测到一个按压并在代码中保持5秒?
我在示波器上检查,当我按下遥控器的钥匙时,我每隔34毫秒就会收到接收器中的射频数据。
我所能想到的就是在5秒内计算具有相同数据的顺序中断的数量,并对其进行验证,但我不确定这是正确的。
任何如何实施的建议。我会试试的。
谢谢
发布于 2022-09-17 08:38:05
一个好主意,任何按钮,直接,或在本例中的遥控器,是检测新闻和发布。然后施加压力,并在此基础上把握时间。这样就可以以相同的方式处理物理按钮和远程按钮。
在这种情况下,您可以通过设置一个50 is定时器来检测发布,该定时器在每个35 is按钮中断上重新启动。如果50 of计时器过期,则按钮已被释放(或超出范围)。
然后,对于5秒的等待,您可以有5秒计时器,可以启动按钮向下,并取消在按钮释放。类似地,如果该计时器过期,则触发hold事件。
定时器可以在软件或硬件中实现,尽管将两个硬件定时器专用于一个按钮可能是资源使用不当。
另见Pressing button for 3 seconds and how to measure its time with Atmega8 1MHz?。鉴于上述的新闻/发布检测,您可以应用较高级别的保持时间,如在接受的答案对该问题。
发布于 2022-09-15 13:18:53
首先,取决于你所使用的射频技术,你可能没有得到实时的响应。一些射频技术具有相对较长的延迟/传播延迟,许多技术根本无法保证实时性。您可能想要考虑到这一点,用一个范围测量发射机中物理按键之间的时间,直到在接收器中检测到该按键的时间为止。
此外,我们必须假设按钮被正确地弹出在发送器一侧,否则你将收到大量垃圾通过空气发送。
可能的方法1:
。
可能的方法2:
一些MCU计时器外围设备支持两边的输入捕获,因此您可以在此基础上实现不同的替代方法。。
可能的方法3:
发布于 2022-09-20 04:52:00
非常感谢大家的建议。我根据用户“busybee,Clifford和Lundin”的建议实现了这个逻辑,现在它已经开始工作了。请看一下。
void ISR_callback(uint32_t value) //Button press ISR
{
button_data = (uint8_t)((value>>8) & 0xF);
if(button_data == 0xB) //required button pressed
{
button_pressed = 1;
button_timer_50ms = 0; //reset the independent 50ms counter, if button pressed
}
}
void main(void)
{
while(1)
{
if (one_ms_time_expired()) //1ms timer loop
{
if(button_pressed) //is set in ISR, if button is pressed
{
timer_5sec++; //Counter to check if key is pressed for 5 sec
button_timer_50ms++; //Independent counter to reset status if button is released
if(button_timer_50ms==50) //if no key pressed for 50ms, reset all status
{
button_timer_50ms = 0;
button_pressed = 0;
timer_5sec = 0;
button_data = 0;
}
if(timer_5sec == 5000) //5sec done
{
timer_5sec = 0;
button_data = 0;
button_pressed = 0;
button_timer_50ms = 0;
//Buzzer_ON
}
}
}
}
}https://stackoverflow.com/questions/73730973
复制相似问题