Плавное затухание светодиода

vvadim
Offline
Зарегистрирован: 23.05.2012

Нужно при  нажатии на тактовую кнопку включить светодиод и чтобы он плавно затухал в течении 5- 10 секунд. Использовать delay () не хочется из-за большого времени затухания. Примеры с fade используют задержки. Может кто то сталкивался с подобным? или в каком направлении копаться? Буду признателен за помощь или подсказку.

maksim
Offline
Зарегистрирован: 12.02.2012

Копать нужно все в том же направлении Мигаем светодиодом без delay(), и кстати поищите гдето были подобные темы.

vvadim
Offline
Зарегистрирован: 23.05.2012

C delay работает

if(button1State == HIGH) {
int x = 1;
for (int i=255; i >= 0; i = i - x){
analogWrite(PWMpin, i);
delay(15);
}
}

 

leshak
Offline
Зарегистрирован: 29.09.2011

Во первых:

Вставка программного кода в тему/комментарий

Во вторых. Максим дал вам ссылку на пример. 

Вам нужно сделать что-то подобное, только при сработке "  //проверяем не прошел ли нужный интервал, если прошел то" вам нужно не полностью включать/выключать диод, а "уменьшить" яркость.

 

leshak
Offline
Зарегистрирован: 29.09.2011

Примерно так это будет:

byte pwm=0;
unsigned long dTime=0;

void loop(){
   .....
   if(buttonState==HIGH){
      pwm=255; // включит диод на полную яркость
      dTime=millis(); // запускаем таймер
   }

   if( pwm &&  (millis()-dTime>50) ){ // если светодод горит и прошло 50 msec  с прошлого уменьшения
       pwm--; // уменьшаем яркость
      dTime=millis(); // запоминаем когда это сделали
   } 

   analogWrite(PWM_PIN,pwm); 
}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

Leshak спасибо, работает. 

А если сделать так, чтобы светодиод горел какое то время ( например 20 сек ) , а уже потом плавно затухал -  тогда надо использовать два таймера?  Один для постоянного горения, второй для затухания.

 

maksim
Offline
Зарегистрирован: 12.02.2012

Не обязательно, можно сделать так:

int pwm=0;
unsigned long dTime=0;

void loop(){
   .....
   if(buttonState==HIGH){
      pwm=655; // включит диод на полную яркость
      dTime=millis(); // запускаем таймер
   }

   if( pwm &&  (millis()-dTime>50) ){ // если светодод горит и прошло 50 msec  с прошлого уменьшения
       pwm--; // уменьшаем яркость
      dTime=millis(); // запоминаем когда это сделали
   } 

   analogWrite(PWM_PIN, min(pwm, 255));
}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

Спасибо. Оказалось просто и логично.

Ytm
Offline
Зарегистрирован: 06.11.2013

разобрался...