소리는 소리의 높낮이와 소리의 크기로 나눌 수 있음.
소리는 공기의 떨림인데 진동수가 높으면 높은 음, 낮으면 낮은 음임.


사운드 센서는 장착된 마이크를 통해서 소리의 크기를 아날로그 신호나 디지털 신호로 출력해 줌. 디지털 신호는 소리가 특정 크기 이상일 때 HIGH로 출력됨. 이때 사운드 센서에 내장된 가변 저항을 조절하여 디지털 신호의 소리 크기 기준을 정해줄 수 있음.
int led = 4;
void setup() {
// put your setup code here, to run once:
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
int value = analogRead(A0);
int power = map(value, 0, 1024, 0, 255);
analogWrite(led, power);
Serial.println((String)value + " -> " + (String)power);
delay(100);
}


생각보다 소리의 크기를 단계별로 나눌 정도로 섬세하지는 않음. 내가 잘못 구현한 걸수도 있고...
버저는 일반 스피커와는 다르게 전기적 신호를 주었을 때 수축하거나 확장하는 피에조 효과를 이용해서 공기를 진동시켜 소리를 만들어냄
이 피에조 버저는 제어 방식에 따라 능동버저와 수동버저로 나뉨.
능동 버저는 내부에 내장된 회로가 있어서 전원을 연결하기만 해도 소리가 남.
수동 버저는 내장된 회로가 없어서 전원을 인가한 구 주파수를 발생시켜 줘야 소리가 남.
버저는 극성이 존재하므로 부품 상단의 + 마크에 전원이나 제어핀을 연결해야 함.

교재에 있는 피에조 부저 표이다.
정확하진 않지만 입력 및 제어하기에는 편하다.
tone() 메서드
tone(출력 핀번호, 주파수, 유지시간);코드로 사용할 수 있다.
한 번에 한 개의 핀만 제어할 수 있으며 이미 tine 함수를 사용해 연주중이라면 다른 핀에 tone함수를 적용해도 작동하지 않는다. 그래서 delay()함수를 통해 유지시간이 끝나기를 기다렸다가 순서대로 연주해야 한다.
내부 풀업 저항을 사용하면 값이 의도와 반대로 나와서 한번 더 생각해야 하지만, 플로팅 현상을 해결할 수 있다. 이번에도 택트스위치를 사용하며 플로팅 현상으로 예기치 않은 오류가 발생했었다.
int buzzer = 5;
int sw = 4;
int melody[] = {262, 294, 330, 349, 392, 440, 494, 523};//도레미파솔라시도
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(buzzer, OUTPUT);
pinMode(sw, INPUT_PULLUP);//내부 풀업 저항 사용
}
void loop() {
// put your main code here, to run repeatedly:
if(digitalRead(sw) == 0){//눌렀을 때
Serial.println(digitalRead(sw));
for(int i = 0; i < 8; i++){
tone(buzzer, melody[i], 400);//0.4초 동안 음계 출력
delay(500); //0.5초 대기
}
}
else{
noTone(buzzer);
}
}

아기 상어 노래를 무한 재생하는 코드다.
애기들이 좋아하는 장난감이 될거 같다.
int buzzer = 5;
int melody[] = {294, 330, 392, 392, 392, 392, 392, 392, 392, 294, 330, 392, 0,
//아 기 상 어 뚜 루 루 루 루 귀 여 운
//레 미 솔 솔 솔 솔 솔 솔 솔 레 미 솔
392, 392, 392, 392, 392, 294, 330, 392, 0,
//뚜 루 루 루 루 바 다 속
//솔 솔 솔 솔 솔 레 미 솔
392, 392, 392, 392, 392, 392, 392, 370, 370, 0};
//뚜 루 루 루 루 아 기 상 어
//솔 솔 솔 솔 솔 솔 솔 파# 파#
int maintain[] = {400, 400, 200, 200, 200, 100, 300, 100, 200, 200,
200, 100, 30, 200, 100, 300, 100, 200, 200, 200,
100, 30, 200, 100, 300, 100, 200, 200, 200, 200, 200, 3000};
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(buzzer, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
for(int i = 0; i < 32; i++){
tone(buzzer, melody[i], maintain[i]);
delay(maintain[i] + 100);
}
}
