Debounce problem

Hi guys, i am trying to use a button to turn on a relay, the code works but i am having some debounce problems, sometimes when i press te button, it would read the input multiple times, can i ask how do i solve this issue? thanks in advance.

//need to solve debounce problem.


// this constant won't change:
const int relaybutton =  8;      // the number of the relay pin
const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // the pin that the LED is attached to
// Pin 13: Arduino has an LED connected on pin 13
// Pin 11: Teensy 2.0 has the LED on pin 11
// Pin  6: Teensy++ 2.0 has the LED on pin 6
// Pin 13: Teensy 3.0 has the LED on pin 13

// Variables will change:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button


void setup() {
  // initialize the button pin as a input:
  pinMode(buttonPin, INPUT);
  // initialize the LED as an output:
  pinMode(ledPin, OUTPUT);
  pinMode(relaybutton, OUTPUT);
  // initialize serial communication:
  Serial.begin(9600);
}


void loop() {
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {


    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button
      // wend from off to on:
      buttonPushCounter++;
  Serial.println("1");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    }
    else {
      // if the current state is LOW then the button
      // wend from on to off:
      Serial.println("0");
    }
  }
  // save the current state as the last state,
  //for next time through the loop
  lastButtonState = buttonState;


  // turns on the LED every even pushes by
  // checking the modulo of the button push counter.
  // the modulo function gives you the remainder of
  // the division of two numbers:
  if (buttonPushCounter % 2 == 0) {
    digitalWrite(ledPin, HIGH);
    digitalWrite(relaybutton, LOW);
  } else {
    digitalWrite(ledPin, LOW);
    digitalWrite(relaybutton, HIGH);
  }

}

Check out the debounce example in the IDE (File->Examples->02.Digital->Debounce)

You can also install the Bounce2 library which does about the same thing.

Have a look at the debounce example in the IDE blh64 mentioned. If you do, you'll notice there is some timing going on. Some folks use a small delay. Some use millis as in the example. I've done both, but prefer to avoid delays if at all possible.

OR

Just read the input once every 50mS

You can use the library to simplify the debounce, see debounce example using library

pinMode(buttonPin, INPUT);
...
...

if (buttonState == HIGH)

Do you have a pulldown resistor (10k) between buttonPin and GND to hold the pin LOW so it's not randomly floating around between LOW and HIGH when it's NOT pressed?

Thanks guys for the help, it works now:) both bounce and delay, as for the pull down resister, i put it at 10k so thats not the problem:)