0

I want my LED to turn on gradually without using the delay() function and blocking the code.

Here's the code i came up with:

int led_pin = 6;
unsigned long millisTimer = 0;
int PWMdelay = 5000;
int condition = 0;
int i = 0;
void setup() {
    pinMode(led_pin, OUTPUT);
}
void loop() {
    if(condition == 1){
    if ((millis() - millisTimer) > PWMdelay){
        if(i<255){
            i++;
            millisTimer = millis();
        }

    }
        analogWrite(led_pin, i);
    }
}

Is this the "right way" of slowing the PMW duration from 0 to 255 or there are alternative/better/easier ways?

  • 1
    Seems ok for fade in timer. Why are you doing the else with i--? Do you want to fade out the LED after the fade in? That does not work this way, since it will only vary between 254 and 255. – chrisl Jun 23 at 14:44
  • 1
    the Fade example in IDE uses delay, but shows how to go up and then down. and put millisTimer = millis(); outside if-else – Juraj Jun 23 at 14:46
  • 1
    From my personal definition, the "right way" is a way that works. So, does it work? Your approach is a common way to do tasks without delay (like in the BlinkWithoutDelay example) – Sim Son Jun 23 at 14:46
  • 1
    see the Fade example and the BlinkWithoutDelay example in IDE Examples menu – Juraj Jun 23 at 14:49
  • 1
    That's fine, I do it the same way – Sim Son Jun 23 at 16:42
2

Here is my take at this - I've followed the example code mentioned by other members and here is "FadeWithoutDelay"


const int ledPin = 11;
unsigned long previousMillis = 0;        // will store last time LED was updated
const long interval = 100;               // fade interval (milliseconds)
int brightness = 0;                      // how bright the LED is
int fadeAmount = 5;                      // how many points to fade the LED by

void setup() 
{
  pinMode(ledPin, OUTPUT);  // set the digital pin as output:
}
void loop() 
{
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) 
  {
    previousMillis = currentMillis;         // save the last state
    analogWrite(ledPin, brightness);        // Set the brightness
    brightness = brightness + fadeAmount;   // change the brightness for next time through the loop
    // reverse the direction of the fading at the ends of the fade:
    if (brightness <= 0 || brightness >= 255) 
    {
      fadeAmount = -fadeAmount;
    }
  }
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.