-
키패드의 기본Arduino/키패드 2020. 10. 23. 18:11
키패드와 아두이노의 하드웨어적인 연결
연결은 쉽다.R1~R4와 C1~C4는 키패드의 핀번호이다.
R4는 아두이노의 6번핀, R3은 7번핀, R2는 8번핀, R1은 9번핀에 각 각 연결한다.
C1은 아두이노의 5번핀, C2는 4번핀, C3은 3번핀, C4는 2번핀에 각 각 연결한다.
키패드의 버튼을 입력받아 출력하는 예제
소스 코드
void setup() { Serial.begin(9600); pinMode(4,INPUT_PULLUP); pinMode(5,INPUT_PULLUP); pinMode(6,INPUT_PULLUP); pinMode(7,INPUT_PULLUP); } void loop() { if(!digitalRead(4)) Serial.println("s1"); else if(!digitalRead(5)) Serial.println("s2"); else if(!digitalRead(6)) Serial.println("s3"); else if(!digitalRead(7)) Serial.println("s4"); delay(100); }
키패드의 버튼을 입력받아 출력하는 예제로 이차원 배열을 활용
프로그래밍의 기본 아이디어는 컴퓨터의 속도는 매우빠르다는 사실을 이용했고,
한 행마다 한 행의 열을 체크해서 눌린 키패드를 찾는 방식이다.
소스 코드
더보기// 컴퓨터의 속도는 매우빠르다는 사실을 이용한다. const byte ROW_CNT = 4; // 행의 개수 const byte COL_CNT = 4; // 열으 개수 byte rowPins[ROW_CNT] = {9,8,7,6}; // R4는 6번핀, R3은 7번핀, R2는 8번핀, R1은 9번핀 byte colPins[COL_CNT] = {5,4,3,2}; // C1은 5번핀, C2는 4번핀, C3은 3번핀, C4는 2번핀 char keys[ROW_CNT][COL_CNT] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; void setup(){ Serial.begin(9600); // row 라인은 출력모드로서 HIGH로 초기화하고 전원을 공급하는 역할을 합니다. // col열은 입력 라인으로 해당 버튼이 눌러질 경우 풀업 저항일 경우 0의 값이 출력된다. for(int i = 0; i < ROW_CNT; i++) { pinMode(rowPins[i], OUTPUT); digitalWrite(rowPins[i], HIGH); // 각층 초기화로 잠금. 건드릴 수 없는 상태. } for(int i = 0; i < COL_CNT; i++) { pinMode(colPins[i], INPUT_PULLUP); //각호실 내부풀업저항모드로 읽기 } } void loop(){ char val = '\0'; for(int row = 0; row < ROW_CNT; row++) { digitalWrite(rowPins[row], LOW); // 해당층 개방 for(int col = 0; col < COL_CNT; col++) { // 해당 행의 열이 눌렸는지를 체크(행렬의 열 체크) if(!digitalRead(colPins[col])) val = keys[row][col]; } // 행의 검사가 끝나면 검사가 끝난 행을 닫는다. digitalWrite(rowPins[row], HIGH); // 해당층 잠금 } // 눌린 키패드가 있다면, 출력 if(val != '\0') { Serial.println(val); delay(300); } }
위의 예제를 응용한 방법으로, 키패드를 통한 키 값을 계속 저장하다가
특정 키가 눌리면 현재까지 입력된 문자들을 출력하는 예제
소스 코드
더보기// 컴퓨터의 속도는 매우빠르다는 사실을 이용한다. const byte ROW_CNT = 4; // 행의 개수 const byte COL_CNT = 4; // 열으 개수 byte rowPins[ROW_CNT] = {9,8,7,6}; // R4는 6번핀, R3은 7번핀, R2는 8번핀, R1은 9번핀 byte colPins[COL_CNT] = {5,4,3,2}; // C1은 5번핀, C2는 4번핀, C3은 3번핀, C4는 2번핀 char keys[ROW_CNT][COL_CNT] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; void setup(){ Serial.begin(9600); // row 라인은 출력모드로서 HIGH로 초기화하고 전원을 공급하는 역할을 합니다. // col열은 입력 라인으로 해당 버튼이 눌러질 경우 풀업 저항일 경우 0의 값이 출력된다. for(int i = 0; i < ROW_CNT; i++) { pinMode(rowPins[i], OUTPUT); digitalWrite(rowPins[i], HIGH); // 각층 초기화로 잠금. 건드릴 수 없는 상태. } for(int i = 0; i < COL_CNT; i++) { pinMode(colPins[i], INPUT_PULLUP); //각호실 내부풀업저항모드로 읽기 } } String s; void loop(){ char val = '\0'; for(int row = 0; row < ROW_CNT; row++) { digitalWrite(rowPins[row], LOW); // 해당층 개방 for(int col = 0; col < COL_CNT; col++) { // 해당 행의 열이 눌렸는지를 체크(행렬의 열 체크) if(!digitalRead(colPins[col])) { val = keys[row][col]; } } // 행의 검사가 끝나면 검사가 끝난 행을 닫는다. digitalWrite(rowPins[row], HIGH); // 해당층 잠금 } if(val != '\0') { if (val == '#') { Serial.println(s); s = ""; } else s.concat(val); delay(300); } }