Loop dentro de if

Como eu faria pra criar um loop dentro do if?

Ao apertar o botão, o led piscaria infinitamente.

Alguém me ensina?

Pergunto com base nesse vídeo do canal GV Ensino: https://youtu.be/2yCzSsq0YDo

Tentando me expressar de forma leiga:

Se botão apertado
_____Pisca led infinitamente

1 curtida

Pelo que entendi oque você deseja é que o led fique piscando indefinidamente até que você solte o botão, se for só isso mesmo é só você adicionar um delay(1000); na ultima linha.
Fica algo assim:
digitalWrite(2, HIGH);
delay(500);
digitalWrite(2, LOW);
delay(500);

Leandro, na verdade não.

Quero apertar uma vez, soltar e deixar ele piscando indefinidamente, mesmo depois que o botão esteja solto.

Como vai Luciano, tudo bem?

Sabe que sua questão me fez pensar numa aula??? Fazer isso é a base para muitas outras coisas na programação! Farei uma aula sobre isso em breve!

A solução mais simples pra fazer isso que você quer é através de uma variável. Funcionaria assim: ao apertar o botão, você muda o valor de uma variável. E ai, em outro if, você checa: se a variável estiver com esse valor, pisca o led. Dessa forma, a piscada do led fica condicionada ao valor da variável, não ao estado do botão!

Um exemplo seria:

int var=0; //nossa variável de controle

void setup(){
    pinMode(2,OUTPUT); //pino do LED
    pinMode(3,INPUT); //pino do BOTÃO
}

void loop(){
    if (digitalRead(3)){ //se botão for pressionado, coloca variável pra 1
        var=1;
    }

    if (var==1){
        digitalWrite(2,HIGH);
        delay(500);
        digitalWrite(2,LOW);
        delay(500);
    }
}

Espero que seja útil!

Aproveitando professor, se na aula puder incluir mais uma função no botão, que seria parar de piscar, ou seja, aperta uma vez, ele fica piscando, apertando uma segunda vez ele para.

2 curtidas

Excelente. Eu sou iniciante.

Eu não consigo entender por que essa linha de baixo significa que o botão estaria pressionado.

if (digitalRead(3))

Eu sei que ela está comentada, mas não consigo enxergar onde essa linha fala que eu pressione o botão. Não faltou um HIGH, um 1, algo assim?

Algo no seguinte sentido: se a variável é ímpar, pisque indefinidamente. Se a variável é par, pare de piscar.

Olá Luciano! Quando se deseja comparar se algo é igual a HIGH ou igual a 1, não precisa colocar nada. Assim:

if (digitalRead(2)==1)

é a mesma coisa que:

if (digitalRead(2))

No mais, verei se consigo gravar essa semana esta aula. Assim que fizer, posto ela aqui!
Abraços, fiquem com Deus!

2 curtidas

Professor, não esquece da gente.

1 curtida

Verdade, estou em dívida com vocês! Assim que tiver um tempo gravo esta aula. Através desse tópico pensei em 3 vídeos:

  1. Pisca-Pisca sem delay (usando comando millis());
  2. Ao apertar botão, led pisca indefinidamente (com millis); outro botão apaga.
  3. Ao apertar botão, led pisca indefinidamente (com delay); outro botão apaga.

Se conseguir um tempo hoje a noite, gravo hoje e já disponibilizo amanhã ou depois - ao menos o primeiro vídeo.

1 curtida

aproveitando o embalo, como ele faria pra o led ficar piscando infinitamente e o programa continuar com outras funções? inclusive outros “if” e reset. ou seja teria que ser algo externo!?..

1 curtida

Professor, a aula saiu e eu perdi? Ou não foi possível?

E se possível: seguindo essa mesma linha de raciocínio, como fazer o led parar? É possível criar algo do tipo: se a variável é 1 e botão for apertado, a variável recebe 0?

Ainda não fiz a aula Luciano!
Ontem gravei uma sobre millis. Se ficar boa depois da edição, devo postar nos próximos dias. Usando millis dá pra resolver esse problema!

Aula sobre millis finalmente publicada - depois de precisar regravar.

Sabendo usar o millis, dá pra fazer qualquer lógica como a que falamos aqui!

Segue o vídeo:

1 curtida