How do I make this LED flash once when i push the button?

I have tried using different methods to make this work. All with mixed outcomes, none of which are what i want.

I am left now with this mess of code which only turns the led on, leaving the LED illuminated until i release the button, where it goes off after one second:

/*
  Button

  Turns on and off a light emitting diode(LED) connected to digital pin 13,
  when pressing a pushbutton attached to pin 2.

  The circuit:
  - LED attached from pin 13 to ground
  - pushbutton attached to pin 2 from +5V
  - 10K resistor attached to pin 2 from ground

  - Note: on most Arduinos there is already an LED on the board
    attached to pin 13.

  created 2005
  by DojoDave <http://www.0j0.org>
  modified 30 Aug 2011
  by Tom Igoe

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/Button
*/

// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    beep();
 
  }
}


void beep() 
{

  //function body
  digitalWrite(ledPin, HIGH);   // sets the LED on
  delay(1000);                  // waits for a second
  digitalWrite(ledPin, LOW);    // sets the LED off                  // waits for a second

 
  
}

Just to clarify, do you mean flash once and once only, regardless of how long the button is pressed?

If so you might find it useful to look at the state change detect example in the IDE, file / examples / digital and initiiate the blink in the part where the button becomes newly pressed.

You need to look for a ‘change in the buttons state’, not at the buttons current level.

When this change is detected as LOW to HIGH, you turn on the LED then turn off after 1 second.

Look at the change in state example in the IDE.

Note:
Using delay() stops code execution for that amount of time.
This is not good as it blocks other things from happening.
Look at the BWD (blink without delay) example in the IDE which avoids using delay().

OK i have changed my mind here.

I want to make a Piezo buzzer beep for one second instead.

How could I convert the StateChangeDetection example to do that?

I can't recall when I last used a piezo buzzer, but if my memory is good, it needs no special treatment so it's the same as blinking an led.

Problem solved, After starting with a fresh example I was able to get the buzzer to beep simply by using this code.

/*
  State change detection (edge detection)

  Often, you don't need to know the state of a digital input all the time, but
  you just need to know when the input changes from one state to another.
  For example, you want to know when a button goes from OFF to ON. This is called
  state change detection, or edge detection.

  This example shows how to detect when a button or button changes from off to on
  and on to off.

  The circuit:
  - pushbutton attached to pin 2 from +5V
  - 10 kilohm resistor attached to pin 2 from ground
  - LED attached from pin 13 to ground (or use the built-in LED on most
    Arduino boards)

  created  27 Sep 2005
  modified 30 Aug 2011
  by Tom Igoe

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/ButtonStateChange
*/

// this constant won't change:
const int  buttonPin = 2;    // the pin that the pushbutton is attached to
const int ledPin = 13;       // the pin that the LED is attached to

// 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);
  // 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) {
     tone(10, 800, 1000);
    } else {
      // if the current state is LOW then the button went from on to off:
      Serial.println("off");
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;


}

Hi,
How do you have your button wired?
Do you have a pullup or pull down resistor on your button input pin?

Thanks.. Tom. :slight_smile:

TehBreakerPanel:
Problem solved

As a matter of interest, since you have the button pinMode'ed as INPUT (not INPUT_PULLUP) do you have a pulldown resistor on the button? Much easier to reverse the logic (look for high to low not low to high) with button to ground and INPUT_PULLUP, and not bother with a loose resistor.

(I actually saved a copy of the state change example with the logic changed.)

You still are using delay(), time to learn how to avoid using it.