Arduino: Software Debouncing in Interrupt Function...

Hi everybody!

So recently i was working on a Project where i wanted to meassure the RPM of one of the Wheels on my Car, and from that calculate the Speed, keep track of the Driven distance etc. with an Arduino.
I wanted to use a Magnet and a Reed Switch to meassure the RPM, for that i needed to debouce the Signal from the Reed Switch, since i couldn't find any way to debouce a signal in interrupt functions that didn't require additional hardware for debouncing the signal on the Internet, here is how i debounced the Signal comming from the Reed Switch...




//Software debouncing in Interrupt, by Delphiño K.M.

long debouncing_time = 15; //Debouncing Time in Milliseconds
volatile unsigned long last_micros;

void setup() {
  attachInterrupt(0, debounceInterrupt, RISING);
}

void loop() {
}

void debounceInterrupt() {
  if((long)(micros() - last_micros) >= debouncing_time * 1000) {
    Interrupt();
    last_micros = micros();
  }
}

void Interrupt() {
  //Do Something
}

You could also "Do Something" in the main function, instead of calling a second function that then does something, i just liked it better this way...

Note: I've only tried this on an Arduino Mega (ATmega1280), with Arduino 0022.
Also, this isn't a perfect solution, the interrupt function is stil called multiple times, the follwing calls, in the next 15ms are just ignored, but hey, it does the job, so screw it!

Well, thats about it, i hope this helps someone...

P.S. This is my first Instructable, so if you don't have anything nice to say, don't say anything at all, allthough corrections, improvements, etc. are of course allways welcome...

Share

    Recommendations

    • Make it Glow Contest 2018

      Make it Glow Contest 2018
    • Plastics Contest

      Plastics Contest
    • Optics Contest

      Optics Contest

    31 Discussions

    0
    None
    GuusV

    3 years ago

    I tried this code in combination with hardware debouncing like described in this article: http://www.ganssle.com/debouncing-pt2.htm When I keep the button pressed the interrupt is keep getting called. Why is this, when it is triggered on RISING edge?

    3 replies
    0
    None
    GuusVGuusV

    Reply 3 years ago

    Currently I switched to using an SR latch to toggle a state ON or OFF, but it requires 2 buttons. But I have not yet seen it fail and trigger multiple interrupts. And the interrupt routine now only requires 1 line: "state = !state"

    0
    None
    GuusVGuusV

    Reply 3 years ago

    On second thought, not happy with SR switch as the initial state of Q is unknown and can be either 1 or 0. Also I used 2 buttons and 2 interrupts.

    I am now using a 555 in monostable mode (.5 sec output pulse width) which uses 1 button and is consistent when triggering a switch on RISING edge. I have not yet been able to trigger the interrupt multiple times.

    0
    None
    TheOriginalNerdGuusV

    Reply 9 days ago

    GuusV, for the SR latch you don't necessarily need to buttons, but you would need to pins. You can use 1 button attached and use a pin attached to the latch's input to reverse the latch.

    0
    None
    snakeboy69

    11 months ago

    I have a rain gauge that uses a tipping bucket with a reed switch/magnet to calculate fallen rain and have been having issues with random interrupt triggering. I tried this code and after updating the value to 30 milliseconds, I've been able to eliminate this problem. Thank you!

    0
    None
    ArthurR19

    2 years ago

    Why not simply do this to avoid needless interrupts during bouncing:

    void debounceInterrupt() {
    noInterrupts();
    delayMicroseconds(15000);
    interrupts();
    // do something
    }

    4 replies
    0
    None
    delphino-999ArthurR19

    Reply 2 years ago

    Interrupts should execute as fast as possible though, so the microcontroller/computer can go back to the main loop. This especially plays a role when you have multiple hardware interrupts, since you can only have one triggered at a time. While your code would also work, it may 'cause problems in certain situations, 'cause the interrupt causes the program to pause for 15ms each time the interrupt is triggered. So if the interrupt is triggered 50 times per secons for example, your program would be waiting doing nothing 75% of the time.

    0
    None
    ArthurR19delphino-999

    Reply 2 years ago

    I use the routine only for debouncing a tactile switch. It's no problem to pause the main program for 15 ms.

    0
    None
    delphino-999ArthurR19

    Reply 2 years ago

    In that case you can do it that way, it's good practice though to keep your main loop (and especially interrupts) running as fast as possible. In some cases you will need every last spare moment your microcontroller has and in that case it's not a particularly good idea, to have it sit and wait though delays all the time. ;-)

    0
    None
    XazhuaR

    1 year ago

    Thank you, it seems to work well! But for my buttons I had to make the delay 300micros to get a good result.

    0
    None
    duwageM

    2 years ago

    Hi thanks for tutorial. I tested with Esp 12E and work great.

    0
    None
    MinhTuanT

    2 years ago

    Thank you very much :)

    0
    None
    pisicaverde

    2 years ago

    I signed up to Instructables just to say Thanks for this tutorial :)

    1 reply
    0
    None
    delphino-999pisicaverde

    Reply 2 years ago

    Wow, thanks!

    I'm glad if it helped you. :-)

    (one time would have been enough though)

    0
    None
    pisicaverde

    2 years ago

    I signed up to Instructables just to say Thanks for this tutorial :)

    0
    None
    pisicaverde

    2 years ago

    I signed up to Instructables just to say Thanks for this tutorial :)

    0
    None
    pisicaverde

    2 years ago

    I signed up to Instructables just to say Thanks for this tutorial :)

    0
    None
    pisicaverde

    2 years ago

    I signed up to Instructables just to say Thanks for this tutorial :)

    0
    None
    matti.virta.1

    2 years ago

    hi, i try adding thats my project manytime and change code but not working,'

    my project have 1 button make led pwm ,25 on/off, and 2 button make same leds pwm 255 and flash plinking led on 100 and off 150, but debouncer not working ,sometime code do leds have on alltime and sometime leds plink alltime and buttons not do anythink, how i made thats working right ? i no understand help please, i use buttons whit pull up, +5 volt--resistor---button and ardunio, other side button have ground. leds normal arduino---resistor--tip 120 transistor--led---ground.