Função loop dentro do void loop()

Bom dia pessoal, estou começando agora no arduino e logo de cara estou com um problema/duvida. fiz um programinha simples em Delphi para se conectar ao arduino (Arduino UNO) e fiz um botao que quando clicado pisca 3 led alternadamente (pin 13, 12, 11), porem queria que ele ficasse executando essa sequencia até ser pressionado outro botao no delphi, a conexão com o Delphi já esta tudo certa, testei e esta funcionando corretamente, só não estou conseguindo colocar essa função em loop até que seja pressionado outro botão.

poderiam me dar uma mão? para ficar mais claro vou postar o fonte do arduino e vou colocar em negrito a função que estou querendo deixar em "loop"

desde já agradeço a atenção de você, estou fascinado pelo Arduino hehe

[size=8pt]
int led = 13;
int led_amarelo = 12;
int led_vermelho = 11;
int armazena;
int aux;

void setup()
{
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  pinMode(led_amarelo, OUTPUT);
  pinMode(led_vermelho, OUTPUT);
}

void loop()
{
  if(Serial.available())
  {
      armazena = Serial.read();
          
     //BOTAO CONECTAR
      if (armazena == 51) //51 = 3
      {
        digitalWrite(led, HIGH);
        delay(50);
        digitalWrite(led, LOW);
        delay(50);
        digitalWrite(led, HIGH);
        delay(50);
        digitalWrite(led, LOW);
        delay(50);
        digitalWrite(led, HIGH);
        delay(50);
        digitalWrite(led, LOW);
        delay(50);
        digitalWrite(led, HIGH);
        delay(50);
        digitalWrite(led, LOW);
        delay(50);
        digitalWrite(led, HIGH);
        delay(50);
        digitalWrite(led, LOW);
        delay(50);
        digitalWrite(led, HIGH);
        delay(50);
        digitalWrite(led, LOW);
        delay(50);
        digitalWrite(led, HIGH);
        delay(50);
        digitalWrite(led, LOW);
        delay(50);
        digitalWrite(led, HIGH);
        delay(50);
        digitalWrite(led, LOW);
        delay(50);
        digitalWrite(led, HIGH);
        delay(50);
        digitalWrite(led, LOW);
        delay(50);
      }
      
      //BOTAO DESCONECTAR
      if (armazena == 52) //52 = 4
      {
       digitalWrite(led, HIGH);
       delay(1000);
       digitalWrite(led, LOW);
       delay(50);  
       digitalWrite(led, HIGH);
       delay(50);
       digitalWrite(led, LOW);
       delay(50);  
       digitalWrite(led, HIGH);
       delay(50);
       digitalWrite(led, LOW);
       delay(50);  
       digitalWrite(led, HIGH);
       delay(50);
       digitalWrite(led, LOW);
       delay(50);  
       digitalWrite(led, HIGH);
       delay(50);
       digitalWrite(led, LOW);
       delay(50);  
       digitalWrite(led, HIGH);
       delay(50);
       digitalWrite(led, LOW);
       delay(50);  
       digitalWrite(led, HIGH);
       delay(50);
       digitalWrite(led, LOW);
       delay(50);  
     }
     [b]//BOTAO PISCAR TODAS AS LAMPADAS
     if (armazena == 53) //53 = 5
     {
           [u][color=red]//como piscar todas as lampadas até ser clicado outro botão no delphi[/color][/u]
           digitalWrite(led, HIGH);
           delay(50);
           digitalWrite(led, LOW);
           delay(50);
           digitalWrite(led_amarelo, HIGH);
           delay(50);
           digitalWrite(led_amarelo, LOW);
           delay(50);
           digitalWrite(led_vermelho, HIGH);
           delay(50);
           digitalWrite(led_vermelho, LOW);
           delay(50);
      } 
     
      //BOTAO DESLIGAR TODAS AS LAMPADAS
      if (armazena == 54) //54 = 6
      {
              [u][color=red]// como desligar o "PISCAR TODAS AS LAMPADAS" utilizando outro botao no delphi[/color][/u]
      }[/b]
   }//if(Serial.available())
}//void loop()[/size]

Referes-te a um ciclo while?

Esses delays todos nao sao boa pratica...

poderia me indicar um jeito para não utilizar tantos delay?

Esta secção do fórum é uma desgraça! Ninguém quer saber das regras para nada. Não vou ler esse “código” enquanto não estiver em condições. Para já vou reportar à moderação o post como spam para que seja apagado.

para o estressadinho, alterei o post para que fique agradável aos seus olhos.

como eu tenho um pouco mais de respeito do que você não vou pronunciar o que de fato seria apropriado. e reporte à moderação, e aproveita e peça para me banir.

usuário de merda!

para o estressadinho, alterei o post para que fique agradável aos seus olhos.

como eu tenho um pouco mais de respeito do que você não vou pronunciar o que de fato seria apropriado. e reporte à moderação, e aproveita e peça para me banir.

usuário de merda!

bruno_km4 penso que nao necessitavas de entrar a pé juntos para responderes à critica que o colega LuisSilva te fez. Ele tem razao, ninguem lê e apesar do teu post ser percetivel do meu ponto de vista devias ter apenas formatado o codigo ... Ok nao o fizeste, nao considero que isso fosse ultra grave para te banir o post ... Nota que o LuisSilva é um bom membro deste forum e nota-se que ele dedica o seu tempo a ajudar outros sem nada em troca, como tal ele é digno de mais respeito.Eu estava mesmo agora a responder a tua questao, quando o submeti vi que deste esta resposta... Agora devo concordar que sim deves ser banido ja que tu foste duplamente um mau user ... Eu nao te ia atirar a "pedra" pelo teu post mal formatado mas agora atiro... Errar é humano mas ter humildade é algo que só alguns têm ...

O pior não é o post ou a falta de code tags... O pior é que o "ambiente" desta secção do fórum nos últimos tempos (ultimas duas semanas +/-) tem descido bastante. Para piorar isto (e é um sentimento que tenho há bastante tempo) é o facto de sentir que esta secção tem falta de moderação. Na maior parte do tempo não havia necessidade porque o pessoal comportava-se relativamente bem, mas ultimamente, como referi, isso não tem acontecido e tem que ser reprimido para que isto não seja um caos.

Se calhar para um lapso deste género o comentário foi severo (consigo concordar até certo ponto), no entanto é o acumular de lapsos deste género que causam o comentário... Ninguém se dá ao trabalho de ler as regras, de explicar as questões de forma a que quem quer ajudar as perceba, no fundo de se esforçar um pouco para ser ajudado.

O "report" ao moderador, não implica a exclusão do fórum (até porque acho que para um utilizador novato, não adianta grande coisa uma vez que pode criar outra conta e fazer novamente a mesma pergunta), mas no caso mais severo, implica a eliminação do post com o comportamento menos adequado. Embora, como referi, o primeiro post não fosse caso para isso, o segundo penso que já é um caso bastante grave.

@HugoPT: replicar uma palavra dessas, penso que também não é adequado, podia ter eliminado a palavra em causa.

Resumindo: 1- Não custa nada ler as regras, mesmo para quem não sabe inglês, "olhando para as imagens" já se tem uma ideia do que se pede:

2- As regras estão em lugar de destaque nesta secção (primeiro post e "colado"), por alguma coisa será;

3- Se calhar está na hora de arranjar outro "passatempo", em vez de vir para aqui tentar ajudar quem não quer ou não merece ser ajudado.

Já agora, também "reportei" o segundo post ao moderador, mas como duvido que os moderadores percebam português, não deve haver problema.

Em relação à questão, não gosto de ver (mas é uma questão de gosto pessoal) estas linhas:

      if (armazena == 51) //51 = 3
      (...)
      if (armazena == 52) //52 = 4
      (...)

Eu prefiro usar:

      if (armazena == '3') 
      (...)
      if (armazena == '4') 
      (...)

faz exactamente o mesmo efeito, mas percebe-se muito melhor (e mais rapidamente) o que faz a linha em causa (ou a comparação se quiser). Se quiser, no limite, pode usar-se o número em hexadecimal (que para quem tem alguma prática também faz sentido, sem ter que estar a fazer um grande esforço, e sem precisar de comentário, do que está a ser feito na comparação):

      if (armazena == 0x33) //0x33 = '3'
      (...)
      if (armazena == 0x34) //0x34 = '4'
      (...)

Por exemplo, como já não fazia isto há algum tempo tive que ir ver quais eram os valores. Usei a primeira tabela ASCII que o google me devolveu: http://www.asciitable.com/

Isto também não responde à questão, mas são boas práticas. (não é necessário "ter um dicionário à mão", nem o código cheio de comentários, para perceber o que ele faz, o código deve ser intuitivo).

No caso do seu programa, e visto ser um programa extremamente simples, penso que basta retirar as comparações de dentro do if do Serial.available, para que seja repetido até que um novo comando (ou armazena, como lhe chama no seu código) chegue através da porta série:

int led = 13;
int led_amarelo = 12;
int led_vermelho = 11;
int armazena;
int aux;

void setup()
{
  Serial.begin(9600);
  pinMode(led, OUTPUT);
  pinMode(led_amarelo, OUTPUT);
  pinMode(led_vermelho, OUTPUT);
}

void loop()
{
  if (Serial.available())
  {
    armazena = Serial.read();
  }//if(Serial.available())

  //BOTAO CONECTAR
  if (armazena == 51) //51 = 3
  {
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
  }

  //BOTAO DESCONECTAR
  if (armazena == 52) //52 = 4
  {
    digitalWrite(led, HIGH);
    delay(1000);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
  }
  //BOTAO PISCAR TODAS AS LAMPADAS
  if (armazena == 53) //53 = 5
  {
    //como piscar todas as lampadas até ser clicado outro botão no delphi
    digitalWrite(led, HIGH);
    delay(50);
    digitalWrite(led, LOW);
    delay(50);
    digitalWrite(led_amarelo, HIGH);
    delay(50);
    digitalWrite(led_amarelo, LOW);
    delay(50);
    digitalWrite(led_vermelho, HIGH);
    delay(50);
    digitalWrite(led_vermelho, LOW);
    delay(50);
  }

  //BOTAO DESLIGAR TODAS AS LAMPADAS
  if (armazena == 54) //54 = 6
  {
    // como desligar o "PISCAR TODAS AS LAMPADAS" utilizando outro botao no delphi
  }

}//void loop()

Outro conselho: Não use os negritos e cores no código! Os comentários devem fazer esse efeito. Se algum for deixado para trás o código não vai compilar, e vai perder tempo à procura do erro, sem necessidade nenhuma.

Nós moderadores têm acesso ao Google Translate, apesar de que pode dar traduções infelizes de termos técnicos.

Traduz Google reconhece palavrões e, portanto, eu aconselho membros de todas as partes do fórum para comportar corretamente.

(via Google Translate)

Eu nao sou tao bom como o Luis...

A minha ajuda fica para quem a merece.