Galera boa tarde!! 

Queria uma ajuda de vocês para me dar uma luz! Estou escrevendo uma sketch para o arduino na qual eu seria uma maquina de games como um quis com perguntas relacionada a Aritmética. E minha dúvida é o seguinte, como eu poderia acionar os botões sem o uso do delay? Por exemplo, no início do código eu coloquei um botão Start depois da introdução da máquina e esse botão é que inicia o game, porém estou usando um display de LCD para exibir as mensagens a usurário e preciso que as mensagens estejam sempre aparecendo na tela mais ao mesmo tempo o usuário pode apertar o botão e acionar um comando. 


Por exemplo: Exibi uma equação na tela, e tenho disponível 4 botões cada um corresponde a uma opção dessa equação, se o usuário souber a resposta rápido ele pode apertar o botão e será exibida se a resposta foi certa ou errada, se ele não responder em vamos supor 10 segundos a resposta é considerada por exemplo errada e pula para outra questão. 

Tenho um botão Start também no ínicio do programa que passa várias Strings no display antes dele poder poder ser acionado. Porem eu uso delay e isso fica muito limitado, pois só consigo acionar os botões depois que os delays terminam. 

Já utilizei a função millis() dentro de if, porém as mensagens no display passam muito rápido que é quase impossível de ser vistas! 

Não da para usar a função attachInterrupt(), pois eu preciso dessa precisão ao acionar o botão para 5 componentes(5 botões distintos). Se alguém puder me apontar uma direção, eu agradeço. rss

Vou disponibilizar um pedaço do algoritmo em bloco de notas só para vocês poderem compreender melhor o que eu estou querendo. 

obrigado amigos!!Maquina%20de%20game%20Matematica.txt

Exibições: 96

Responder esta

Respostas a este tópico

Bom dia JAAC.

(avise se não gosta que eu use suas iniciais).

veja o que pude observar de parte do seu sketch.

void inicio() {
1.........
lcd.home();
............


2........
if((millis()-delay1)>=2000){
..........


}
3..........
if((millis()-delay2)>=4500){
..............
}
4..........
if((millis()-delay3)>=7000){
.....?
}
}

entendedo a rotina inicio().
1........
rotina normal. executa toda vez que inicio() é chamada.
2.......
roda toda vez que delay1 atinge difereça de 2000.
Recarrega delay1.
3.......
roda toda vez que delay2 atinge difereça de 4500.
Recarrega delay2.
4.......
roda toda vez que delay3 atinge difereça de 7000.
Recarrega delay3.

O que ocorre é que enquanto não atinge 4500,  delay1 roda 2 vezes, e enquanto não atinge  7000, delay1 roda pelo menos 3 vezes.
Para evitar isto sugiro o uso de "flags" indicando que a rotina já rodou
1 vez na chamada da função.

RV

Sem problema meu amigo mineirinho, risos! Obrigado por ajudar, de verdade. Eu usei a flag, porém ainda não resolveu!  A terceira tela do do lcd não é mostrada no display! Ele só fica intercalando entre o primeira e o segundo, if! O que poderia ser? Já tentei troca a lógica dos if, usar "else if", porém não funciona! Preciso compreender isso pois no meu código vão haver partes em que vai aparecer muita informação e haverá cerca de 6, 7, 8 telas a serem exibidas. Se puder me salvar mais uma vez, o caminho  é esse, só está faltando algum detalhe. 


void inicio() {
unsigned long tempo= millis()-delay1;

static int flag=0;



if(tempo<3000 && flag==0){
lcd.home();
lcd.print(" Bem vindo(a) a ");
lcd.setCursor(0, 1);
lcd.print("Lanchonete Maker");
flag=1;


}

if(tempo >3000 && tempo<6000 && flag==1){
lcd.clear();
lcd.home();
lcd.print("Por favor,aperte");
lcd.setCursor(0, 1);
lcd.print("o botao START e");
flag=2;

}

if(tempo>6000 && tempo<9000 && flag==2){  // Essa última parte não aparece display! Só fica trocando as    lcd.clear();                                                                              informações entre o primeiro e o segundo "if".
lcd.home();
lcd.print("comece a jogar! ");
delay1=millis();
flag=0;
}

}

Boa tarde JAAC,

faça o seguinte teste:

A remova esta linha, (unsigned long tempo= millis()-delay1; ), de dentro da função inicio,

B em seguida declare a variável tempo como global,

C carregue a variável tempo com  millis()-delay1;, antes de chamar a função inicio.

Depois conte o resultado.

RV

Meu amigo, infelizmente isso não resolveu eu já havia tentado, porém eu consegui resolver essa questão, agora estou com outros problemas.Risoss

Você foi a única pessoa que se prontificou em me ajudar, sou muito grato por isso!! E percebi que você é uma pessoa que entende muito sobre programação. Estou fazendo um trabalho para um curso, porém tenho pouca experiência ainda com programação e ficar pesquisando e tentando milhões de vezes até acertar é algo bem complicado para mim nesse momento que não disponho de muito tempo livre. 
Você toparia em me ajudar? Se não puder não tem problema eu te agradeço muito da mesma forma, se puder até colocaria seu nome como mentor no meu TCC. rsss

Se puder me passa um contato que eu te explico o meu projeto e aonde tenho algumas dúvidas. Forte abraço. 

BomdiaJ2AC,

onde estou não consigo testar nada, só escrever.

Qdo eu puder testar te aviso.

RV

RSS

Destaques

Registre-se no
Lab de Garagem
Clicando aqui

Convide um
amigo para fazer
parte

curso gratis de arduino

© 2020   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço