按下一个中断生成按钮即可调用多个函数

Multiple function calls on one interrupt-generating button press

所以我这里有一个 c++ 程序,它利用 wiringPi 使线程休眠,直到按下按钮(在使用 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);
    }

}

我对 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 毫秒范围内的延迟。

我认为您只需设置一次 ISR(调用 wiringPiISR 一次)。在那之后永远睡觉(while(1)sleep(10);)。您似乎已经使用 print 语句对按钮进行了去抖动处理。去抖动通常是时间问题,打印需要几微秒导致按钮 "sort of" 去抖动。然而它仍然可以做一些弹跳

For more debouncing info see this SO page