아기울음소리 감지기를 만들어 보자

by 하민정 | 2017-01-09 12:51
iot 감지기 스마트홈 아기울음소리 아두이노 엄마를위한iot

재료

  • 10K 옴 저항 1개
  • 아두이노 우노 1개
  • 점퍼 와이어 1개
  • LED 바그래프 1개
  • 0.1 uF 축전기 1개
  • 220 옴 저항 1개
  • 5V 전압 1개
  • 오렌지색 LED 1개
  • 브래드보드 1개
  • 100k 옴 저항 1개
  • 뮤직 플레이어 1개
  • 마이크 1개
  • NPN 트랜지스터 1개

                     


잠자는 동안 아기들은 주기적으로 깨어나 울곤 합니다. 

이럴 때를 대비하기 위해 엄마들은 아기들 옆에서 '항시 대기'하고 있어야 합니다. 

이 동안 엄마들은 종종 아무 것도 하지 못하고 아기를 위한 장난감과

아기를 편안히 다시 재울 수 있는 음악을 담은 뮤직 플레이어를 들고 기다리고 있습니다. 


이 시간이 정해져 있는 것이 아니기 때문에 엄마들은 이 시간에 예민해 지게 되고, 

이런 시간이 축적 되면서 엄마들에게 이것이 큰 불편함으로 다가 오게 됩니다. 


이런 문제를 해결하는 데 도움이 되는 프로젝트를 Hackster 에서 발견하였고, 

이를 함께 공유하고자 합니다. 


아기들이 울때 '아기 울음 소리를 감지한 아두이노' 가 연결된 뮤직 플레이어를 재생하여 주고,

이를 통해 굳이 엄마가 아기 옆에서 기다리고 있지 않아도 아기를 다시 편안히 재울 수 있게 되어,

엄마들이 겪는 어려움을 자동으로 해결 할 수 있는 것입니다. 



Step 1. 준비물 


- 브래드 보드 

- 아두이노 우노 

- 5V 전압 

- 마이크 

- LED 바 그래프 

- 오렌지색 LED 

- NPN 트랜지스터 

- 0.1 uF 축전기 

- 100k 옴 저항

- 10k 옴 저항 

- 220 옴 저항 

- 뮤직 플레이어 

- 점퍼 와이어 


Step 2. 하드웨어 연결방법 



1) LED 바 그래프를 아두이노의 디지털 2번핀에서 부터 12번핀까지 연결합니다. 

2) 전압을 + 버스와 브래드 보드에 연결합니다. 

3) 축전기를 브래드 보드의 + 버스에 연결하여 아두이노의 디지털 0번핀과도 연결합니다. 

4) NPN 트랜지스터를 두개의 오렌지색 LED 와 연결합니다. 

5) 뮤직 플레이어와 연결합니다. 








Step 3. 코드 


1
const int threshold = 320; 
cs


뮤직 플레이어를 실행할 기준점 변수인 threshold 를 설정합니다. 

이 값이 낮을 수록 아기의 울음소리에 민감하게 반응하여 빨간색 LED 화면이 비추어 지지만, 

너무 낮아도 주위의 소음에 의해서도 뮤직 플레이어가 실행될 수 있으므로,

어느 정도 이상의 값을 가져야 합니다. 

따라서 여기서는 320 으로 이 기준점을 설정해 주었습니다. 


1
2
const int ledPin[] = {
  2,3,4,5,6,7,8,9,10,11,12,13};     // led bars
cs


LED 바 그래프에서 출력되어야 하는 부분 입니다. 

이것들 이상의 LED 를 사용하고 싶은 경우에 더 많은 포트를 바 그래프와 연결하여 주고, 

코드에서 추가해 주면 됩니다. 


1
const long waitTime = 10000.0; 
cs


매번 알람이 울리기 이전에 이것이 올바른 알람 신호인지, 

옳지 않은 알람 신호인지를 구분하기 위하여 

10초의 waitTime 를 줍니다. 


1
const long cancelTime = 4000.0; 
cs


wait 상태로 들어가 waitTime 동안 감지 하는 상태로 가기 위해 4초 동안 신호가 지속 되어야 합니다. 

4초 동안 신호가 들어와 감지 된 경우 wait 상태로 들어가 이제 위에서 설정한,

waitTime 동안 알람이 울리기 전 유효한 알람인지 검증하고, 

4초 동안 신호가 들어오지 않는 경우엔 자동으로 이 신호는 취소 되어

wait 상태로 들어가지 못하게 됩니다. 


1
const long playTime = 30000.0; 
cs


위에서 설정한 알람이 울리는 조건을 모두 만족한 경우

playTime 으로 설정한 값 동안 알람이 울리게 됩니다. 

여기서는 30 초로 설정해 30초 동안 뮤직 플레이어가 재생하게 됩니다. 


∴ cancelTime → waitTime → playTime 


으로 알람이 울리기 이전에 검증을 완료합니다. 


1
digitalWrite(playPin, HIGH) 
cs


뮤직 플레이어를 제어하는 출력 핀인 playPin 이 HIGH 상태가 될 경우 

출력하도록 설정합니다. 


1
ledLevel = map(sensorReading, 200, threshold, 0, ledCount ) 
cs


아두이노의 map 함수를 이용하여, 

200과 threashold 의 리턴 값을 0과 ledCount 사이의 백분율로 mapping 하여 값을 받습니다. 

이를 통해 현재 ledLevel 를 알 수 있습니다. 


▶ 다음은 전체 코드 입니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/* Noisy Neighbors
 */
 
 
// these constants won't change:
const int sensorPin = A0; // the mic is connected to analog pin 0
const int threshold = 320;  // threshold value to decide when the detected sound is loud enough
const int ledPin[] = {
  2,3,4,5,6,7,8,9,10,11,12,13};     // led bars
const int ledCount = sizeof(ledPin)/sizeof(int);        // number of LEDs
const int waitingPin = 1;
const int playPin = 0;
const int playDelay = 30; // delay for knight rider play pattern
const long waitTime = 10000.0; // how long after trigger to wait before playing music 
const long cancelTime = 4000.0; // during wait, how long of a lull will cancel wait
const long playTime = 30000.0; // how long to play payback music for
 
// these variables will change:
int sensorReading = 0;      // variable to store the value read from the sensor pin
int ledLevel = 0; 
boolean waiting = 0;
boolean playing = 0;
long waitStart; // when trigger initiated waiting
long waitDuration; // how long we have been waiting
long playStart; // when play was initiated
long playDuration; // how long we've been playing
long cancelStart; // when the last trigger was
long cancelDuration; // how long of a lull we've had
 
void setup() {
  for(int i=0; i<ledCount; i++)
  {
    pinMode(ledPin[i], OUTPUT);
  } // declare the ledPin as as OUTPUT
  pinMode(waitingPin, OUTPUT);
  pinMode(playPin, OUTPUT);
  digitalWrite(playPin, HIGH);
// Serial.begin(9600);       // use the serial port
}
 
void loop() {
  // read the sensor and store it in the variable sensorReading:
  sensorReading = analogRead(sensorPin);    
  
  // map the result to a range from 0 to the number of LEDs:
  ledLevel = map(sensorReading, 200, threshold, 0, ledCount);
 
  // loop over the LED array:
  for (int i = 0; i < ledCount; i++) {
    // if the array element's index is less than ledLevel,
    // turn the pin for this element on:
    if (i < ledLevel) {
      digitalWrite(ledPin[i], HIGH);
    } 
    // turn off all pins higher than the ledLevel:
    else {
      digitalWrite(ledPin[i], LOW); 
    }
  }
  
  // over the threshhold
  if (ledLevel == ledCount) {
    cancelStart = millis();
    if (!waiting) {
      waiting = 1;
      digitalWrite(waitingPin, HIGH);
      waitStart = millis();
    }
  }
  
  if (waiting) {
    cancelDuration = millis() - cancelStart;
    waitDuration = millis() - waitStart;
 
    if (cancelDuration > cancelTime) {
      waiting = 0;
      digitalWrite(waitingPin, LOW);
    }
    else if (waitDuration > waitTime) {
      waiting = 0;
      digitalWrite(waitingPin, LOW);
      playing = 1;
      digitalWrite(playPin, LOW);
      delay(200);
      digitalWrite(playPin, HIGH);
      playStart = millis();
      
      while (playing) {
         playDuration = millis() - playStart;
         if (playDuration > playTime) {
           digitalWrite(playPin, LOW);
           delay(200);
           digitalWrite(playPin, HIGH);
           playing = 0;
         }
         
         for (int i = 0; i < ledCount; i++) {
           digitalWrite(ledPin[i], HIGH);
           delay(playDelay);
           digitalWrite(ledPin[i], LOW);
           delay(playDelay);
          }
          for (int i = (ledCount - 1); i >= 0; i--) {
           digitalWrite(ledPin[i], HIGH);
           delay(playDelay);
           digitalWrite(ledPin[i], LOW);
           delay(playDelay);
          }
      }
    }
  }
}
 
cs


Step 4. 수행결과 





댓글 5

MADE BY

가스 센서를 만들어보자 다음글 아기울음소리 감지기를 만들어 보자 현재글 온습도계 만들어 보기 이전글