Como separar a sentença 'for' das outras programações no arduino?

Como separar a sentença 'for' das outras programações no arduino

Ex se mando o comando para ligar ou desligar a lampada, este comando só ira chegar ao Relé , após ter passado por todo o incremento do laço for. E quando não tem o laço for junto com outros comandos

funciona normalment, mando o comando e imediatamente o rele é acionado; Queria saber como interagir outras programações junto com 'for' sem ele interferir no tempo do comando das outras programações, Por isso a pergunta: Como separar a sentença 'for' das outras programações no arduino

Segue a programação que fiz de ex:

int releLampada=13; //Pino de saida para Lampada
char acesso;

int LED_CONTROLE=9; // Intensidade led através de 'for'

void setup()
{
pinMode(releLampada,OUTPUT);
pinMode(LED_CONTROLE,OUTPUT);
digitalWrite(releLampada,LOW);
digitalWrite(LED_CONTROLE,LOW);
Serial.begin(9600);
}
void loop()
{
if(Serial.available()>=0){
acesso=Serial.read();
}
if(acesso=='1'){
digitalWrite(releLampada,HIGH);
Serial.println("Lampada Ligada");
delay(200);
}
else if(acesso=='0'){
digitalWrite(releLampada,LOW);
Serial.println("Lampada Desl");
delay(200);
}
for(int potpin=0; potpin<=255; potpin+=5){ //-----------------------------
Serial.println(potpin); //------------------------------------------------------------
analogWrite(LED_CONTROLE,potpin); //----------------------------------
delay(250); //--------------------------------------------------------------------------
} //-----------------------------------------------------------------------------------------
for(int potpin=255; potpin>=0; potpin-=5){ //-------------------------------
Serial.println(potpin); //-------------------------------------------------------------
analogWrite(LED_CONTROLE,potpin); //-----------------------------------
delay(250); //---------------------------------------------------------------------------
 }
}

// Vlw moçada desde já agradeço!

Exibições: 631

Responder esta

Respostas a este tópico

O seu código está gerando um delay monstruoso durante os laços for. Você está com um led conectado na porta 9 (PWM) e faz isso pra ter a percepção visual da intensidade do brilho do led alterando.

Veja bem, o token "for" executa um loop de acordo com o controle de iteração (variável do loop, no seu caso potpin). Você está interagindo de 0 a 255, e depois de 255 a 0; com passos de 5 em 5 unidades. Isso significa que cada loop tem 51 iterações (255 / 5). 102 iterações no total.

Em cada iteração você colocou um delay de 250 milissegundos, ou seja, 1/4 de segundo. Os dois loops somam um delay de 25500 milissegundos, ou 25,5 segundos ( 102 iterações vezes 250 milissegundos). Aqui está o atraso.

A função loop() do arduino é executada repetidamente, pelo controle principal (a partir da função main, que está embrenhada no núcleo do código). Ela só vai ser executada novamente quando finalizar a execução atual.

Outra forma de fazer isso é usando a própria natureza cíclica da função loop(). Você declara uma variável fora do escopo da função e controla ela dentro da função.

Para o que você quer fazer, seria algo +/- assim:

int intensidade_led = 0;

boolean somar_intensidade = true;

void loop()

{

// Aqui vai o codigo de controle dos reles

if ( somar_intensidade )

{

  if ( intensidade_led == 255 )

      somar_intensidade = false; /// chegou no limite superior, sinaliza decrementar

  else

    intensidade_led += 5;

}

else /// decrementando

{

  if ( intensidade_led == 0 )

    somar_intensidade = true; /// chegou no limite inferior, sinaliza incrementar

  else

    somar_intensidade -= 5;

}

analog_Write( LED_CONTROLE, intensidade_led );

delay( 250 );

}

Assim você usa a função loop() corretamente, vai ter a percepção visual da alteração na intensidade do brilho do led, e o controle dos reles vai ser quase instantâneo.

Eu não testei o código acima, escrevi ele direto aqui. Mas acho que tá certinho. O único bug que ele tem é quando os contadores atingem os limites (superior ou inferior), ao sinalizar a troca de operação aritmética o controle de intensidade não é gerenciado. Isso significa que nos limites terão dois ciclos de 250 ms com o mesmo valor. Corrigir isso fica de "lição de casa" pra você :)

Espero ter ajudado.

Meu brother eu entendi o que vc disse, muitíssimo obrigado pela dica, vou alterar aqui para fazer o teste, vlw obrigado!

for(int potpin=0; potpin<=255; potpin+=5){ //-----------------------------
Serial.println(potpin); //------------------------------------------------------------
analogWrite(LED_CONTROLE,potpin); //----------------------------------
delay(250); //--------------------------------------------------------------------------
} //-----------------------------------------------------------------------------------------
for(int potpin=255; potpin>=0; potpin-=5){ //-------------------------------
Serial.println(potpin); //-------------------------------------------------------------
analogWrite(LED_CONTROLE,potpin); //-----------------------------------
delay(250); //---------------------------------------------------------------------------
 }

static int flag=0;

if(flag == 0){

Serial.println(potpin); //------------------------------------------------------------
analogWrite(LED_CONTROLE,potpin); //----------------------------------

potpin+=5

if(potpin == 255)flag=1;

}

else{

Serial.println(potpin); //------------------------------------------------------------
analogWrite(LED_CONTROLE,potpin); //----------------------------------

potpin-=5

if(potpin == 0)flag=0;

}

delay(250); //---------------------------------------------------------------------------
 

vlw pela informação, vou estudar este codigo!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço