중급 예제

약간은 익숙하시거나 익숙해지셨나요? 그렇다면 조금더 깊이 다뤄볼까요?

키패드 x LED-비밀번호 만들기

2014-08-01 17:13:14

개요

최근 집 현관문에 열쇠를 대신해서 비밀번호를 사용하여 문을 잠그는 도어락이 많이 사용되고 있습니다.

이런 도어락 안에는 키패드가 있어서 키패드를 통해 비밀번호를 입력 받습니다.

이외에도 키패드는 사람들이 사용하기 쉽기 때문에 여러가지 방법으로 사용되고 있습니다.


사진 출처 : http://hiyu76.tistory.com/69


이 컨텐츠에서는 키패드를 사용하여 비밀번호가 맞을시 녹색 LED를 틀렸을 시 빨간 LED를 켜는 잠금장치를 만들어 보겠습니다.

 

 

 

미리 보기 동영상

 

 

 

 

 

부품목록

NO 부품명 수 량 상세설명
1 오렌지보드 1 아두이노
2 5mm Red LED 1 LED
3 5mm Green LED 1 LED
4 330Ω 저항 2 저항
5 4 X 4 키패드 1 Keypad
6 브레드보드 1 브레드보드
7 점퍼케이블 11 점퍼케이블

 

 

 

부품명
오렌지보드
5mm Red LED
5mm Green LED
330Ω 저항
4x4 키패드
브레드보드
점퍼케이블
파 트
 

 

 

 

하드웨어 making

회로도

 

 

브레드보드 레이아웃

 

 

소프트웨어 coding

 
#include <Keypad.h>  // Keypad.h 라이브러리를 호출합니다.

char* secretCode = "1234";  // 비밀번호를 설정(여기선 1234)
int position = 0; 
int wrong = 0;
// 비밀번호 비교시 쓸 변수 선언(맞는 경우와 틀린경우 2가지)

const byte rows = 4;
const byte cols = 4;
// 키패드의 행, 열의 갯수

char keys[rows][cols] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
// 키패드 버튼 위치 설정

byte rowPins[rows] = {8, 7, 6, 5};
byte colPins[cols] = {4, 3, 2, 1};
// 키패드에 연결된 핀번호 설정(데이터 시트 참고)

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
// 키패드 오브젝트 생성

int redPin = 13;
int greenPin = 12;
// LED 2개의 핀번호 설정

void setup(){
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  setLocked(true); 
}
// 2개의 LED를 세팅해주고, 잠금상태를 기본으로 세팅해 줍니다.


void loop(){
  char key = keypad.getKey(); // 키패드에서 입력된 값을 가져옵니다.
  
  if((key >= '0' && key <= '9') || (key >= 'A' && key <='D')
    || (key == '*' || key == '#')){
  // 키패드에서 입력된 값을 조사하여 맞게 입력된 값일 경우(키패드에 있는 버튼이 맞을경우) 비교

    if(key == '*' || key == '#'){ // *, # 버튼을 눌렀을 경우
      position = 0; 
      wrong = 0; // 입력 초기화
      setLocked(true); // 잠금상태로 세팅
    } 
 
    else if(key == secretCode[position]){ // 해당 자리에 맞는 비밀번호가 입력됬을 경우
      position++; // 다음 자리로 넘어 감
      wrong = 0; // 비밀번호 오류 값을 0으로 만듬
    }
    
    else if(key != secretCode[position]){ // 해당 자리에 맞지 않는 비밀번호가 입력됬을 경우
      position = 0; // 비밀번호를 맞았을 경우를 0으로 만듬
      setLocked(true); // 잠금상태로 세팅
      wrong++; // 비밀번호 오류 값을 늘려준다
    }
  
    if(position == 4){ // 4자리 비밀번호가 모두 맞았을 경우
      setLocked(false); // 잠금상태를 해제 함
    }
    
    if(wrong == 4){ // 비밀번호 오류를 4번 했을 경우
      blink(); // Red LED를 깜빡여 준다.
      wrong = 0; // 비밀번호 오류 값을 0으로 만들어 준다.
    }
  }
  delay(100);
}

void setLocked(int locked){ // 잠금시와 해제시에 맞는 LED를 세팅해 주는 함수
  if(locked) { // 잠금시 Red LED를 켜주고, Green LED를 꺼준다.
  digitalWrite(redPin, HIGH);
  digitalWrite(greenPin, LOW); 
  }

  else{ // 해제시 Red LED를 꺼주고, Green LED를 켜준다.
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, HIGH);
  } 
}

void blink(){ // 비밀번호 4번 오류시 Red LED를 깜빡여 주는 함수.
  for(int i = 0; i < 8; i++){ // 딜레이 만큼 Red LED를 껐다 켰다 해준다. 총 8회
    digitalWrite(redPin, LOW);
    delay(500);
    digitalWrite(redPin, HIGH);
    delay(500);
  }
}


// 출처 : 33가지 프로젝트로 배우는 아두이노(저자 : 사이먼 몽크)

 

소프트웨어 설명

 * 이 코드는 스케치를 사용하여 작성 / 업로드 합니다. 스케치에 대한 사용법은 링크를 참고하시기 바랍니다.

 

#include <Keypad.h>  // Keypad.h 라이브러리를 호출합니다.

 

이 라이브러리를 사용하지 않아도 여러번 돌려서 각 출력핀 마다 어떤 키가 눌렸는지 확인 하면서 프로그램을 작성해도 되긴 하지만, 정확도가 낮고 복잡하기 때문에 라이브러리를 사용합니다.

이 라이브러리는 www.arduino.cc/playground/Code/Keypad 사이트에서 다운로드 받을 수 있습니다.(참고로 라이브러리에 대한 설명과 함수들도 정의 되어 있으니 봐두시는면 좋습니다.)
(라이브러리를 사용하지 않았을 경우 이 소스는 컴파일이 되지 않습니다.)
 

char* secretCode = "1234";  // 비밀번호를 설정(여기선 1234)
int position = 0; 
int wrong = 0;
// 비밀번호 비교시 쓸 변수 선언(맞는 경우와 틀린경우 2가지)

const byte rows = 4;
const byte cols = 4;
// 키패드의 행, 열의 갯수

char keys[rows][cols] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
// 키패드 버튼 위치 설정

byte rowPins[rows] = {8, 7, 6, 5};
byte colPins[cols] = {4, 3, 2, 1};
// 키패드에 연결된 핀번호 설정(데이터 시트 참고)

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);
// 키패드 오브젝트 생성

int redPin = 13;
int greenPin = 12;
// LED 2개의 핀번호 설정

비밀번호를 설정하고(secretCode, 여기서는 1234로 했습니다.) 비밀번호 비교시 필요한 변수 2개를 설정합니다.(비밀번호가 맞는 경우와 틀린 경우)

아두이노에 연결된 LED 핀(12,13번)과 키패드(행,열의 갯수(rows, cols), 배치된 버튼의 위치(keys[][]), 연결된 핀의 번호(rowPins[], colPins[]))를 정의 하여 라이브러리에 있는 함수를 사용하여 키패드 오브젝트를 만듭니다.

* 키패드의 종류에 따라 위에 변수들을 조절해서 키패드의 버튼 구조와 행, 열의 갯수, 연결된 핀번호를 조절해 주셔야 합니다.
 (키패드마다 연결되는 핀의 따른 버튼입력이 다르므로 키패드 구매시 정보가 담긴 데이터시트를 참고 하거나, 인터넷 검색을 통해 맞는 핀번호를 찾아서 세팅해 줍니다.)
 

void setup(){
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  setLocked(true); 
}
// 2개의 LED를 세팅해주고, 잠금상태를 기본으로 세팅해 줍니다.

각각의 LED와 연결된 필들을 출력모드로 설정하고, 기본을 잠금 상태로 설정해 둡니다.(잠금상태시 Red LED만 불이 들어와 있습니다.)
 

void loop(){
  char key = keypad.getKey(); // 키패드에서 입력된 값을 가져옵니다
  
  if((key >= '0' && key <= '9') || (key >= 'A' && key <='D')
    || (key == '*' || key == '#')){
  // 키패드에서 입력된 값을 조사하여 맞게 입력된 값일 경우(키패드에 있는 버튼이 맞을경우) 비교

    if(key == '*' || key == '#'){ // *, # 버튼을 눌렀을 경우
      position = 0; 
      wrong = 0; // 입력 초기화
      setLocked(true); // 잠금상태로 세팅
    } 
 
    else if(key == secretCode[position]){ // 해당 자리에 맞는 비밀번호가 입력됬을 경우
      position++; // 다음 자리로 넘어 감
      wrong = 0; // 비밀번호 오류 값을 0으로 만듬
    }
    
    else if(key != secretCode[position]){ // 해당 자리에 맞지 않는 비밀번호가 입력됬을 경우
      position = 0; // 비밀번호를 맞았을 경우를 0으로 만듬
      setLocked(true); // 잠금상태로 세팅
      wrong++; // 비밀번호 오류 값을 늘려준다
    }
  
    if(position == 4){ // 4자리 비밀번호가 모두 맞았을 경우
      setLocked(false); // 잠금상태를 해제 함
    }
    
    if(wrong == 4){ // 비밀번호 오류를 4번 했을 경우
      blink(); // Red LED를 깜빡여 준다.
      wrong = 0; // 비밀번호 오류 값을 0으로 만들어 준다
    }
  }
  delay(100);
}

우선 키패드에서 읽어 오는 값이 키패드 버튼인지 확인 합니다.(키패드를 누르지 않을시 key값에 이상한 값이 들어 옵니다.)
(제가 썻던 키패드의 범위는 0~9까지 A~D까지 *, #  입니다.)

키패드의 버튼이 눌리면 해당 버튼을 key라는 변수에 저장 합니다. 

해당 키가 *이나 #인 경우에는 지금까지 검사했던것을 다시 초기화 시키고 잠금상태로 돌아 갑니다.

그다음은 위에서 선언한 비밀번호 맨 앞자리부터 비교를 합니다. 같을 경우 두번째 자리와 비교 합니다.  같지 않을경우는 계속 같은 자리에서 비교를 합니다.

(ex : 비밀번호가 1234인 경우 우선 1을 입력할 때 까지 계속 1과 비교하다가 맞을 경우 그다음 2를 비교하고 계속 이 것을 끝까지 반복합니다.)

만약 틀린 값을 입력시 position 을 0으로 초기화 하고(다시 맨 앞자리 비교로 넘어갑니다.), wrong 값을 늘려 줍니다. 연속으로 4자리 틀렷을시 blink() 함수를 호출합니다.

4자리가 모두 다 맞앗을 경우 잠금을 해제합니다.
 

void setLocked(int locked){ // 잠금시와 해제시에 맞는 LED를 세팅해 주는 함수
  if(locked) { // 잠금시 Red LED를 켜주고, Green LED를 꺼준다.
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, LOW); 
  }

  else{ // 해제시 Red LED를 꺼주고, Green LED를 켜준다.
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, HIGH);
  } 
}

setLocked() 함수는 잠금 상태에 따라 LED의 불을 바꿔 주는 함수입니다.

잠금 상태를 받아서 잠겨 있을 경우 Red LED를 키고 Green LED를 끄고, 잠금 상태가 해제되면 Red LED를 끄고 Green LED를 킵니다.

 

void blink(){ // 비밀번호 4번 오류시 Red LED를 깜빡여 주는 함수.
  for(int i = 0; i < 8; i++){ // 딜레이 만큼 Red LED를 껐다 켰다 해준다. 총 8회
    digitalWrite(redPin, LOW);
    delay(500);
    digitalWrite(redPin, HIGH);
    delay(500);
  }
}

blink() 함수는 Red LED를 깜빡이는 함수 입니다. Red LED 를 일정 딜레이 동안 껐다 켰다 반복 합니다.

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

키패드, LED, 아두이노, 오렌지보드