Плавное включение и выключение светодиода

patrikkk
Offline
Зарегистрирован: 27.10.2017

Я новичок в мире Arduino.

Изучая статью про управление яркостью светодиода http://arduino.ru/Tutorial/Fade.

/*
 Пример управления яркостью светодиода
 на выходе 9 контроллера Arduino
 функцией analogWrite().
 */
int brightness = 0;    // уставливаем начально значение яркости
int fadeAmount = 5;    // шаг приращения/убывания яркости
 
void setup()  {
  // устанваливаем пин 9 в режим выхода
  pinMode(9, OUTPUT);
}
 
void loop()  {
  // устанавливаем значение широты импульса на выходе 9
  // задавая яркость светодиода
  analogWrite(9, brightness);   
 
  // измением значение в переменной для яркости
  brightness = brightness + fadeAmount;
 
  // при достижение крайних значений для яркости
  // меняем знак переменной шага приращения/убывания яркости
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }   
  // делаем паузу для достижения плавного наращивания/убывания яркости  
  delay(30);                           
}

Столкнулся с проблемой, при установке шага приращения/убывания более 5, вся плавность пропадает (

Решил проблему так

byte ledPin = 9;
int brightness = 0;
byte fadeAmount = 5;
unsigned long timeCounter = 0;

void setup() {
    pinMode(ledPin, OUTPUT);
}

void loop()  { 
 
    while(1){
        if(millis()- timeCounter > 50){
            brightness += fadeAmount;
            if(brightness > 255) break;
            analogWrite(ledPin,brightness);
            timeCounter = millis();
        }
    }

    while(1){
        if(millis()- timeCounter > 100){
            brightness -= fadeAmount;
            if(brightness < 0) break;
            analogWrite(ledPin,brightness);
            timeCounter = millis();
        }
    }
}

Можно ли как-то улучшить мой код?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

 // delay(30);  

5N62V
Offline
Зарегистрирован: 25.02.2016

patrikkk пишет:

Можно ли как-то улучшить мой код?

Так хз что считать улучшением. Я где-то читал, что похожие куски кода надо выносить в функцию. Стоит ли делать это тут - вопрос риторический. 

Logik
Offline
Зарегистрирован: 05.08.2014

5N62V пишет:

patrikkk пишет:

Можно ли как-то улучшить мой код?

 Я где-то читал, что похожие куски кода надо выносить в функцию. Стоит ли делать это тут - вопрос риторический. 

Разумно. Стоит. Например так.

byte ledPin = 9;
int brightness = 0;
byte fadeAmount = 5;
unsigned long timeCounter = 0;

void setup() {
    pinMode(ledPin, OUTPUT);
}

void blim(int t, int f, bool (*p)(void))
{
    while(1){
        if(millis()- timeCounter > t){
            brightness += f;
            if(p()) break;
            analogWrite(ledPin,brightness);
            timeCounter = millis();
        }
    }
}

void loop()  { 
 blim(50,   fadeAmount, []()->bool{return brightness > 255;});
 blim(100, -fadeAmount, []()->bool{return brightness < 0;});
}

IDE v.1.6.5  или выше.

5N62V
Offline
Зарегистрирован: 25.02.2016

Logik пишет:

 

 blim(50,   fadeAmount, []()->bool{return brightness > 255;});
 blim(100, -fadeAmount, []()->bool{return brightness < 0;});

Вам не составит труда пояснить работу третьего аргумента ? С моим уровнем ни разу не понятно что это. 

Спасибо заранее! ПС . попытался выделить в коде строчку []()->bool{return brightness > 255;} 

negavoid
Offline
Зарегистрирован: 09.07.2016

5N62V, это дедушка так понтуется :). 

bool (*p)(void) - это указатель на некую функцию, не принимающую аргументов и возвращающую значение типа bool.

То есть, когда мы вызываем функцию blim(), третьим параметром мы должны передать ей указатель на функцию. Далее в коде она будет вызвана вот тут: if(p()) break;

Далее маленькая хитрость - вместо того, чтобы где-то в скетче описать отдельную функцию и третьим параметром просто написать указатель на неё, мы не делаем этого, а пишем эту функцию прямо в том самом месте, где её и вызываем. Получается функция без имени, так сказать, анонимная. []()->bool{return brightness < 0;} 

То есть, вместо этого: if(p()) break; выполняется вот это: if(brightness < 0) break;

Logik
Offline
Зарегистрирован: 05.08.2014

negavoid верно изложил. Токо не "понтуется", а ставит опыт по проверке интуитивной понятности применения лямбда-функций ;)

5N62V
Offline
Зарегистрирован: 25.02.2016

negavoid, 

понты - двигатель прогресса. На самом деле только они и мотивируют людей с высоким уровнем знаний делиться этими самыми знаниями с людьми, у кого уровень пониже . Так что в любом случае стоит быть благодарным. :)

Ок,  с безымянной функцией более-менее понятно. Вот эта конструкция  []()-> что делает?

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

все это хорошо но если вы хотите менять яркость плавно надо менять по такому ряду 0,1,3,7,15,31,63,127,255 ; а не линейно.

negavoid
Offline
Зарегистрирован: 09.07.2016

[] говорит компилятору, что мы хотим создать анонимную функцию

() говорит, что у неё нет передаваемых параметров

->bool говорит, что вот она, сейчас будет написана функция, возвращающая значение типа bool, внутри следующих скобок { ... }

https://msdn.microsoft.com/ru-ru/library/dd293608.aspx

5N62V
Offline
Зарегистрирован: 25.02.2016

negavoid пишет:

[] говорит компилятору, что мы хотим создать анонимную функцию

() говорит, что у неё нет передаваемых параметров

->bool говорит, что вот она, сейчас будет написана функция, возвращающая значение типа bool, внутри следующих скобок { ... }

https://msdn.microsoft.com/ru-ru/library/dd293608.aspx

Премного благодарен! 

papakaplo
Offline
Зарегистрирован: 18.04.2016

https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-...

 

Делаю так, зажигание по экспоненте т.е. самое плавное

Logik
Offline
Зарегистрирован: 05.08.2014

qwone пишет:

все это хорошо но если вы хотите менять яркость плавно надо менять по такому ряду 0,1,3,7,15,31,63,127,255 ; а не линейно.

или как результат расчета (1<n)-1, где n=0,1,2..7

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Logik пишет:

или как результат расчета (1<n)-1, где n=0,1,2..7

Вот только (1<<7)-1 это 127 . А вот (1<<8)-1 уже 255 . 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

patrikkk пишет:

Столкнулся с проблемой, при установке шага приращения/убывания более 5, вся плавность пропадает (

Нет здесь никакой проблемы: не увеличивайте шаг больше 5 и будет Вам счастье.

А если нужно увеличить скорость, то делайте это не увеличением шага, а уменьшением задержки.

Цитата:

Решил проблему так

Можно ли как-то улучшить мой код?

Ваш второй код не решает "проблему"

Поэтому улучшить - вернуться к первоначальному варианту.

Либо, если хотите избавиться от deley(), перепишите код так, чтобы он работал аналогично первому варианту.