Blinking two LEDs in and out of phase

They are local variables. They do not exist outside the function.

Another thing you could do is schedule by completed cycles instead of by time:

const byte led1 = 2;
const byte led2 = 8;

unsigned CycleCount = 0;

unsigned long previousMillis = 0;
void blink(unsigned long onTime, unsigned long phaseDifference, unsigned long rate)
{
  unsigned long elapsedTime = millis() - previousMillis;

  if (elapsedTime >= rate)
  {
    previousMillis = millis(); // Start a new cycle
    elapsedTime = 0;
    CycleCount++;
  }

  if (elapsedTime < onTime)
    digitalWrite(led1, HIGH);
  else
    digitalWrite(led1, LOW);
  
  if (elapsedTime >= phaseDifference && elapsedTime < (phaseDifference + onTime))
    digitalWrite(led2, HIGH);
  else
    digitalWrite(led2, LOW);
}

void setup()
{
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
}

void loop()
{
  Serial.println((millis() / 1000) % 60);

  if (CycleCount < 10) // Do 10 cycles
    blink(50, 0, 2000);
  else if (CycleCount < 20) // then 10 more cycles
    blink(50, 100, 3000);
  else if (CycleCount < 30) // then 10 more cycles
    blink(50, 500, 1000);
  else if (CycleCount < 40) // then 10 more cycles
    blink(50, 100, 2000);
  else
    CycleCount = 0;
}
1 Like