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!
Tags:
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!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2023 Criado por Marcelo Rodrigues.
Ativado por