Fade LED on, stay on for duration, turn off, loop again after duration?

Hello everyone. I'm sorry if this is the wrong forum for this sort of thing. I have done a number of searches and I can't seem to work out how to achieve what I am trying to do.

I have 5 LEDs. I want them to all fade on from 0 to full brightness 255. I want them to stay on at full brightness for 15 seconds. Then I want them to turn off. I want this whole operation to repeat every 10 minutes.

I'm currently testing this with one LED. This is the sample code I started with:

/*
  Fade

  This example shows how to fade an LED on pin 9 using the analogWrite()
  function.

  The analogWrite() function uses PWM, so if you want to change the pin you're
  using, be sure to use another PWM capable pin. On most Arduino, the PWM pins
  are identified with a "~" sign, like ~3, ~5, ~6, ~9, ~10 and ~11.

  This example code is in the public domain.

  https://www.arduino.cc/en/Tutorial/BuiltInExamples/Fade
*/

int led = 9;           // the PWM pin the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

// the setup routine runs once when you press reset:
void setup() {
  // declare pin 9 to be an output:
  pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  // set the brightness of pin 9:
  analogWrite(led, brightness);

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }
  // wait for 30 milliseconds to see the dimming effect
  delay(30);
}

This sketch makes the LED fade on and off again repeatedly. I've removed the "reverse direction of the fade" bit and now it fades on but I can't work out how to get it to stay on. I've tried:

if (brightness >= 255)
delay(15000);

at the end of the sketch. I know this wouldn't even cover everything I want but I'm trying to take it a step at a time. Arduino software verifies it. I load the sketch, the LED fades on and stays on for 15 seconds as intended. Then it turns off and never comes back on again.

Any help you can provide is much appreciated.

I think that you need something like a finite state machine. It will have two states, one where they fade to max brightness and one where they are steady on; once a state is complete, you switch to the next state. Based on your use of delay, the below should do what you want.

// that states of the leds
enum LEDSTATE
{
  FADING,
  ON,
};

const uint8_t ledPins[] = {LED_BUILTIN, 9};

int16_t brightness = 0;    // how bright the LED is
int16_t fadeAmount = 5;    // how many points to fade the LED by

const uint32_t fadeDelay = 100;
const uint32_t onDelay = 5000;

void setup()
{
  Serial.begin(57600);
  for (uint8_t ledCnt = 0; ledCnt < sizeof(ledPins); ledCnt++)
  {
    pinMode(ledPins[ledCnt], OUTPUT);
    digitalWrite(ledPins[ledCnt], LOW);
  }
}

void loop()
{
  // current state of state machine; start with fading
  static LEDSTATE currentState = FADING;

  switch (currentState)
  {
    case FADING:
      // control the leds
      for (uint8_t ledCnt = 0; ledCnt < sizeof(ledPins); ledCnt++)
      {
        analogWrite(ledPins[ledCnt], brightness);
      }
      // change the brightness for next time through the loop:
      brightness = brightness + fadeAmount;
      // wait a bit
      delay(fadeDelay);

      // if max brightness reached, switch to next state
      if (brightness >= 255)
      {
        currentState = ON;
        Serial.print(millis());
        Serial.println(": switching to ON");
      }

      break;
    case ON:
      delay(onDelay);
      Serial.print(millis());
      Serial.println(": switching to FADING");
      // reset brightness
      brightness = 0;
      // back to FADING state
      currentState = FADING;
      break;
  }
}

An enum is a type that can only have the specified values.

The code uses an array for the led pins so you can easily expand it. Be aware that if the ledPins array is not of type uint8_t (aka byte), the code might not do what you want and needs a modification.

Be aware that, due to the use of delay, the code is blocking; e.g. during the onDelay you can not read buttons.

1 Like

Hi, check out ws2811/ws2812 strips.
You can control each LED differently for colour and brightness
The library is fastLED.h