Go Down

Topic: Ler dois números ou mais no Keypad (Read 2795 times) previous topic - next topic

engandrade

Boa tarde galera,
Estou trabalhando em um código que precisa receber valores na casa de centenas, dezenas e unidades (ex: 134, 3, 56...), apos o usuário inserir os valores, gostaria que os valores apenas entrasse na lógica, após pressionar um botão ENTER.
A minha dúvida inicial está em como poderia ler mais de um numero pelo Keypad, hoje eu só consigo ler unidade.
A segunda dúvida, é como poderia implementar essa função de ENTER em um determinado botão do Keypad, para enviar os números para a lógica seguinte?
Sou grato pela ajuda.
Obrigado

luisilva

Parece-me que isto:
http://forum.arduino.cc/index.php?topic=253306.msg1810882#msg1810882

responde à sua questão, certo?

engandrade

Olá luissilva, parece que é esta a lógica. Vou testar aqui, e posto o resultado. Apenas outra pergunta, quando entrar no estado do usuário colocar os números, o programa deverá aguardar a entrada dos números via while? Por exemplo:

while(! NO_KEY)?

Obrigado

engandrade

Luis, no meu programa, a parte para o usuário inserir os números, estão fora do void loop. Esta numa parte da programação chamada void enroll (crie este void para facilitar a programação). O efeito para aguardar o usuário digitar, seria o mesmo, no void loop? Ou preciso remanejar meu código para o void loop?

luisilva

Porque é que não mostra o código? Seria bastante mais fácil esta conversa se conhecesse o código.

engandrade

Luis, desculpe-me não postar antes. Estava com dificuldades para uso da internet.

Eu consegui fazer o que queria, com base na sua informação, segue o que fiz:

Code: [Select]

void loop()                     // run over and over again
{
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.println("Enroll/Verify?  ");
  while(true) { 
   
    customKey = customKeypad.getKey();
   
     if (customKey == '#'){ //verifica sé é um digito ASCII, chama variavel C que foi digitado no teclado
     
      lcd.clear();
     
      verify();
    }
    else if(customKey == '*'){
      estado = true;

  lcd.clear();     
  lcd.setCursor(0,0);
  lcd.print("Digite o ID:        ");

 
 
  while(customKey = 2)
  {
      customKey = customKeypad.getKey();
     
      if(customKey >= '0' && customKey <= '9') {
        value = value * 10 + customKey - '0';
       
      lcd.setCursor(12,0);
      lcd.print(value);
      delay(200);
      }
      if(customKey == '#'){
      id = value;
      enroll();
      value = 0;
      }
   
   }   
  }     

}
void enroll()
{
{
  Serial.end();
  Serial.begin(9600);
}


  //lcd.clear();
 

   
 
  if (id == (pin = EEPROM.read(id))) // Verifica se o ID digitado esta na E2PROM
  {
    lcd.clear();
    lcd.print(" #ID cadastrado   ");
    lcd.setCursor(7,1);
    lcd.print(id);
   
    delay(2000);
    uint8_t id = 0;
    customKey = 0;
    loop();
  }
  else if(id != EEPROM.read(id))
  {
  }
 
  lcd.clear();
  lcd.print("Cadastrando ID#:     ");
 
 
  //delay(1000);
 
  lcd.setCursor(0,1);
  lcd.print(id);

  delay(2500);
 

 
  while (!  getFingerprintEnroll(id) );
 
 
}


O código segue ainda, para outras etapas. A dúvida que surgiu em cima do código acima, é de limitar para apenas 3 digitos, ex: 234, 546, 988..Hoje sei que ele digita valores até 32mil e alguma coisa, após este valor ele fica aleatório.

Code: [Select]

[b]while(customKey = 3) [/b] //Tenho dúvida neste ponto, se com o While, consigo fazer ele limitar para 3 dígitos.
  {
      customKey = customKeypad.getKey();
     
      if(customKey >= '0' && customKey <= '9') {
        value = value * 10 + customKey - '0';
       
      lcd.setCursor(7,1);
      lcd.print(value);
      client.print(value);
      delay(200);
      }
      if(customKey == '#'){
      id = value;
      enroll();
      value = 0;
      }
      if(customKey == '*'){
        loop();
      }
   
   }   
  }     

luisilva

Isso que descreve pode ser feito de várias formas. Se faz com um while, então devia retirar:
Code: [Select]

      if(customKey == '#'){
      id = value;
      enroll();
      value = 0;
      }


e quando sai do while verifica logo (sem ser necessário premir o ' # ').

Em relação ao seu while, não gosto muito.

Code: [Select]
while(customKey = 3)

esta linha faz "repetir enquanto (while=enquanto), a tecla for igual a 3?". Não faz nenhum sentido. Para além disso nesta linguagem de programação, a comparação de igualdade é feita com dois sinais de igual '==', apenas um sinal é usado para outra coisa.

O que devia fazer era, criar outra variável que fosse incrementada quando o utilizador prime uma tecla numérica, e repetir o cíclo, enquanto o utilizador não premir pelo menos 3 teclas.

Veja se consegue fazer isto, se não conseguir diga qualquer coisa.

engandrade

Desculpe-me a demora meu caro.

A questão do While, é para limitar o usuário a digitar no Keypad, até 3 números..Ou digita 2, ou digita 47, ou digita 874, por exemplo. Ainda preciso do '#' como Enter, para enviar o comando void enroll.

Ainda estou lutando para deixar rodando como comentado acima.

Mas vou conseguir  :D

Vou implementar e qualquer dúvida posto aqui. Eu tenho outro dúvida, um pouco mais complexa, o meu projeto envolve Sensor de Impressão Digital, e estou bem no desenvolvimento. Porém, eu gostaria de algo que pudesse interfacear com o usuário, além do Keypad e Display LCD 16x2. Imagino poder jogar os IDs cadastrados, em um banco de dados (MySQL) e posteriormente, adicionar a uma lista negra (lista de exceções) os IDs que não poderão validar sua impressão digital. Hoje possuo o Ethernet Shield W5100, ainda não realizei nenhuma conexão via MySQL.

Você acha que para esta finalidade, o melhor caminho seria este que falei acima? Estou aberto a idéias e opiniões para melhora deste projeto. (Projeto do meu TCC - Engenharia Eletrônica).


Igorts

boa tarde, sera q alguem consegue me ajudar
preciso fazer um codigo q fique variando de 70 a 170v subindo e descendo
alguem tem alguma ideia
obrigado

Carlos0810

Olá, meu nome é Carlos, um estudante do ensino médio, tenho 17 anos de nacionalidade colombiana, estou estudando na escola Nuestra Señora de la Candelaria no município de Planeta Rica / Córdoba, eu precedente neste grupo por razões de trabalho escolar, Tenho hobbies jogando vôlei e desenho, obrigado pela atenção.

Go Up