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


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);  
     }
     //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
      }

   }//if(Serial.available())
}//void loop()

Exibições: 3741

Anexos

Responder esta

Respostas a este tópico

Tá complicando o código. Não precisa de tudo isso, usa um controle de estado pra saber se os leds devem piscar ou não, e outro pra saber qual led piscar.

Como os leds estão em portas sequenciais, a aritmética resolve o controle do led a piscar. E uma variável do tipo char com 3 configurações define se deve piscar sequencial, todos ou nenhum resolve o controle de piscadas.

Esse tipo de controle de estado é também conhecido como máquina de estado.

Outra coisa, usa a natureza cíclica da função loop() no projeto, não bloqueie o processamento dentro de loops na função loop().

Happy Hack

Daniel, primeiramente muito obrigado pela atenção.

você poderia me explicar como se usa controle de estado ?
sou iniciante no Arduino e estou apanhando um pouco ainda.

sobre a variavel char com 3 configurações, poderia me explicar como eu faço para piscar ou não piscar?

desde já agradeço a atenção.

Imagina o processo humano para abrir uma porta, tem 3 estados possíveis para a porta. Ela já está aberta, ela está fechada com a chave ou ela está fechada sem a chave.

Se ela já está aberta, não é necessário fazer nada.

Se ela está fechada sem a chave, é só girar a maçaneta pra abri-la.

Se ela está fechada com a chave, é necessário usar a chave e depois girar a maçaneta para abri-la.

Pra gerenciar o piscar dos leds, seria algo +/- assim:

#define LEDS_DESLIGADOS 0

#define LEDS_ACESOS 1

#define LEDS_PISCANDO 2

char led_estado = LEDS_DESLIGADOS;

... codigo ...

switch ( led_estado )

{

    case LEDS_DESLIGADOS:

        /// bloco de codigo

        break;

    case LEDS_ACESOS:

        /// bloco de codigo

        break;

    case LEDS_PISCANDO:

        /// bloco de codigo

        break;

}

Dentro da logica do programa, ao receber dados da serial, a variavel led_estado é alterada de estado, alterando automáticamente o estado operacional dos leds ;)

a sim, realmente fica mais fácil e mais limpa a programação.

mas ainda não consegui entender como fazer para os leds piscarem dentro do case até que outro estado seja escolhido, pode me ajudar com mais essa duvida?  rs

Ai você precisa de outro controle de estado, que indique o estado atual dos leds.

bool ledAceso = false;

Checando o valor atual (estado atual) dessa variável você vai saber o que tem que fazer com os leds. Quando acender os leds, moda ledAceso pra true, quando apagar muda pra false.

E por ai vai...

Happy hack

Amigo, o fonte ficaria assim então?

no Delphi, por exemplo, quando clicar no botão eu teria que mandar pelo Serial a variavel "led_ligado"?

#define led_desligado
#define led_ligado
#define led_piscando

int led_verde = 13; // led vermelho
int led_amarelo = 12; //led amarelo
int led_vermelho = 11; //led vermelho

char led_estado = led_desligado;

//BOTAO PISCAR TODAS AS LAMPADAS
switch(led_estado)
{
case led_desligado:
digitalWrite(led_verde, LOW);
digitalWrite(led_amarelo, LOW);
digitalWrite(led_vermelho, LOW);
break;

case led_ligado:
digitalWrite(led_verde, HIGH);
digitalWrite(led_amarelo, HIGH);
digitalWrite(led_vermelho, HIGH);
break;

case led_piscando:
digitalWrite(led_verde, HIGH);
digitalWrite(led_verde, LOW);
digitalWrite(led_amarelo, HIGH);
digitalWrite(led_amarelo, LOW);
digitalWrite(led_vermelho, HIGH);
digitalWrite(led_vermelho, LOW);
break;
}//switch

É quase isso. Assim você não vai visualizar os leds piscando, tá acendendo e apagando em intervalo muito pequeno de tempo.

Agora só falta gerenciar o tempo, pra gerar a percepção visual dos leds acesos/piscando.

Falta pouco :)

Happy Hack

opa, esqueci do delay  rsrs

o define eu declarei como voce disse

#define led_desligado 0
#define led_ligado 1
#define led_piscando 2

e a variavel eu declarei assim:

char led_estado = led_desligado;

o que significa o numero 0,1,2, na frente do #define ?

no case seria led_desligado mesmo invés de 0?

//BOTAO PISCAR TODAS AS LAMPADAS
switch(led_estado)
{
case 0:
digitalWrite(led_verde, LOW);
digitalWrite(led_amarelo, LOW);
digitalWrite(led_vermelho, LOW);
break;

case 1:
digitalWrite(led_verde, HIGH);
digitalWrite(led_amarelo, HIGH);
digitalWrite(led_vermelho, HIGH);
break;

case 2:
digitalWrite(led_verde, HIGH);
digitalWrite(led_verde, LOW);
delay(50);
digitalWrite(led_amarelo, HIGH);
digitalWrite(led_amarelo, LOW);
delay(50);
digitalWrite(led_vermelho, HIGH);
digitalWrite(led_vermelho, LOW);
delay(50);
break;
}//switch

É quase isso, ta cada vez mais perto.

No case 2: você está acendendo e apagando os leds imediatamente, as instruções para HIGH e LOW de cada led estão imediatamente uma após a outra. Não vai ver os leds acendendo/apagando, vao parecer apagados sempre.

fiz meio na correria aqui e acabei esquecendo dos dela entre o high e low, assim que eu chegar em casa vou testar esse código.
só para confirmar o botão do Delphi vai enviar 1 ou led_ligado?
delay*

Ainda não sou especialista no arduino (sou iniciante também) mais será que você não poderia utilizar um while dentro desse loop?

Só uma curiosidade, como você utilizou  o Delphi junto ao arduino? Ainda não li sobre esse assunto...

int VALOR_DESLIGAR = 5;
while (Serial.read() != VALOR_DESLIGAR) {

//AQUI FAZ A AÇÃO DOS LEDS PISCAREM ATÉ O DELPHI ENVIAR O COMANDO PARA PARAR

//NESTE CASO QUANDO O DELPHI ENVIAR O INT 5 O WHILE TERMINA...

}

Bom em teoria eu acho que seja isso, não testei mais qualquer coisa testo depois ^^

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço