I posed the following problem to my senior design class:  create an arduino sketch that toggles an LED with a button push ( similar to turning on/off a TV with one button).  The students quickly realized that they had to include a deboucing algorithm otherwise the boucing would result in a random on/off state.  Here is my solution that is an extension of Ladyada’s “better debouncer” http://learn.adafruit.com/tilt-sensor/using-a-tilt-sensor.




untitled

/* Better Debouncer Toggle
 * 
 * Helmut Strey 9/21/2012
 * 
 * this sketch senses debouced edges (high-low) (low-high) and toggles at (high-low)
 *
 * This debouncing toggle circuit is modified from Ladyada's better debounceer that can be found below
 * http://learn.adafruit.com/tilt-sensor/using-a-tilt-sensor
 *
 */
  
int inPin = 2;         // the number of the input pin
int outPin = 13;       // the number of the output pin
  
int LEDstate = HIGH;      // the current state of the output pin
int reading;           // the current reading from the input pin
int previous = LOW;    // the previous reading from the input pin
int switchprevious = LOW;
  
// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0;         // the last time the output pin was toggled
long debounce = 50;   // the debounce time, increase if the output flickers
  
void setup()
{
  pinMode(inPin, INPUT);
  digitalWrite(inPin, HIGH);   // turn on the built in pull-up resistor
  pinMode(outPin, OUTPUT);
}
  
void loop()
{
  int switchstate;
  
  reading = digitalRead(inPin);
  
  // If the switch changed, due to bounce or pressing...
  if (reading != previous) {
    // reset the debouncing timer
    time = millis();
  } 
  
  if ((millis() - time) > debounce) {
     // whatever the switch is at, its been there for a long time
     // so lets settle on it!
     switchstate = reading;
  
     // Now toggle the LEDstate when button is pressed
    if (switchstate == HIGH && switchprevious == LOW) {
       switchprevious = HIGH;
       if (LEDstate == HIGH) { LEDstate = LOW;} else { LEDstate = HIGH;}
       }
    if (switchstate == LOW && switchprevious == HIGH) {
       switchprevious = LOW;
       }
 
  }
  digitalWrite(outPin, LEDstate);
  
  // Save the last reading so we keep a running tally
  previous = reading;
}


One thought on “Arduino debounced toggle

Comments are closed.