Go Down

Topic: Botões e programa (Read 344 times) previous topic - next topic

edhennemann

May 17, 2019, 02:49 am Last Edit: May 17, 2019, 03:39 am by edhennemann
Pessoal.
Sou iniciante e preciso de uma ajuda na execução de um programa.
Vou tentar explicar.
Utilizarei como componentes: 2 leds (verde  e vermelho), buzzer, tela LCD 16x2, 4 botões.

como deve funcionar o programa...
Um usuário teria em mãos 8 perguntas.
Na tela LCD deve mostrar "Responda a questão 1:"
Então ele vai pressionar o botão correspondente (alternativas A, B, C, D).
Obs: Cada resposta das 8 questões deve ser registrada previamente, tipo Q1=A, Q2=D, Q3=B...

Se o usuário responder a questão corretamente, acende o led verde e passa para a próxima pergunta, aparecendo no LCD "Responda a questão 2:"
Se responder errado, acende o led vermelho, faz um som no buzzer e passa para a próxima questão, aparecendo no LCD "Responda a questão 2:".

E assim sucessivamente até encerrar as 8 questões.

No final, o programa deve aparecer no LCD "Sua nota foi... e a nota do usuário"
OBS: Imagino que conforme ele for acertando vai somando 1 em uma lista e no final pega essa soma de acertos e multiplica por 1,25.

Agradeço qualquer ajuda.

alkuentrus

Vamos lá ver, qual é o arduino, qual é o lcd, tens i2c, ou é paralelo? Que código é que já fizeste?  Já viste alguns exemplos?

edhennemann

Possuo o arduíno Uno. LCD com i2c. Não tenho exemplos específicos.
Só vi parecidos de acionar o botão e mudar frequências no buzzer, mas nada que trocaria a pergunta no LCD ou algo do tipo.
Tentei iniciar o código, alguma coisa está dando certa, mas não cheguei a mostrar no LCD ainda.

alkuentrus

Coloca aqui o que já tens, clicando no botão código </>

edhennemann

Estou me baseando no código abaixo, mas como tenho pouco contato com programação, estou apanhando bastante.
Segue código, nele só consta 3 botões. O led acende, toca o som, mas no caso do led ele nao desliga daí...






void setup()
{
  pinMode(A0, INPUT_PULLUP);
  pinMode(8, OUTPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
}

void loop()
{
  // if button press on A0 is detected
  if (digitalRead(A0) == HIGH) {
    tone(8, 440, 100); // play tone 57 (A4 = 440 Hz)
    digitalWrite(11, HIGH);
    digitalWrite(10, LOW);
   
  }
  // if button press on A1 is detected
  if (digitalRead(A1) == HIGH) {
    tone(8, 494, 100); // play tone 59 (B4 = 494 Hz)
    digitalWrite(11, LOW);
    digitalWrite(10, HIGH); 
  }
  // if button press on A2 is detected
  if (digitalRead(A2) == HIGH) {
    tone(8, 523, 100); // play tone 60 (C5 = 523 Hz)
    digitalWrite(11, LOW);
    digitalWrite(10, HIGH);
  }
}




alkuentrus

#5
May 19, 2019, 11:51 pm Last Edit: May 19, 2019, 11:52 pm by alkuentrus
Não colocaste o código como é suposto, carregado no primeiro botão do lado esquerdo do menu. </>

O teu código está incompleto.
Code: [Select]




void setup()
{
  pinMode(9, INPUT_PULLUP);
  pinMode(8, OUTPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
}

void loop()
{
  // if button press on A0 is detected
  if (digitalRead(9) == HIGH) {
    tone(8, 440, 100); // play tone 57 (A4 = 440 Hz)
    digitalWrite(11, HIGH);
    digitalWrite(10, LOW);
   
  }
else
{
digitalWrite(11, LOW);
    digitalWrite(10, HIGH);

}
  // if button press on A1 is detected
  if (digitalRead(6) == HIGH) {
    tone(8, 494, 100); // play tone 59 (B4 = 494 Hz)
    digitalWrite(11, LOW);
    digitalWrite(10, HIGH); 
  }
else
{
digitalWrite(11, HIGH);
    digitalWrite(10, LOW);

}
  // if button press on A2 is detected
  if (digitalRead(7) == HIGH) {
    tone(8, 523, 100); // play tone 60 (C5 = 523 Hz)
    digitalWrite(11, LOW);
    digitalWrite(10, HIGH);
  }
else
{
digitalWrite(11, HIGH);
    digitalWrite(10, LOW);

}
}

alkuentrus

#6
May 19, 2019, 11:54 pm Last Edit: May 19, 2019, 11:54 pm by alkuentrus
Outra coisa, o A0, A1 e A2 são portas Analógicas de entrada, pelo que as troquei por portas digitais. Esse código que tinhas era inutil. Fiz alterações ao código que tens de analisar e ver se consegues adaptar.

edhennemann

Alterei o jeito de pensar e comecei a fazer com switch/case.
Não sei se estaria correto.
Coloquei os códigos e os comentários para ver se esclarece um pouco.
Estou simulando no tinkercad...

Code: [Select]
// Respostas corretas de cada Questão
// 1 corresponde a letra "A", 2 é "B", 3 é "C" e 4 é "D"
int Q1 = 1; // Questão 1
int Q2 = 2; // Questão 2
int Q3 = 3; // Questão 3
int Q4 = 4; // Questão 4
int Q5 = 1; // Questão 5
int Q6 = 1; // Questão 6
int Q7 = 1; // Questão 7
int Q8 = 1; // Questão 8


int ledverde = 11; // pino do led verde
int ledverm = 10;// pino do led vermelho
int buzzer = 9; // pino do buzzer
int botaoA = 8; // pino do botao referente a alternativa A
int botaoB = 7; // pino do botao referente a alternativa B
int botaoC = 6; // pino do botao referente a alternativa C
int botaoD = 5; // pino do botao referente a alternativa D
int comando;

 
void setup()
{
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, INPUT);
pinMode(7, INPUT);
pinMode(6, INPUT);
pinMode(5, INPUT);
comando=0;
}

void loop()
{
int leituraA = digitalRead(botaoA);
int leituraB = digitalRead(botaoB);
int leituraC = digitalRead(botaoC);
int leituraD = digitalRead(botaoD);

switch(comando)
{
  if (Q1=1 && leituraA == LOW) // se respostas for "A" e pressionado botao A
{
comando=1; // comando do acerto para questao 1
  }
break;
if (Q1=2 && leituraB == LOW); // se respostas for "B" e pressionado botao B
{
comando=1; // comando do acerto para questao 1
}
break;
if  (Q1=3 && leituraC == LOW); // se respostas for "C" e pressionado botao C
{
comando=1; // comando do acerto para questao 1
}
break;
if (Q1=4 && leituraD == LOW); // se respostas for "D" e pressionado botao D
{
comando=1; // comando do acerto para questao 1
}
break;
if (Q1!=1 && leituraA == LOW); // se resposta for diferente de "A" e botao A for pressionado
{
comando=2; // comando quando a resposta for errada
}
break;
if (Q1!=2 && leituraB == HIGH); // se resposta for diferente de "B" e botao B for pressionado
{
comando=2; // comando quando a resposta for errada
}
break;
if (Q1!=3 && leituraC == HIGH); // se resposta for diferente de "C" e botao C for pressionado
{
comando=2; // comando quando a resposta for errada
}
break;
if (Q1!=4 && leituraD == HIGH); // se resposta for diferente de "D" e botao D for pressionado
{
comando=2; // comando quando a resposta for errada
}
break;
 
switch (comando)
{
case 1:// quando comando = 1 (Resposta certa)
delay(1000);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
break;

case 2://quando comando = 2 (Resposta errada)
delay(1000);
tone(8, 523, 100);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
break;

}
}
}

// LEMBRANDO AINDA QUE A CADA RESPOSTA PRECISARIA MUDAR NO LCD, QUE NÃO TENHO A MÍNIMA IDEIA DE COMO FUNCIONA....

alkuentrus

Agora qual é o output que obtens?

edhennemann

Não deu certo. Coloquei essa maneira de pensar, mas não funcionou.

alkuentrus

#10
May 21, 2019, 06:01 pm Last Edit: May 21, 2019, 06:02 pm by alkuentrus
Tenho de simular o código no meu pc. Neste momento não tenho dispobilidade para ver isso. Amanhã ou depois, vou dar um jeito.

edhennemann

Acabei de fazer outro tipo de programação.
Ela está funcionando para 1 questao.
Mas nao sei como fazer para passar para uma proxima.

Sei que ficou bem longo e deve ter uma maneira mais prática de fazer, mas nao sei como.
Desta maneira, ele resolve todas as possibilidades para a Questao 1, mas nao sei passar para a Questao 2 e assim sucessivamente e calcular  a nota.

Segue:

Code: [Select]
// Respostas corretas de cada Questão

char Q1 = 'B'; // Questão 1
char Q2 = 'B'; // Questão 2
char Q3 = 'C'; // Questão 3
char Q4 = 'D'; // Questão 4
char Q5 = 'A'; // Questão 5
char Q6 = 'A'; // Questão 6
char Q7 = 'A'; // Questão 7
char Q8 = 'A'; // Questão 8


int ledverde = 11; // pino do led verde
int ledverm = 10;// pino do led vermelho
int buzzer = 9; // pino do buzzer
int botaoA = 8; // pino do botao referente a alternativa A
int botaoB = 7; // pino do botao referente a alternativa B
int botaoC = 6; // pino do botao referente a alternativa C
int botaoD = 5; // pino do botao referente a alternativa D
int acertos = 0;

 
void setup()
{
pinMode(11, OUTPUT); //define pino 11 como saída
pinMode(10, OUTPUT); //define pino 10 como saída
pinMode(9, OUTPUT); //define pino 9 como saída
pinMode(7, INPUT); //define pino 7 como entrada
pinMode(6, INPUT); //define pino 6 como entrada
pinMode(5, INPUT); //define pino 5 como entrada
pinMode(4, INPUT); //define pino 4 como entrada
}

void loop()
{
  botaoA = digitalRead(7); // recebe a leitura do botão
  if (botaoA == HIGH and Q1=='A'){ // condição
    digitalWrite(11, HIGH); // acende led verde
    digitalWrite(10, LOW); // apaga led vermelho
    delay(100); // Resposta ao botão fica ativa 100 milisegundos
    acertos=+1; // soma 1 para a lista de acertos
    digitalWrite(11, LOW); // apaga o led aceso
   
  }
    if (botaoA == HIGH and Q1!='A'){ // condição
    digitalWrite(11, LOW); // apaga led verde
    digitalWrite(10, HIGH); // acende led vermelho
    tone(9, 440, 100); // toca o som se a resposta for errada
    delay(100); // Resposta ao botão fica ativa 100 milisegundos
    digitalWrite(10, LOW); // apaga o led aceso
  }
  botaoB = digitalRead(6); // recebe a leitura do botão
  if (botaoB == HIGH && Q1=='B') { // condição
    digitalWrite(11, HIGH); // acende led verde
    digitalWrite(10, LOW); // apaga led vermelho
    delay(100); // Resposta ao botão fica ativa 100 milisegundos
    acertos=+1; // soma 1 para a lista de acertos
    digitalWrite(11, LOW); // apaga o led aceso
   
  }
      if (botaoB == HIGH and Q1!='B'){ // condição
    digitalWrite(11, LOW); // apaga led verde
    digitalWrite(10, HIGH); // acende led vermelho
    tone(9, 440, 100); // toca o som se a resposta for errada
    delay(100); // Resposta ao botão fica ativa 100 milisegundos
    digitalWrite(10, LOW); // apaga o led aceso
  }
  botaoC = digitalRead(5); // recebe a leitura do botão
  if (botaoC == HIGH && Q1=='C') { // condição
    digitalWrite(11, HIGH); // acende led verde
    digitalWrite(10, LOW); // apaga led vermelho
    delay(100); // Resposta ao botão fica ativa 100 milisegundos
    acertos=+1; // soma 1 para a lista de acertos
    digitalWrite(11, LOW); // apaga o led aceso
   
  }
      if (botaoC == HIGH and Q1!='C'){ // condição
    digitalWrite(11, LOW); // apaga led verde
    digitalWrite(10, HIGH); // acende led vermelho
    tone(9, 440, 100); // toca o som se a resposta for errada
    delay(100); // Resposta ao botão fica ativa 100 milisegundos
    digitalWrite(10, LOW); // apaga o led aceso
  }
  botaoD = digitalRead(4); // recebe a leitura do botão
  if (botaoD == HIGH && Q1=='D') { // condição
    digitalWrite(11, HIGH); // acende led verde
    digitalWrite(10, LOW); // apaga led vermelho
    delay(100); // Resposta ao botão fica ativa 100 milisegundos
    acertos=+1; // soma 1 para a lista de acertos
    digitalWrite(11, LOW); // apaga o led aceso
   
  }
      if (botaoD == HIGH and Q1!='D'){
    digitalWrite(11, LOW); // apaga led verde
    digitalWrite(10, HIGH); // acende led vermelho
    tone(9, 440, 100); // toca o som se a resposta for errada
    delay(100); // Resposta ao botão fica ativa 100 milisegundos
    digitalWrite(10, LOW); // apaga o led aceso
  }
}

alkuentrus

Eu ainda não olhei  bem para o código. Mas, se está a funcionar para a questão 1, tens de repetir todas as possiblidaddes para as outras questões. Vai ficar um comboio de código, mas para já é a única forma que tens de  fazer isso.

edhennemann

Ok, mas como tenho que mostrar no LCD, não consigo fazer o programa entender que terminou uma pergunta e é pra mostrar outra no visor.

alkuentrus

Penso que vais ter de separar as questões por funções e fazer as respectivas invocações. Senão em código "esparguete" vai ser complicado....

Go Up