首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >微控制器中的按钮按压和保持检测

微控制器中的按钮按压和保持检测
EN

Stack Overflow用户
提问于 2022-09-15 12:15:34
回答 3查看 161关注 0票数 0

我试图实现一个逻辑,以检测按键和保持从射频遥控器。目前,我能够检测到按钮按在我的控制器射频接收器。我收到了每一个媒体的中断回音。现在,我如何检测到一个按压并在代码中保持5秒?

我在示波器上检查,当我按下遥控器的钥匙时,我每隔34毫秒就会收到接收器中的射频数据。

我所能想到的就是在5秒内计算具有相同数据的顺序中断的数量,并对其进行验证,但我不确定这是正确的。

任何如何实施的建议。我会试试的。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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?。鉴于上述的新闻/发布检测,您可以应用较高级别的保持时间,如在接受的答案对该问题。

票数 2
EN

Stack Overflow用户

发布于 2022-09-15 13:18:53

首先,取决于你所使用的射频技术,你可能没有得到实时的响应。一些射频技术具有相对较长的延迟/传播延迟,许多技术根本无法保证实时性。您可能想要考虑到这一点,用一个范围测量发射机中物理按键之间的时间,直到在接收器中检测到该按键的时间为止。

此外,我们必须假设按钮被正确地弹出在发送器一侧,否则你将收到大量垃圾通过空气发送。

可能的方法1:

  • 使用循环计时器中断,它每50 so左右读取按钮的状态一次。您可以使用一个计数器变量,如果按下按钮,该变量将增加1;如果释放按钮,则将其设置为零。

可能的方法2:

  • 在获得第一个键盘中断时,假设它处于上升边缘,则将该中断更改为在下降边缘触发。然后启动一个计时器,并确保在计时器运行期间没有中断。

一些MCU计时器外围设备支持两边的输入捕获,因此您可以在此基础上实现不同的替代方法。。

可能的方法3:

  • 如果使用一些简单的OOK内容,并且发射机一直处于休眠状态,直到按下按钮为止,您可以通过使用RFIC提供的RSSI功能来记录RSSI。但通过这种方式,您需要一些方法来检测是您的发射机导致RSSI上升。
票数 1
EN

Stack Overflow用户

发布于 2022-09-20 04:52:00

非常感谢大家的建议。我根据用户“busybee,Clifford和Lundin”的建议实现了这个逻辑,现在它已经开始工作了。请看一下。

代码语言:javascript
复制
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
              }
           }
        }
     }
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73730973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档