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

Wellyngton, usar while dentro da função loop() eu acho errado, pois vai bloquear o fluxo de execução da aplicação.

A função loop() é executada a partir de um while(1), então ela é cíclica por natureza. Pra que colocar um while em uma função cíclica? Eu tento evitar esse tipo de implementação ao máximo.

Bruno, o Delphi vai enviar 1. A macro led_ligado vale 1, e só está definido no código do Arduíno. Não conheço Delphi, então não sei se existem macros lá. Se existirem, usa pois facilita a leitura do código.

Happy Hack

Daniel, boa noite, eu tentei fazer isso usando a switch mas não consegui, mas consegui dessa forma:

int led_verde = 13; // led vermelho
int led_amarelo = 12;  //led amarelo
int led_vermelho = 11;  //led vermelho
int armazena; //variavel armazena para receber serial

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

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

  if (armazena == '1') //ligar led
  {
      digitalWrite(led_verde, HIGH);
  }//if (armazena == '1')


  if (armazena == '2') //desligar led
   {
       digitalWrite(led_verde, LOW);
   }//if (armazena == '2')

  if (armazena == '3') //conectar à porta serial
  {
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);
      }//if (armazena == '3')

      if (armazena == '4') //desconectar led à porta serial
      {
       digitalWrite(led_verde, HIGH);
       delay(1000);
       digitalWrite(led_verde, LOW);
       delay(50);  
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);  
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);  
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);  
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);  
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);  
       digitalWrite(led_verde, HIGH);
       delay(50);
       digitalWrite(led_verde, LOW);
       delay(50);  
     }//if (armazena == '4')


    if(armazena == '5')  //desligar piscar led
    {
        digitalWrite(led_verde, HIGH);
        delay(50);
        digitalWrite(led_verde, 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);
    }//if(armazena == '5')
}//void loop()

se não for abusar da sua boa vontade, teria como montar para mim o switch nesse meu codigo?
pois estou tentando aqui e nao esta dando certo  rsrs

agradeço desde já

Demorei 1 dia mas não esqueci :)

Quando se aplica o conceito de maquina de estado, o programa fica dividido em duas partes (basicamente); o gerenciamento do estado e a execução do estado atual. Estuda o código, qualquer dúvida posta aqui.

Veja que a leitura do código (e consequentemente, futura manutenção) fica mais clara usando as macros constantes, a natureza cíclica da função loop() foi usada. Um único delay no final do código resolve o problema.


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

// Maquina de estado
// Definindo as macros de substituicao
// os valores correspondentes aos estados
// para facilitar a leitura do codigo
#define LEDS_DESLIGADOS          0
#define LEDS_ACESOS              1
#define LEDS_PISCA_TODOS         2
#define LEDS_PISCA_SEQUENCIAL    3

int estado = LEDS_DESLIGADOS;

// Para piscar os leds em sequencia e necessario
// saber qual o led aceso atualmente, a fim de
// apagar ele e acender o proximo
int led_pisca_atual  =  11;


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

void loop()
{
 
  /// Trabalhando com maquina de estado o
  /// programa fica dividido em partes,
  /// uma parte gerencia a maquina de estados
  /// e outra executa o estado atual
 

  ///////////////////////////////////////////////
  // Gerenciamento da maquina de estado
  if(Serial.available())

  {
       armazena = Serial.read();
       if ( armazena == 51 ) // ascii 3
         estado = LEDS_PISCA_SEQUENCIAL;
       else if (armazena == 52 ) // ascii 4
         estado = LEDS_PISCA_TODOS;
       else if ( armazena == 53 ) // ascii 5
         estado = LEDS_DESLIGADOS;
         
  }

  ///////////////////////////////////////////////
  // Execução do estado atual (em cada bloco case)
  switch( estado )
  {
    case LEDS_ACESOS:
      digitalWrite( led, HIGH );
      digitalWrite( led_amarelo, HIGH );
      digitalWrite( led_vermelho, HIGH );
      break;
      
    case LEDS_PISCA_SEQUENCIAL:
      // Deve piscar os leds 1 por vez
      // Apaga o atual, gerencia o controlador, acende o proximo
      digitalWrite( led_pisca_atual, LOW );
      led_pisca_atual++;
      if ( led_pisca_atual > 13 ) // Portas 11, 12, 13
        led_pisca_atual = 11;
        
      digitalWrite( led_pisca_atual, HIGH );
      
      break;
      
    case LEDS_PISCA_TODOS:
      // Deve acender/apagar todos os leds
      // Usa a propria porta de um dos leds
      // para saber se esta aceso/apagado
      if ( digitalRead( led ) == HIGH )
        aux = LOW;
      else
        aux = HIGH;
      
      digitalWrite( led, aux );
      digitalWrite( led_vermelho, aux );
      digitalWrite( led_amarelo, aux );
      
      break;
    case LEDS_DESLIGADOS:
      digitalWrite( led, LOW );
      digitalWrite( led_vermelho, LOW );
      digitalWrite( led_amarelo, LOW );
      
      break;
    
    
  }
 
  delay( 50 );
      
}


Happy hack

Caramba Daniel, me ajudou muito cara !
muito obrigado, consegui fazer agora e deu certinho...

mais uma vez, muito obrigado !

até breve, pois com certeza voltarei com mais duvidas rsrs

Wellyngton, boa noite.

me envie um e-mail que te passo uma video aula ensinando a conexao usando o delphi.

bruno_km4@hotmail.com

quanto ao fonte eu tentei desse jeito e não deu certo, pelo que entendi teria que ser usando o switch mesmo

mas mesmo assim, muito obrigado pela atençao

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço