Задержка PWM без блокировки кода

Я хочу, чтобы мой светодиод включался постепенно, без использования функции delay() и блокировки кода.

Вот код, который я придумал:

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);
    }
}

Является ли это «правильным способом» замедления продолжительности PMW с 0 до 255 или есть альтернативные/лучшие/более простые способы?

, 👍0

Обсуждение

Кажется, все в порядке с таймером затухания. Почему вы делаете else с i--? Вы хотите, чтобы светодиод исчез после появления? Это не работает таким образом, так как оно будет варьироваться только между 254 и 255., @chrisl

пример Fade в IDE использует задержку, но показывает, как двигаться вверх, а затем вниз. и поместите millisTimer = millis(); вне if-else, @Juraj

Ошибки новичка @chrisl... спасибо, что упомянули об этом., @ElectronSurf

По моему личному определению, «правильный путь» — это способ, который работает. Итак, это работает? Ваш подход — это обычный способ выполнять задачи без задержки (как в примере BlinkWithoutDelay)., @Sim Son

@SimSon Я новичок в этом, и я не знаю, как другие пишут код «стандартным способом», думал, что вопрос может открыть новые двери для изучения новых вещей., @ElectronSurf

см. пример Fade и пример BlinkWithoutDelay в меню примеров IDE., @Juraj

@Juraj хорошо, спасибо., @ElectronSurf

Всё нормально, я так же делаю, @Sim Son

весь код внутри блока if(condition == 1){, кроме analogWrite(), должен иметь отступ еще на один уровень, @jsotola


1 ответ


Лучший ответ:

3

Вот мой взгляд на это - я следовал примеру кода, упомянутому другими участниками, и вот "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;
    }
  }
}

,