알람 설정하기 기능

by 조혜인 | 2017-01-11 19:17
mp3 mp3\ rtc 노래 시계 아두이노 알람 알람설정

재료

  • DFPlayer 1개 (9900원)
  • 스피커 1개 (900원)
  • sd카드(8GB) 1개 (4450원)



1. 알람 설정하기


이번 단계에서는 알람을 설정하고, 알람시간이 되면 mp3플레이어가 재생되도록 해보겠습니다.

그냥 단순한 비프음이 아니라, 내가 좋아하는 노래가 나오면 기분이 참 좋겠죠~?

아침에 일어날 때 뿐만 아니라, 식사시간에 엄마가 방에 있는 아이를 부를 때도 이용하면 재미있을 것 같습니다. 엄마목소리를 미리 녹음해둔 후 재생해도 재밌겠네요 :-)


알람을 설정할 때는 다음처럼 날짜와 시간을 입력해야 합니다.





이번 스토리에서는 스마트폰 대신 시리얼 창을 통해 알람시간을 입력합니다.

알람을 설정하기 위해서는 컴퓨터 시리얼 창에서 '1'을 친 후 '년월일시간'을 입력해야 합니다.

'1201701111830'을 입력하면 2017년 1월 11일 오후 6시 30분

알람을 울리도록하겠다는 의미입니다.







2. 준비물


- 아두이노

- Tiny RTC

- mp3 모듈 (DFplayer)

- SD카드 (8GB)

- 스피커

 




3. 하드웨어연결


저는 제가 자체제작한 pcb를 이용했습니다.

평소에는 아두이노와 브레드보드를 이용해 구현하시면 됩니다.

RTC 연결 방법은 이전 스토리(Tiny RTC(DS1307)를 이용해 시계 만들기)를 참고해 주세요.


-DFplyaer & 스피커 연결방법







4. 소프트웨어


1) DFplayer 라이브러리 설치

화면 오른쪽 첨부파일을 확인해 주세요.


2) 소스코드

- 완성코드


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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>
#include <DFPlayer_Mini_Mp3.h>
 
SoftwareSerial mp3Serial(12, 13);
 
String inputString = "";       
boolean stringComplete = false; 
boolean stringYear = false;
String input_year = "";
String input_month = "";
String input_day = "";
String input_hour = "";
String input_min = "";
 
int year_int = 0;
int month_int = 0;
int day_int = 0;
int hour_int = 0;
int min_int = 0;
 
tmElements_t tm;
 
void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
  mp3Init();
  inputString.reserve(200); //SerialEvents
}
 
void loop() {
 
  if (stringComplete) {
    Serial.println(inputString);
    timeConverter();
    inputString = "";
    stringComplete = false;
  }
 
  if (RTC.read(tm)) {
    if (tmYearToCalendar(tm.Year) == year_int && tm.Month == month_int && tm.Day == day_int && tm.Hour == hour_int && tm.Minute == min_int) {
      Serial.println("Wake up!!!!!!");
      alarm();
    } else {
      Serial.println("Not yet");
    }
    Serial.print("computer : ");
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.print("/");
    Serial.print(tm.Month);
    Serial.print("/");
    Serial.print(tm.Day);
    Serial.print("  ");
    Serial.print(tm.Hour);
    Serial.print(":");
    Serial.print(tm.Minute);
    Serial.println();
  }
  delay(1000);
}
 
void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}
 
void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}
 
void alram() {
  Serial.println("Alarm!");
  mp3Play(1, 1000);
}
 
void mp3Init() {
  mp3Serial.begin(9600);
  mp3_set_serial (mp3Serial);      
  delay(1);                     
  mp3_set_volume (30);          
}
 
void mp3Play(int num, long sec) {
  mp3Serial.listen();
  if (mp3Serial.isListening()) {
    mp3_play(num);
    delay (sec);
    mp3_stop();
  }
}
 
 
void timeConverter() {
  //serial input to char
  if (inputString.charAt(0) == '1') {
    Serial.print("Set Alarm Time : ");
    input_year = inputString.substring(1, 5);
    Serial.print(input_year);
    Serial.print("/");
    input_month = inputString.substring(5, 7);
    Serial.print(input_month);
    Serial.print("/");
    input_day = inputString.substring(7, 9);
    Serial.print(input_day);
    Serial.print("   ");
    input_hour = inputString.substring(9, 11);
    Serial.print(input_hour);
    Serial.print(":");
    input_min = inputString.substring(11, 13);
    Serial.println(input_min);
  }
 
  //to int
  year_int = input_year.toInt();
  month_int = input_month.toInt();
  day_int = input_day.toInt();
  hour_int = input_hour.toInt();
  min_int = input_min.toInt();
}
 
void alarm() {
  mp3Play(1, 3000);
}
 


- 소스코드 설명

① 라이브러리를 불러오기
mp3를 켜기 위해 소프트웨어시리얼을 설정해 줍니다.

1
2
3
4
5
6
7
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>
#include <DFPlayer_Mini_Mp3.h>
 
SoftwareSerial mp3Serial(12, 13);
 


② 변수 선언하기
필요한 변수들을 선언합니다.
다음 변수들은 입력받은 시리얼값의 자료형(char)을 int형으로 변환하기 위해 선언했습니다.
tmElemtns_t tm 은 RTC를 제어하기 위한 객체입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
String inputString = "";       
boolean stringComplete = false; 
boolean stringYear = false;
String input_year = "";
String input_month = "";
String input_day = "";
String input_hour = "";
String input_min = "";
 
int year_int = 0;
int month_int = 0;
int day_int = 0;
int hour_int = 0;
int min_int = 0;
 
tmElements_t tm;
 
 


③ serialEvent 함수로 시리얼창 입력값 받아오기
serialEvent함수를 이용해 시리얼창에서 입력된 값을 받아옵니다.

1
2
3
4
5
6
7
8
9
10
 
void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}
 

④ serialEvent 함수로 시리얼창 입력값 받아오기
timeConverter함수를 만들어서 시리얼창에서 입력받은 시간의 자료형(char)을 int로 변환합니다.

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
 
void timeConverter() {
  //serial input to char
  if (inputString.charAt(0) == '1') {
    Serial.print("Set Alarm Time : ");
    input_year = inputString.substring(1, 5);
    Serial.print(input_year);
    Serial.print("/");
    input_month = inputString.substring(5, 7);
    Serial.print(input_month);
    Serial.print("/");
    input_day = inputString.substring(7, 9);
    Serial.print(input_day);
    Serial.print("   ");
    input_hour = inputString.substring(9, 11);
    Serial.print(input_hour);
    Serial.print(":");
    input_min = inputString.substring(11, 13);
    Serial.println(input_min);
  }
 
  //to int
  year_int = input_year.toInt();
  month_int = input_month.toInt();
  day_int = input_day.toInt();
  hour_int = input_hour.toInt();
  min_int = input_min.toInt();
}
 

⑤ loop문에서 알람시간 체크하기
 loop문에서 내가 설정한 알람시간과 현재시간이 일치하는지 체크합니다.
시리얼창에서 입력한 알람시간과 RTC에서 보내주는 현재시간과 일치하는지 확인하기 위해
timeConverter함수를 써서 자료형을 일치시켰습니다.
만약 일치할 경우 알람을 울립니다.

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
 
void loop() {
 
  if (stringComplete) {
    Serial.println(inputString);
    timeConverter();
    inputString = "";
    stringComplete = false;
  }
 
  if (RTC.read(tm)) {
    if (tmYearToCalendar(tm.Year) == year_int && tm.Month == month_int && tm.Day == day_int && tm.Hour == hour_int && tm.Minute == min_int) {
      Serial.println("Wake up!!!!!!");
      alarm();
    } else {
      Serial.println("Not yet");
    }
    Serial.print("computer : ");
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.print("/");
    Serial.print(tm.Month);
    Serial.print("/");
    Serial.print(tm.Day);
    Serial.print("  ");
    Serial.print(tm.Hour);
    Serial.print(":");
    Serial.print(tm.Minute);
    Serial.println();
  }
  delay(1000);
}
 




5. 수행결과
제가 설정한 시간(6시 30분)이 되자 알람이 울립니다. 
어서 일어나라규!







6. 다음과제
→ 스마트폰 블루투스 어플에서 알람시간 설정하기 & 알람 멈추기
오늘은 PC 시리얼통신으로 알람을 설정했는데요~
다음 시간엔 스마트폰 블루투스로 알람시간을 설정하도록 하겠습니다.
또 지금은 알람소리를 멈추는 기능이 없습니다.
다음 시간엔 스마트폰 어플에서 멈춤 신호를 보내면 소리가 꺼지도록 만들어 보겠습니다.


댓글 0

MADE BY

조혜인

arduino, processing, rhino, sketchup, 아두이노, 에프터이펙트, 포토샵, 프리미어