2016-08-30 4 views
0

나는 Arduino, 키패드 및 Servo를 사용하여 조합 잠금을 만들려고 노력하고 있지만 장애물을 발견했습니다.4x4 키패드를 사용하여 Arduino에 여러 자리 정수를 입력하는 방법은 무엇입니까?

변수에 4 자리 값을 저장하는 방법을 찾을 수 없습니다. keypad.getKey는 한 자리 만 저장할 수 있기 때문에.

인터넷에서 일부 탐색을 한 후에 포럼에서 내 문제에 대한 해결책을 찾았지만 답변에 코드 샘플이 포함되지 않았으며 인터넷에서 다른 것을 찾을 수 없었습니다.

대답은 사용자가 시간 제한을 사용하여 숫자를 입력하거나 종료 문자 (더 나은 옵션이 될 수 있음)를 사용하는 것입니다.

나는이 종결 문자와이를 구현하는 방법에 대해 더 알고 싶습니다. 또는 누군가가 더 나은 해결책을 제안 할 수 있다면 더 좋을 것입니다.

+0

인공 지능 전화 사업자 그래서 "바운드 KEY_ 다음 전화 번호를 _Enter"당신을 말할 때 그것은 동일하여 누적 value를 분할 너를 그만 두는게 뭐야? –

+0

나는 그것을하는 방법을 모른다. 그것을 설명하는 사이트를 추천 해 주시겠습니까? –

+0

간단합니다. 생각해보십시오 : getkey()를 계속 호출하여 숫자 컨테이너를 채 웁니다. 키를 얻을 때마다 그것을 확인하고, 종료 키를 누른 다음 중지하고, 그렇지 않으면 getkey()를 다시 호출하여 새 키를 얻습니다. –

답변

1

으로 저장 4 자리 값, 그것은, 당신이 좋아하는 뭔가를 할 수 keypad.getKey 반환 int를 가정 크기 (4)의 배열을 사용하는 것이 아마도 가장 쉬운 순진한 방식으로, 사전에 감사합니다 이 : int input[4] = {0};.

int input[4] = {0}; 
for (unsigned cursor = 0; cursor < 4; ++cursor) { 
    input[cursor] = keypad.getKey(); 
} 

을 당신이 사용하려는 경우 :
당신은 당신이 이런 식으로 루프의 어떤 종류의 작업을 수행 할 수 있도록 다음 키를 누를 때 쓸 필요가 배열의 어느 슬롯에 알 커서 변수가 필요합니다 문자를 종료 뭔가를 들어, 코드 변경 (우리가 F가 종료 키를 말할 수있는, 키보드는 0-9 및 AF 키가 말할 수) :

bool checkPassword() { 
    static const int expected[4] = {4,8,6,7}; // our password 
    int input[4] = {0}; 

    // Get the next 4 key presses 
    for (unsigned cursor = 0; cursor < 4; ++cursor) { 
     int key = keypad.getKey(); 

     // if F is pressed too early, then it fails 
     if (key == 15) { 
      return false; 
     } 

     // store the keypress value in our input array 
     input[cursor] = key; 
    } 

    // If the key pressed here isn't F (terminating key), it fails 
    if (keypad.getKey() != 15) 
     return false; 

    // Check if input equals expected 
    for (unsigned i = 0; i < 4; ++i) { 
     // If it doesn't, it fails 
     if (expected[i] != input[i]) { 
      return false; 
     } 
    } 

    // If we manage to get here the password is right :) 
    return true; 
} 

지금 당신은 당신의 주에 checkpassword를 기능을 사용할 수 있습니다 이 기능은 다음과 같습니다.

int main() { 
    while (true) { 
     if (checkPassword()) 
      //unlock the thing 
    } 
    return 0; 
} 

NB : 타이머 소리를 사용할 수도 있습니다. 이를 수행하는 방법은 타이머를 원하는 기간으로 설정하고 커서 변수를 0으로 재설정하는 것입니다.

(나는 결코 arduino에서 프로그래밍하지 않았으며 키패드 라이브러리에 대해 모르지만 로직 여기에 그것까지)

0

OP에 하나의 숫자가 필요하다고합니다. 일반적인 알고리즘은 입력 된 각 숫자에 대해 누적기를 10 씩 곱한 다음 입력 된 숫자를 더하는 것입니다. 이것은 키 엔트리가 ASCII이므로, 0을 빼서 '0'..'9' 대신에 0..9의 숫자를 얻는 것으로 가정합니다.

#define MAXVAL 9999 
int value = 0;         // the number accumulator 
int keyval;          // the key press 
int isnum;          // set if a digit was entered 
do { 
    keyval = getkey();       // input the key 
    isnum = (keyval >= '0' && keyval <= '9'); // is it a digit? 
    if(isnum) {         // if so... 
     value = value * 10 + keyval - '0';  // accumulate the input number 
    } 
} while(isnum && value <= MAXVAL);    // until not a digit 

당신이 백 스페이스 키가있는 경우, 당신은 단순히 10

+0

4 * 4 키보드가 아닌 경우 작동합니다 . btw 대신 키 입력 당 바이트를 사용하도록 수정하여 모든 키패드의 가능성에 액세스 할 수 있습니다. – abidon

+0

@Aureo 키보드는 질문과 관련이 없습니다. OP가 내 의견 질문에 대답했습니다. 목표는 '0..9999'범위의 단일 숫자를 입력하는 것입니다. –