0
Sketch Code
#define Rows 4
#define Cols 4
char keys[Rows][Cols] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
const int RowPinTbl[Rows] = {5, 4, 3, 2};
const int ColPinTbl[Cols] = {6, 7, 8, 9};
void setup() {
Serial.begin(9600); // init Serial
for(int i=0; i<Rows; i++) {
pinMode(RowPinTbl[i], INPUT_PULLUP); // 내부 풀업 저항 사용
}
for(int j=0; j<Cols; j++) {
pinMode(ColPinTbl[j], OUTPUT);
digitalWrite(ColPinTbl[j], HIGH); // 초기값 HIGH
}
}
void loop() {
// 버튼 인식
for(int j=0; j<Cols; j++) {
digitalWrite(ColPinTbl[j], LOW); // Col 라인 Active Low
for(int i=0; i<Rows; i++) {
if( digitalRead(RowPinTbl[i]) == LOW ) { // check Row 라인
Serial.print("row=");
Serial.print(i);
Serial.print(", column=");
Serial.println(j);
Serial.print(", Key Number=");
Serial.println(keys[i][j]);
}
}
digitalWrite(ColPinTbl[j], HIGH); // Col 라인 다시 High
}
delay(200);
}
아두이노에서는 자체적으로 'pinMode()' 에서 'INPUT' 과 'OUTPUT' 외에도 'INPUT_PULLUP' 이라는 소프트웨어적인 풀업 모드를 제공한다.
아두이노의 각 핀에는 내부 풀업 저항이 달려있기 때문에 위 선언을 통해 자동으로 풀업을 사용할 수 있다.
일반적으로 풀다운 보다는 풀업이 노이즈나 충격에 강하기 때문에 풀업을 많이 사용한다.
피아노 버튼
스피커를 아두이노의 13번 핀과 GND에 추가로 연결해준다.
1) pitches.h
#define NOTE_C5 523
#define NOTE_D5 587
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_G5 784
#define NOTE_A5 880
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_D6 1175
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_G6 1568
#define NOTE_A6 1760
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_D7 2349
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_G7 3136
#define NOTE_A7 3520
#define NOTE_B7 3951
#define NOTE_C8 4186
2) Sketch Code
#include "pitches.h"
#define Rows 4
#define Cols 4
char keys[Rows][Cols] = {
{'1', '2', '3', '4'},
{'5', '6', '7', '8'},
{'9', 'A', 'B', 'C'},
{'D', 'E', 'F', 'G'}
};
int melody[] = {NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6, NOTE_D6, NOTE_E6, NOTE_F6, NOTE_G6, NOTE_A6, NOTE_B6, NOTE_C7, NOTE_D7};
const int RowPinTbl[Rows] = {5, 4, 3, 2};
const int ColPinTbl[Cols] = {6, 7, 8, 9};
void setup() {
Serial.begin(9600); // init Serial
for (int i = 0; i < Rows; i++) {
pinMode(RowPinTbl[i], INPUT_PULLUP);
}
for (int j = 0; j < Cols; j++) {
pinMode(ColPinTbl[j], OUTPUT);
digitalWrite(ColPinTbl[j], HIGH); // 초기값 HIGH
}
}
void loop() {
// 버튼 인식
for (int j = 0; j < Cols; j++) {
digitalWrite(ColPinTbl[j], LOW); // Col 라인 Active Low
for (int i = 0; i < Rows; i++) {
if ( digitalRead(RowPinTbl[i]) == LOW ) { // check Row 라인
Serial.print("row=");
Serial.print(i);
Serial.print(", column=");
Serial.println(j);
Serial.print(", Key Number=");
Serial.println(keys[i][j]);
if (keys[i][j] == '1') {
tone(13, melody[0], 300);
} else if (keys[i][j] == '2') {
tone(13, melody[1], 300);
} else if (keys[i][j] == '3') {
tone(13, melody[2], 300);
} else if (keys[i][j] == '4') {
tone(13, melody[3], 300);
} else if (keys[i][j] == '5') {
tone(13, melody[4], 300);
} else if (keys[i][j] == '6') {
tone(13, melody[5], 300);
} else if (keys[i][j] == '7') {
tone(13, melody[6], 300);
} else if (keys[i][j] == '8') {
tone(13, melody[7], 300);
} else if (keys[i][j] == '9') {
tone(13, melody[8], 300);
} else if (keys[i][j] == 'A') {
tone(13, melody[9], 300);
} else if (keys[i][j] == 'B') {
tone(13, melody[10], 300);
} else if (keys[i][j] == 'C') {
tone(13, melody[11], 300);
} else if (keys[i][j] == 'D') {
tone(13, melody[12], 300);
} else if (keys[i][j] == 'E') {
tone(13, melody[13], 300);
} else if (keys[i][j] == 'F') {
tone(13, melody[14], 300);
} else if (keys[i][j] == 'G') {
tone(13, melody[15], 300);
}
}
}
digitalWrite(ColPinTbl[j], HIGH); // Col 라인 다시 High
}
delay(200);
}