Go Down

Topic: Keypad - Multiple Value Read [resolved] (Read 762 times) previous topic - next topic

gnusso

Apr 15, 2012, 12:45 pm Last Edit: Apr 18, 2012, 12:01 pm by gnusso Reason: 1
Good Morning, I'm trying to using keypad and then read a multiple value ... in the specific cases I'd like to press '*' blink 2 times the led and then read the second one value for example one ... and then put everything inside a variable and print it on serial ... due the fact Im not able to say to the keypad for the second charachter after blink 2 times ... wait at max un second if the user I press key read the keypad read a key otherwise go on ... below the code ... is there someone that can help me ? thanks Andrea

Code: [Select]

#include <Keypad.h>

const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
 {'1','2','3'},
 {'4','5','6'},
 {'7','8','9'},
 {'*','0','#'}
};
byte rowPins[ROWS] = {8, 7, 6, 5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {4, 3, 2}; //connect to the column pinouts of the keypad

Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

void setup(){
 Serial.begin(9600);
 pinMode(13, OUTPUT);
 digitalWrite(13,LOW);
}
 
void loop(){
 char customKey = customKeypad.getKey();
 char customKey2;
 char testo[1];
 if (customKey != NO_KEY)
   {
   if (customKey = '*')
     {
      int a = 1;
      int cont = 3;
      asled(a,cont);
      customKey2 = customKeypad.getKey();
      a = 1;
      cont = 4;
      asled(a,cont);
      testo[0] = customKey;
      testo[1] = customKey2;
     }  
   Serial.println(testo);
   
   }
}

void asled(int a,int cont)
{
 for (a = 1; a < cont; a++)
   {
    digitalWrite(13, HIGH);
    delay(150);
    digitalWrite(13, LOW);
    delay(150);
   }
 
}

robtillaart


to read multiple keys can imply that you need a keybuffer.
Add a timer (millis based) that checks the duration between keypresses and if too long wipe the buffer.

char testo[1];  is an array of length 1 so only index 0 is valid and you use index 1 too , will overwrite something in memory.

some code idea how to do the wiping and buffering
Code: [Select]


char buffer[10];
int index = 0;
unsigned long lastKey = 0;

void loop()
{
  // read a key
  char key = customKeypad.getKey();
  if (key != NO_KEY)
  {
    buffer[index++] = key;
    buffer[index] = '\0'; // keep string correctly terminated ;
    lastKey = millis();
  }

  // test wipe time
  if ((millis() - 2000 > lastKey) || index == 9) // after 2 seconds or buffer full
  {
    clearBuffer();
  }


  if (buffer[0] == '*' && strlen(buffer)>1)
  {
    switch(buffer[1])
    {
    case '0' :
      asled(10);
      break;
    case '1' :
      asled(20);
      break;
    default :
      asled(5);
      break;
    }
  }

  if (buffer[0] == '#' && strlen(buffer)>1)
  {
    switch(buffer[1])
    {
    case '0' : Serial.println("Hello ");
      break;
    case '1' : Serial.println("Goodbye ");
      break;
    default :
      asled(5);
      break;
    }
  }

  Serial.println(buffer);
}

void clearBuffer()
{
    index = 0;
    buffer[index] = '\0';
}

void asled(int cont)
{
  for (int a = 0; a < cont; a++)
    {
     digitalWrite(13, HIGH);
     delay(150);
     digitalWrite(13, LOW);
     delay(150);
    }
}

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

gnusso

#2
Apr 16, 2012, 09:23 am Last Edit: Apr 18, 2012, 12:03 pm by gnusso Reason: 1
Ciao, it's a very good idea :-) I will try and then I'll let you know :-) ,

Perfect, it's work

I've added also end command :-) thanks


warms regards,
Andrea

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy