파란색 : digitalPin에 연결해 소리가 있는지 없는지만
빨강색 : analogPin에 연결해 소리의 세기를 측정가능
소리감지 센서
사운드 센서는 주변에서 발생되는 소리를 마이크로 모아 소리의 크기를 증폭시켜 출력합니다.
소리신호는 기본적으로 아날로그 전압 신호로 출력되기 때문에 아두이노를 사용할 경우 아날로그 핀을 통해 측정이 됩니다.
실생활에서 소리로 켜고 끄는 전등, 기타 튜닝, 마이크 등에 활용됩니다.
동작원리
연결 및 가변저항 조절
감도
시계 반대방향 = 측정 값 작아짐 => 둔감
시계 방향 = 측정 값 커짐 => 민감
※감도가 너무 둔감하면 아무리 소리를 켜도 계속 LOW이고
감도가 너무 민감하면 소리를 내지않아도 HIGH입니다.
제대로 실습을 진행하기 위해서 감도를 설정해줍시다
다음표를 보고 회로를 연결한 후 다음과 같은 코드를 작성합시다.
VCC | 5V |
GND | GND |
OUT | 디지털 핀 |
int LM_pin = 4;
void setup() {
pinMode(LM_pin,INPUT);
Serial.begin(9600); // 시리얼 통신 시작
}
void loop() {
if(digitalRead(LM_pin) == HIGH){ // 소리가 감지되면
Serial.println("sound detected."); // 시리얼 모니터에 소리가 감지되었다는 메세지 출력
delay(100); // 0.1초간 기다림
}
}
시리얼 모니터를 보면서 드라이버로 감도를 조절합니다.
"sound detected"가 보이다가 안 보이는 구간을 찾습니다.
이 때가 실습을 위한 최적의 감도가 될 것입니다.
소리를 냈을 때만 sound detected가 보인다면 됐습니다.
문제 1: 박수를 칠 때 마다 색깔이 변하도록(r -> g -> b -> r )
int LM_pin = 4;
int red=13;
int green=12;
int blue=11;
int count=0;
void setup() {
pinMode(LM_pin,INPUT);
pinMode(red,OUTPUT);
pinMode(green,OUTPUT);
pinMode(blue,OUTPUT);
digitalWrite(red,HIGH);
Serial.begin(9600); // 시리얼 통신 시작
}
void loop() {
if(digitalRead(LM_pin) == HIGH){ // 소리가 감지되면
Serial.println("sound detected."); // 시리얼 모니터에 소리가 감지되었다는 메세지 출력
count++;
if(count%3==0){
digitalWrite(red,HIGH);
digitalWrite(green,LOW);
digitalWrite(blue,LOW);
}else if(count%3==1){
digitalWrite(red,LOW);
digitalWrite(green,HIGH);
digitalWrite(blue,LOW);
}else if(count%3==2){
digitalWrite(red,LOW);
digitalWrite(green,LOW);
digitalWrite(blue,HIGH);
}
delay(50);
}
}
문제 2: 1.5초안에 박수를 한번 치면 r , 두번치면 g, 3번 치면 b 가 나오도록 해보세요.
Serial로 결과 확인하면서 해보세요.
현재 시간을 반환하는 millis() 함수를 사용합니다.
https://www.arduino.cc/reference/ko/language/functions/time/millis/
int LM_pin = 4;
int red=13;
int green=12;
int blue=11;
#define DELAY 1500 //1.5초안에 박수 치세요
void setup() {
pinMode(LM_pin,INPUT);
pinMode(red,OUTPUT);
pinMode(green,OUTPUT);
pinMode(blue,OUTPUT);
Serial.begin(9600); // 시리얼 통신 시작
}
unsigned long firstTime=0;
unsigned long lastTime=0;
boolean start=true;
int count=0;
void loop() {
lastTime=millis(); //마지막 시간은 계속 측정
if(digitalRead(LM_pin) == HIGH){ // 소리가 감지되면
if(start){
firstTime=millis();
}
count++;
start=false;
delay(50);
}
int delayTime=lastTime-firstTime;
if(delayTime>1500){ //시간이 지났는데도 박수소리가 안난다면 박수 소리에 맞는 led 점등 후 리셋
onlyOneLedOn(14-count); // 아무것도 안하고 1.5초가 지나도 계속 count=0이어서 점등에는 변화x
count=0;
start=true;
}
}
void onlyOneLedOn(int led){
if(led==red){
digitalWrite(red,HIGH);
digitalWrite(green,LOW);
digitalWrite(blue,LOW);
}else if(led==green){
digitalWrite(red,LOW);
digitalWrite(green,HIGH);
digitalWrite(blue,LOW);
}else if(led==blue){
digitalWrite(red,LOW);
digitalWrite(green,LOW);
digitalWrite(blue,HIGH);
}else if(led==0){
digitalWrite(red,LOW);
digitalWrite(green,LOW);
digitalWrite(blue,LOW);
}
}