읽어 온 문자를 배열 code[ ]의 내용과 비교하여 같은 문자가 저장되어 있는 배열 code[ ]에서의 순서 k를 찾는다.
배열 freq[ ]에서 k번째인 freq[k]의 값을 tone( )함수 전달한다.
freq[k]의 값을 적용하여 tone(7, freq[k], 200) 실행한다.
- 전체 코드
const int piezo=7;
char code[ ]= {'C', 'D', 'E', 'F', 'G', 'A', 'B'};
unsigned int freq[ ]= {262, 294, 330, 349, 392, 440, 494};
char mData[ ]="CCGGAAGpFFEEDDCpGGFFEEDpGGFFEEDpCCGGAAGpFFEEDDCp";
const byte mSize=sizeof(mData);
void setup( ) {
pinMode(piezo, OUTPUT);
}
void loop( ) {
int playT=500; // 1박자를 0.5초
for (int m=0; m<mSize; m++) {
for(int k=0; k<7; k++) {
if( mData[m]==code[k] ) { // 배열 mData[]의 문자와 배열 code[] 의 문자 비교하여 인텍스 k 검색
tone(piezo, freq[k], playT); // freq[k]의 값을 tone( )함수 전달
delay(playT); // 1박자 연주
}
}
if (mData[m]=='p') { // 배열 mData[]의 문자가 'p' 인 경우
delay(playT); // 1박자 더 쉼
}
}
noTone(piezo);
delay(2000);
exit(0);
}
4.2.3 프로그램 코드 (다른 방식의 구현)
#define 문을 이용하여 각 계이름 코드에 대한 주파수 상수 값을 정의
#define C 262
#define D 294
#define E 330
#define F 349
#define G 392
#define A 440
#define B 494
연주할 곡의 계이름 코드를 int 배열로 표시
int mData[] = {C,C,G,G,A,A,G,F,F,E,E,D,D,C};
mData[] 배열의 원소의 개수 구하기
배열의 원소의 개수 = 전체 배열의 크기 / 배열의 한 원소의 크기
byte mSize = sizeof(mData)/sizeof(mData[0]);
mData[] 배열의 계이름 연주
모든 계이름을 한 박자로 연주
void loop() {
int playT = 500;
for (int i=0; i < mSize; i++) {
tone(7,mData[i],playT);
delay(playT);
}
exit(0);
}
배열 인덱스 6, 13번째 계이름만 두박자로 연주하고 나머지는 한박자로 연주
void loop() {
int playT=500;
for (int i=0; i < mSize; i++) {
if (i==6 || i==13)
playT=1000;
else
playT=500;
tone(7,mData[i],playT);
delay(playT);
}
exit(0);
}
전체코드
#define C 262
#define D 294
#define E 330
#define F 349
#define G 392
#define A 440
#define B 494
const int piezo=7;
int mData[] = {C,C,G,G,A,A,G,F,F,E,E,D,D,C};
const byte mSize = sizeof(mData)/sizeof(mData[0]);
void setup() {
pinMode(piezo, OUTPUT);
}
void loop() {
int playT=500;
for (int i=0; i < mSize; i++) {
if (i==6 || i==13)
playT=1000;
else
playT=500;
tone(7,mData[i],playT);
delay(playT);
}
exit(0);
}
4.3 예제 5: 간이형 키보드 만들기
4.3.1 하드웨어 구성
d
4.3.2 1단계
2번 핀에 연결된 버튼에 대해서 다음과 같이 동작하는 코드
버튼 스위치가 계속 눌려지고 있으면, 계속 같은 음 '도'를 출력
버튼 스위치의 눌림이 종료되면, 출력되던 음 출력 정지
오래 누르면 길게 소리가 나고 짧게 누르면 짧게 소리 출력
int piezo = 7; //피에조가 연결된 디지털입출력 핀
int sw = 2; // 디지털입출력 2번 핀을 버튼스위치와 연결
int freq= 262; // 도의 주파수
int val = 0; // 변수의 초기값
void setup() {
pinMode(piezo, OUTPUT); // 출력 핀 설정
pinMode(sw, INPUT); // 입력 핀 설정
}
void loop() {
if (digitalRead(sw)==1) { // 버튼 스위치가 눌러진 경우
tone(piezo,freq); // '도(262)'의 주파수 출력
while(digitalRead(sw)==1) {} // 버튼 스위치가 계속 눌러진 경우
noTone(piezo);
}
}
4.3.3 2단계
버튼 스위치 입력에 따라 도, 레, 미, 파 연주
버튼 스위치가 계속 눌려지고 있으면, 계속 같은 음 출력
버튼 스위치의 눌림이 종료되면, 출력되던 음 출력 정지
오래 누르면 길게 소리가 나고 짧게 누르면 짧게 소리 출력
int piezo = 7; //피에조가 연결된 디지털입출력 핀
int sw[4] = {2, 3, 4, 5}; // 4개 스위치 지정
int freq[4]= {262, 294, 330, 349}; // 도, 레, 미, 파의 주파수
int val = 0; // 변수의 초기값
void setup() {
pinMode(piezo, OUTPUT); // 출력 핀 설정
for(int k=0; k<4; k++) {
pinMode( sw[k], INPUT); // 입력 핀 설정
}
}
void loop() {
if (digitalRead(sw[0])==1) {
tone(piezo,freq[0]);
while(digitalRead(sw[0])==1) {}
noTone(piezo);
} else if (digitalRead(sw[1])==1) {
tone(piezo,freq[1]);
while(digitalRead(sw[1])==1) {}
noTone(piezo);
} else if (digitalRead(sw[2])==1) {
tone(piezo,freq[2]);
while(digitalRead(sw[2])==1) {}
noTone(piezo);
} else if (digitalRead(sw[3])==1) {
tone(piezo,freq[3]);
while(digitalRead(sw[3])==1) {}
noTone(piezo);
}
}
4.3.4 3단계 (코드 축약 버전)
for 문과 배열을 이용하여 중복 코드 단순화
int piezo = 7; //피에조가 연결된 디지털입출력 핀
int sw[4] = {2, 3, 4, 5}; // 4개 스위치 지정
int freq[7]= {262, 294, 330, 349}; // 도, 레, 미, 파의 주파수
int val = 0; // 변수의 초기값
void setup() {
pinMode(piezo, OUTPUT); // 출력 핀 설정
for(int k=0; k<4; k++) {
pinMode( sw[k], INPUT); // 입력 핀 설정
}
}
void loop() {
for(int k=0; k<4; k++) {
val = digitalRead(sw[k]);
if(val) { // k번째 스위치가 눌렸는지 검사
tone(piezo, freq[k]); // k번째 주파수 출력
while(digitalRead(sw[k])); //스위치가 계속 눌려지고 있는지 검사
noTone(piezo); //스위치 눌림이 끝나면 소리 정지
}
}
}