Jacob Bernard
Jacob Bernard

Reputation: 25

Multiple function calls on one interrupt-generating button press

So I have a c++ program here utilizing wiringPi to sleep a thread until a button press (on a rapsberryPi using the GPIO), but when the button is pressed it can often print the message multiple times. I tried to remedy this by sleeping for a few seconds within the loop but this didn't help leading me to believe that it has something to do with how the interrupt generation calls the function. Any advice for how I can solve this so the function is only ran once per button press?

#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);
    }

}

Upvotes: 1

Views: 821

Answers (2)

wallyk
wallyk

Reputation: 57774

I am not familiar with the Raspberry-Pi, but if the code can directly sense the button state (instead of using a triggered interrupt) do something like this to react only on the enabling transition:

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;
     }
}

However, it is quite possible that the hardware is not debounced. So inserting a little bit of delay might be called for. I would experiment with delays in the 10 to 100 millisecond range depending on the particulars of the application.

Upvotes: 1

ikkentim
ikkentim

Reputation: 1648

I think you only have to set the ISR once (call wiringPiISR once). After that just sleep forever (while(1)sleep(10);). You seem to have debounced your button using a print statement. Debouncing can often be a matter of timing, and printing takes a few microseconds causing the button to be "sort of" debounced. It can however still do some bouncing

For more debouncing info see this SO page

Upvotes: 2

Related Questions