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