Плавное включение и выключение светодиода
- Войдите на сайт для отправки комментариев
Вс, 29/10/2017 - 02:02
Я новичок в мире 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(); } } }
Можно ли как-то улучшить мой код?
//
delay(30);
Можно ли как-то улучшить мой код?
Можно ли как-то улучшить мой код?
Разумно. Стоит. Например так.
IDE v.1.6.5 или выше.
Вам не составит труда пояснить работу третьего аргумента ? С моим уровнем ни разу не понятно что это.
Спасибо заранее! ПС . попытался выделить в коде строчку []()->bool{return brightness > 255;}
5N62V, это дедушка так понтуется :).
bool
(*p)(
void
) -
это указатель на некую функцию, не принимающую аргументов и возвращающую значение типа bool.То есть, когда мы вызываем функцию blim(), третьим параметром мы должны передать ей указатель на функцию. Далее в коде она будет вызвана вот тут:
if
(p())
break
;
Далее маленькая хитрость - вместо того, чтобы где-то в скетче описать отдельную функцию и третьим параметром просто написать указатель на неё, мы не делаем этого, а пишем эту функцию прямо в том самом месте, где её и вызываем. Получается функция без имени, так сказать, анонимная.
[]()->
bool
{
return
brightness < 0;}
То есть, вместо этого:
if
(p())
break
; выполняется вот это:
if
(brightness < 0)
break
;
negavoid верно изложил. Токо не "понтуется", а ставит опыт по проверке интуитивной понятности применения лямбда-функций ;)
negavoid,
понты - двигатель прогресса. На самом деле только они и мотивируют людей с высоким уровнем знаний делиться этими самыми знаниями с людьми, у кого уровень пониже . Так что в любом случае стоит быть благодарным. :)
Ок, с безымянной функцией более-менее понятно. Вот эта конструкция []()-> что делает?
все это хорошо но если вы хотите менять яркость плавно надо менять по такому ряду 0,1,3,7,15,31,63,127,255 ; а не линейно.
[] говорит компилятору, что мы хотим создать анонимную функцию
() говорит, что у неё нет передаваемых параметров
->bool говорит, что вот она, сейчас будет написана функция, возвращающая значение типа bool, внутри следующих скобок { ... }
https://msdn.microsoft.com/ru-ru/library/dd293608.aspx
[] говорит компилятору, что мы хотим создать анонимную функцию
() говорит, что у неё нет передаваемых параметров
->bool говорит, что вот она, сейчас будет написана функция, возвращающая значение типа bool, внутри следующих скобок { ... }
https://msdn.microsoft.com/ru-ru/library/dd293608.aspx
https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-...
Делаю так, зажигание по экспоненте т.е. самое плавное
все это хорошо но если вы хотите менять яркость плавно надо менять по такому ряду 0,1,3,7,15,31,63,127,255 ; а не линейно.
или как результат расчета (1<n)-1, где n=0,1,2..7
или как результат расчета (1<n)-1, где n=0,1,2..7
Вот только (1<<7)-1 это 127 . А вот (1<<8)-1 уже 255 .
Столкнулся с проблемой, при установке шага приращения/убывания более 5, вся плавность пропадает (
Нет здесь никакой проблемы: не увеличивайте шаг больше 5 и будет Вам счастье.
А если нужно увеличить скорость, то делайте это не увеличением шага, а уменьшением задержки.
Решил проблему так
Можно ли как-то улучшить мой код?
Ваш второй код не решает "проблему"
Поэтому улучшить - вернуться к первоначальному варианту.
Либо, если хотите избавиться от deley(), перепишите код так, чтобы он работал аналогично первому варианту.