Pessoal, preciso Incrementar o brilho de um LED com Millis()

Ola, estou fazendo a automação de um ambiente onde certos leds irao ligar automaticamente em função do horario (com o RTC), Esses leds nao podem ligar derrepente e sim quero que leve 5 minutos para chegarem ao brilho maximo. Porem com o uso de delay todo o meu programa para em funçao dele, o que é inviável. Até agora nao consegui pensar em um modo de incrementar a variavel de 0 a 255 (PWM) por 5 minutos usando millis(). Agradeço desde já.

Exibições: 664

Responder esta

Respostas a este tópico

Coloque um temporizador regulável.

Amigão, tenho a solução exata pro seu problema no meu blog: http://automatobr.blogspot.com.br/search?q=interrup%C3%A7%C3%A3o

Ola mauro, Gostei muito e rodou tranquilo aqui sem travar o meu Loop principal. mas esse seu exemplo é um fade continuo onde acende e apaga. eu mudei alguns sinais e valores para que o led acenda e pare no 255 (que é meu intuito) e ficou desse modo:

volatile byte _i = 0;volatile byte _j = 1;

void chama()
{
analogWrite(gPin,_i);
analogWrite(rPin,_i);
analogWrite(bPin,_i);
_i+=_j;
if (_i == 100)
_j=1;
else
if (_i == 0)
_i=255;
}

Isso aí. A função chama() é vc que define para obter o efeito que quiser. O importante é que vc conseguiu usar o mecanismo que eu sugeri.

Minha sugestão é a seguinte, no evento em que indica o inicio do acionamento dos leds, você 'ativa' uma variavel de controle (por exemplo, x=1) e salva o valor de millis() em outras variavel (por exemplo, t=millis()).

No loop você colocar um IF para verificando a variavel de controle e mapeia o valor do millis() atual indo de t a 300000+t (que representa 5 minutos apos t) para 0 a 255 e salva isso em uma variavel (y por exemplo).

Depois basta usar y como variavel

Exemplo de codigo

if(x==1){

  y=maps(millis(), t, 300000+t, 0, 255);

  analogWrite(ledPin, y);

}

Não testei mas acredito que a ideia está certa.

Ola João, eu tentei fazer do jeito que você explicou mas os leds nen acenderam. Olha como eu fiz:

if (hora==t1[0] && minuto==t1[1]) {
int x;
int y;
int t =millis();
if(x==1){
y=map(millis(), t, 300000+t, 0, 255);
analogWrite(LED1, y);
analogWrite(LED2, y);
analogWrite(LED3, y);
}
}

O problema de ambas as soluções é que o programa fica

Kályston não coloque a atribuição de t junto com o map e o acionamento dos LEDs.. Isso não faz sentido, deve deve ser definido apenas por 'fade' e não continuamente.
Mauro o programa não trava..

Ops... O problema de ambas as soluções é que o programa fica parado enquanto o led varia o brilho, enquanto que a minha solução (do blog) permite que o programa se dedique a outras funções ao mesmo tempo.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço