4.2 Pull-up/down resistors, debouncing
So the last question was a trick one. Both schematics are wrong. Each schematic will work fine when the button is depressed (i.e. circuit closed). However, when the button is not depressed (i.e. circuit open) the input is not connected to anything. This is called a floating input and will give inconsistent data. To correct this problem we use either a pull-down resistor or a pull-up resistor.
GO WITH THE FLOW
Electricity behaves a bit like water insomuch that it will flow to where it encounters the least resistance. When a switch is CLOSED it has no resistance – in this case the current will flow through the switch since it has less resistance than our pull-up/down resistor. When the switch is OPEN it has infinite resistance – in this case the current will flow through our pull-up/down resistor to +5V or GND accordingly.
Wire up your board with the pull-up resistor schematic – use digital pin 2 for your input:


Notice that 100 Ohm resistor between the DIGITAL PIN and the switch? This is in case you accidentally set the PIN to OUTPUT by mistake – the 100 Ohm resistor will prevent a short circuit. Tip by electronics diva Lada Ada
Ok, there is one last thing you need to know about switches.
Because of their mechanical nature, a switch’s contacts will sometimes rapidly strike against each other as the switch is closed – a phenomenon called switch bouncing, contact bounce, or chatter. This causes a rapid series of electrical pulses that may be interpreted by the microcontroller as multiple button presses.
Switch bouncing can be fixed by creating a more complex circuit that adds a capacitor and a Schmitt trigger. If you are using a microcontroller an easy solution is to add a small delay when a state change is detected.
Cut and paste the following code into the Arduino editor, compile it and upload it to your Arduino.
/*
* Button with debounce
* by DojoDave, debouncing by roguescience.org
*
* Turns on and off a light emitting diode(LED) connected to digital
* pin 13, when pressing a pushbutton attached to pin 2. Re-checks
* value after 10ms to make sure it is not a bounce.
*/
int ledPin = 13; // choose the pin for the LED
int inputPin = 2; // choose the input pin (for a pushbutton)
int val = 0; // variable for reading the pin status
int bounceCheck = 0; // variable for debouncing
void setup() {
pinMode(ledPin, OUTPUT); // declare LED as output
pinMode(inputPin, INPUT); // declare pushbutton as input
}
void loop(){
val = digitalRead(inputPin); //read input value
delay(10); //wait 10ms
bounceCheck = digitalRead(inputPin); //check again
if(val == bounceCheck){ //if val is the same then not a bounce
if (val == HIGH) { //check if the input is HIGH
digitalWrite(ledPin, LOW); //turn LED OFF
} else {
digitalWrite(ledPin, HIGH); //turn LED ON
}
}
}
The arduino has built-in pullup resistor. That seems worth a mention.
Yes – thanks Josiah – when I first created the tutorial I was unaware of the internal pullups – nonetheless I think it is a good exercise to teach people how pullup resistors work first since they are ubiquitous in electronics. To enable the built-in (20k) pullup (off by default) on a pin use the following code:
pinMode(pin, INPUT); // set pin to input
digitalWrite(pin, HIGH); // turn on pullup resistors
Works for analog pins too.
More details: http://www.arduino.cc/en/Tutorial/DigitalPins
I understand software debouncing but how do you do it with hardware??
nice info.thaks..
Robert here is a good example of hardware debouncing using a SPDT switch and cross-coupled NAND http://www.elexp.com/t_bounc.htm – some people also use an RC filter in conjunction with a Shmitt trigger.