Blink an LED without delay, wait a while then repeat

Hello everyone

Im trying to get make a PIEZO to beep quickly twice using the Blink without delay example however, at the end of two blinks I want the PIEZO to not beep for a period of time that is separate to the one used for the blink. It works fine using the method below but I can't help to think that it could be done it a much simpler way. Any suggestions would be great!

/* Blink without Delay

  Turns on and off a light emitting diode (LED) connected to a digital
  pin, without using the delay() function.  This means that other code
  can run at the same time without being interrupted by the LED code.

  The circuit:
   LED attached from pin 13 to ground.
   Note: on most Arduinos, there is already an LED on the board
  that's attached to pin 13, so no hardware is needed for this example.

  created 2005
  by David A. Mellis
  modified 8 Feb 2010
  by Paul Stoffregen
  modified 11 Nov 2013
  by Scott Fitzgerald


  This example code is in the public domain.

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

// constants won't change. Used here to set a pin number :
const int ledPin =  13;      // the number of the LED pin
const int PIEZO = 5;

// Variables will change :
int ledState = LOW;             // ledState used to set the LED
int PIEZOstate = LOW;            // PIEZOstate used to set the LED
int blinkcount = 0;

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated
// constants won't change :
const long interval = 100;           // interval at which to blink (milliseconds)

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis2 = 0;        // will store last time LED was updated
// constants won't change :
const long interval2 = 10000;           // interval at which to blink (milliseconds)

void setup() {
  Serial.begin(9600);      // open the serial port at 9600 bps:
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  Serial.print(blinkcount);
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the
  // difference between the current time and last time you blinked
  // the LED is bigger than the interval at which you want to
  // blink the LED.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval)
    if (blinkcount <= 3) {
      // save the last time you blinked the LED
      previousMillis = currentMillis;

      // if the LED is off turn it on and vice-versa:
      if (ledState == LOW) {
        ledState = HIGH;
        PIEZOstate = 20;
        blinkcount = blinkcount + 1;
      } else {
        ledState = LOW;
        PIEZOstate = LOW;
        blinkcount = blinkcount + 1;
      }
      // set the LED with the ledState of the variable:
      digitalWrite(ledPin, ledState);
      analogWrite(PIEZO, PIEZOstate);
    }
  if (blinkcount == 4)
  {
    unsigned long currentMillis2 = millis();
    ledState = LOW;
    PIEZOstate = LOW;

    if (currentMillis2 - previousMillis2 >= interval2) {
      // save the last time you blinked the LED
      previousMillis2 = currentMillis2;
      // set the LED with the ledState of the variable:
      blinkcount = 0;
    }
  }
}

I dont know if i got the question right, but i give it a try :slight_smile:

The code below will make a two time beep if called.

void beep(){
int duration = 500;
int pause = 500;


if(millis()-startTime > duration1 || (millis()-startTime > duration+pause && < duration+duration+pause)){
   digitalWrite(BUZZER, 100);
}
else{
   digitalWrite(BUZZER, LOW);
}
}

you could call this by

if (somecase){
startTime = millis();}

and include void beep(); in your loop

At least you can replace :

blinkcount = blinkcount + 1;
//with
blinkcount++ ;

and :

if (blinkcount == 4)
//with
else

This is un update of your code.
I mainly move some lines to 2 subroutines in order to ease maintenance and clarify.
The goal is to avoid having nested if blocks, which is not easy to understand .

// constants won't change. Used here to set a pin number :
const int ledPin =  13;      // the number of the LED pin
const int PIEZO = 5;

// Variables will change :
int ledState = LOW;             // ledState used to set the LED
int PIEZOstate = LOW;            // PIEZOstate used to set the LED
int blinkcount = 0;

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated
// constants won't change :
const long interval = 100;           // interval at which to blink (milliseconds)

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long currentMillis ;
unsigned long previousMillis2 = 0;        // will store last time LED was updated
// constants won't change :
const long interval2 = 10000;           // interval at which to blink (milliseconds)


void blinkSteps0to2() {
      // save the last time you blinked the LED
      previousMillis = currentMillis;

      // if the LED is off turn it on and vice-versa:
      if (ledState == LOW) {
        ledState = HIGH;
        PIEZOstate = 20;
        blinkcount++;
      } else {
        ledState = LOW;
        PIEZOstate = LOW;
        blinkcount++;
      }
      // set the LED with the ledState of the variable:
      digitalWrite(ledPin, ledState);
      analogWrite(PIEZO, PIEZOstate);
    }

void blinkStep3(){
    unsigned long currentMillis2 = millis();
    ledState = LOW;
    PIEZOstate = LOW;

    if (currentMillis2 - previousMillis2 >= interval2) {
      // save the last time you blinked the LED
      previousMillis2 = currentMillis2;
      // set the LED with the ledState of the variable:
      blinkcount = 0;
    }
 }

void setup() {
  Serial.begin(9600);      // open the serial port at 9600 bps:
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);
  pinMode(5, OUTPUT);
}

void loop() {
  Serial.print(blinkcount);
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the
  // difference between the current time and last time you blinked
  // the LED is bigger than the interval at which you want to
  // blink the LED.
  currentMillis = millis();

//update 2016/04/20:  { } have been added  
//
  if (currentMillis - previousMillis >= interval) {
    if (blinkcount <= 3) blinkSteps0to2() ;
    else blinkStep3() ; 
  }
}

I hope these suggestions help improve your future programs . :slight_smile:

Jean-Paul

Thanks for the replies! jgarbasi code works great!