Плавное включение и выключение светодиода
- Войдите на сайт для отправки комментариев
Вс, 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);Можно ли как-то улучшить мой код?
Можно ли как-то улучшить мой код?
Разумно. Стоит. Например так.
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 или выше.
blim(50, fadeAmount, []()->bool{return brightness > 255;}); blim(100, -fadeAmount, []()->bool{return brightness < 0;});Вам не составит труда пояснить работу третьего аргумента ? С моим уровнем ни разу не понятно что это.
Спасибо заранее! ПС . попытался выделить в коде строчку []()->bool{return brightness > 255;}
5N62V, это дедушка так понтуется :).
bool(*p)(void) -это указатель на некую функцию, не принимающую аргументов и возвращающую значение типа bool.То есть, когда мы вызываем функцию blim(), третьим параметром мы должны передать ей указатель на функцию. Далее в коде она будет вызвана вот тут:
if(p())break;Далее маленькая хитрость - вместо того, чтобы где-то в скетче описать отдельную функцию и третьим параметром просто написать указатель на неё, мы не делаем этого, а пишем эту функцию прямо в том самом месте, где её и вызываем. Получается функция без имени, так сказать, анонимная.
[]()->bool{returnbrightness < 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(), перепишите код так, чтобы он работал аналогично первому варианту.