핑거스냅으로 LED를 켜보자 ?


안녕하세요 라이프온룸입니다. ! 

오늘은 소리 센서를 이용해서 박수 혹은 핑거 스냅으로 LED 를 켜볼게요 

먼저 준비물 부터 보고 가죠 

1. 준비물 

소리센서의 경우에는 Output 이 디지털인 것 아날로그 인 것 이 있습니다. 보통 소리센서에 보면 칩이 있는데 거기에 lm393 이라고 적혀 있으면 Digital 입니다. 

개인적으로 Digital, 과 Analog의 가격 차이가 얼마 나지 않기 때문에 아날로그를 사는 것이 범용성 면에서 좋을 것 같아요 

 

lm393

2. 연결 

연결은 아래처럼 하면 됩니다. 쉽죠잉 ~ ㅎㅎ 추가로 아날로그 소리센서를 사신분들도 디지털 핀에 입력을 해도 상관 없습니다. 

3. 코드 

일단 기본 코드를 보고 갈게요 

int LED = 2;
int soundSensor = 3;
int val = 0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(soundSensor, INPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
  val = digitalRead(soundSensor);
  Serial.println(val);

}

이렇게 입력하면 되는데요 스케치를 업로드 하고 툴 > 시리얼 플로터를 열어보세요 

그리고 소리센서 옆에서 소리질러 !!! 보면 아래와 같이 나올 텐데요 

박수나 핑거 스냅을 할 때 좀 이쁜 파형이 나오도록 가변 저항을 조절해 줍니다. 

그리고 아래 코드를 입력해서 업로드 해주세요 

#define LED 2
#define soundSensor 3

int soundValue;
int state = 0;
int currentSoundTime = 0;
int stateOneTime = 0;
int stateTwoTime = 0;
int stateThreeTime = 0;
int relayStatus=0;


void setup() {
  pinMode(soundSensor, INPUT);
  pinMode(LED, OUTPUT);
  //Serial.begin(9600);
}

void loop() {
  soundValue = digitalRead(soundSensor);
  currentSoundTime = millis();

  if (soundValue == 1)
  {
    
    if (state == 0)
    {
      state = 1;
      stateOneTime = millis();
      //Serial.println("state 1 set ");
    }
    else if (state == 1)
    {
      stateTwoTime = millis();
      if ((stateTwoTime  > stateOneTime + 800) &&
          (stateTwoTime  < stateOneTime + 1200))
      {
        state = 2;
        //Serial.println("state 2 set ");
      }

    }
    else if (state == 2)
    {
      stateThreeTime = millis();
      if ((stateThreeTime  > stateTwoTime + 200) &&
          (stateThreeTime  < stateTwoTime + 500))
      {

        relayStatus = !relayStatus;
        digitalWrite(LED, relayStatus);
        initVal(currentSoundTime);
        //Serial.println("state 3 set ");

      }
    }
  }
  if ((state != 0) &&
    (currentSoundTime > stateOneTime + 2000))
    {
      //Serial.println("Time Out ");
      initVal(currentSoundTime);
    }
}


void initVal(int currentSoundTime)
{
  state = 0;
  stateOneTime = currentSoundTime;
  stateTwoTime = currentSoundTime;
  stateThreeTime = currentSoundTime;
}

 

이 코드를 간략하게 설명하자면 최초로 소리를 감지 하면 0.8초 ~ 1.2 초 사이에 또 소리가 감지되어야 하고 두번째 소리가 감지된 뒤 0.2초에서 0.5초 사이에 소리가 감지되면 LED가 켜지게 됩니다. 

즉 박수를 세번 치는데 

짝…….. 짝..짝

이런식으로 치는 거지요 ㅎㅎㅎ 

이렇게 박수를 치거나 핑거 스냅을 하면 LED가 겨질 겁니다. 

자 오늘은 소리 센서를 써봤는데요 ! 디지털 소리센서는 중요한 장치를 끄고 켤 스위치로는 쓰기 힘들 것 같습니다. 코드를 좀 루버스트 하지 않게 짜면 그냥 생활 소음으로 도 LED가 켜질 수도 있고 그렇지 않으면 LED가 잘 안켜지고 그렇네요 ㅎㅎ 여튼 좀더 연구를 해봐야 겠습니다. 

오늘 포스팅은 여기서 마치도록 하죠 ㅎㅎ 감사합니다. 

You may also like...

댓글 남기기

이메일은 공개되지 않습니다.