按下中断产生按钮即可进行多功能调用

时间:2018-09-07 05:16:25

标签: c++ raspberry-pi wiringpi

所以我在这里有一个c ++程序,它利用wireingPi来使线程休眠直到按钮被按下为止(在使用GPIO的rapsberryPi上),但是当按下按钮时,它通常可以多次打印消息。我试图通过在循环中休眠几秒钟来解决此问题,但这无济于事,使我认为这与中断生成如何调用函数有关。关于如何解决此问题的任何建议,以便该功能仅在每次按下按钮时运行一次?

#include <stdlib.h>
#include <iostream>
#include <wiringPi.h>
#include <unistd.h>

void printMessage(void) { 
    std::cout << "Button pressed! hooray" << std::endl; 
}

int main(int argc, char const *argv[]) {   

    wiringPiSetup();

    while(true) {
        wiringPiISR(3, INT_EDGE_FALLING, &printMessage);//3 is the wiringPi pin #
        sleep(3);
    }

}

2 个答案:

答案 0 :(得分:2)

我认为您只需设置一次ISR(请致电wiringPiISR)。在那之后,就永远睡(while(1)sleep(10);)。您似乎已使用打印语句对按钮进行了防抖处理。防抖动通常可能是时间问题,打印需要花费几微秒的时间,从而使按钮被“防抖动”。但是它仍然可以弹跳

For more debouncing info see this SO page

答案 1 :(得分:1)

我不熟悉Raspberry-Pi,但是如果代码可以直接感测按钮状态(而不是使用触发的中断),请执行以下操作以仅对启用转换做出反应:

int main (...)
{
     writingPiSetup ();
     bool  last_state = false;

     while (true)
     {
          bool this_state = wiringPiDigital (3);  // use correct function name
          if (last_state == false  &&  this_state == true) // button freshly pressed
          {
               std::cout << "Button freshly pressed" << std::endl;
          } 
          last_state = this_state;
     }
}

但是,硬件很可能不是debounced。因此,可能需要插入一点延迟。我会根据应用程序的具体情况尝试10到100毫秒的延迟。