Go Down

Topic: Keypad - Exit loop with key press (Read 2191 times) previous topic - next topic

Bastler

Hi all,

how can I exit a while loop with the press of a button on the keypad?
Here is a sample of what I want to do. This snippet is mainly the EventKeypad example from the keypad library.

Code: [Select]
#include <Keypad.h>

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

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
byte ledPin = 13;

boolean blink = false;

void setup(){
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
  digitalWrite(ledPin, HIGH);   // sets the LED on
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
}
 
void loop(){
  char key = keypad.getKey();
 
  if (key != NO_KEY) {
    Serial.println(key);
  }
 
}

//take care of some special events
void keypadEvent(KeypadEvent key){
  switch (keypad.getState()){
    case PRESSED:
      switch (key){
        case '#': some_function(); break; // enter the function with "#"
      }
    break;

  }
}

// function
void some_function() {

byte stay_in_loop = 1;

while (stay_in_loop) {
// set some parameters and exit the loop when all is set.
// Question: How to exit the loop with button press?
// Buttons are not processed during this loop...
if (key_star) {
stay_in_loop = 0;
}
}

}


So what I basically want to do, is to enter a loop with the press of a button. In this loop I have to set some parameters. The program must stay in this loop until all the parameters are set. Then I want to leave the loop and continue the program execution.
The problem is, that I cannot access the keypad in the loop.

Any ideas how I can solve this problem?

Thanks,
Harry

Aeturnalus

Use a state machine:

Note: code below is untested and guaranteed.
Code: [Select]

#include <Keypad.h>

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

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
byte ledPin = 13;

boolean blink = false;

enum state {WAITING, LOOPING} current_state = WAITING;

void setup(){
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);      // sets the digital pin as output
  digitalWrite(ledPin, HIGH);   // sets the LED on
  keypad.addEventListener(keypadEvent); //add an event listener for this keypad
}
 
void loop(){
  char key = keypad.getKey();
 
  if (key != NO_KEY) {
    Serial.println(key);
  }
 
  switch(current_state) {
  case WAITING:
  // outside of loop, do nothing
    break;
  case LOOPING:
  // set some parameters.  this set of code will be processed until no longer
  // LOOPING, as set by the keyPadEvent.
    break;
  }   
}

//take care of some special events
void keypadEvent(KeypadEvent key){
  switch (keypad.getState()){
    case PRESSED:
      switch (key){
        case '#': current_state = LOOPING; break; // enter the function with "#"
        case EXITKEY: current_state = WAITING; break; // exit the function with EXITKEY
      }
    break;

  }
}

Bastler



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