Задержка 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 или есть альтернативные/лучшие/более простые способы?
@ElectronSurf, 👍0
Обсуждение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;
}
}
}
,
@Cute Lava
Смотрите также:
- attiny85 и arduino — аналоговое чтение + pwmOut
- Двигатель постоянного тока шумит, но не вращается
- Можно ли использовать цифровые контакты в качестве выхода ШИМ?
- Как прочитать значение PIN PWM-выхода?
- Arduino вылетает и перезагружается
- Быстрый ШИМ с Arduino, входы-выходы не работают
- Почему переменные PWM в этом фрагменте кода RC обрабатываются таким образом? Что такое магические числа?
- Как объявить массив переменного размера (глобально)
Кажется, все в порядке с таймером затухания. Почему вы делаете 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