알람시계 요일 설정하기(RTC 1307)

by 조혜인 | 2017-03-27 17:39
arduino BLE blynk iot mp3 rtc 노래 블루투스 시계 아두이노 알람 알람설정


보통 스마트폰으로 알람 설정을 하는 경우, 날짜보다는 '요일'을 이용합니다. 그래서 요일 계산하는 코드를 추가했습니다. blynk앱으로 '요일'과 '시간'을 설정하면, 정해둔 '요일'과 '시간'에 빛으로 알람이 울리게 됩니다.


1-1. 하드웨어 연결

첫번째 스토리에서 했던 것과 같이 연결합니다.


     아두이노Pin      Tiny RTC(DS1307)
A5SCL
A4SDA
5VVCC
GNDGND



2. 코드설명

2-1. 현재 시간 저장하기

일단 현재 시간을 RTC 모듈에 저장합니다. 

(첫번째 스토리 참고)


2-2. 요일 계산하기

기존의 자바코드(출처 : http://jizard.tistory.com/26)를 아두이노로 변형했습니다.

1900년 1월 1일(월요일)을 기준으로 요일을 계산합니다.

기준일자인 1900년 1월 1일로 부터 현재 날짜까지 총 몇일 지났는지 계산한 후, 그 일수를 7로 나눈 나머지로 몇요일인지 판단합니다. 

1/3/5/7/8/10/12 월이라면 31일, 아니라면 30일, 평년 2월달이라면 28일, 윤년 2월달이라면 29일로 조건에 따라 날짜가 들어갑니다.


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
#include <Wire.h>
#include <Time.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
 
void setup() {
  Serial.begin(9600);
  while (!Serial) ; // wait for serial
  delay(200);
  Serial.println("DS1307RTC Read Test");
  Serial.println("-------------------");
}
 
void loop() {
  tmElements_t tm;
 
  if (RTC.read(tm)) {
    Serial.print("Ok, Time = ");
    print2digits(tm.Hour);
    Serial.write(':');
    print2digits(tm.Minute);
    Serial.write(':');
    print2digits(tm.Second);
    Serial.print(", Date (D/M/Y) = ");
    Serial.print(tm.Day);
    Serial.write('/');
    Serial.print(tm.Month);
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));
    Serial.println();
    String DOW = DayofDate(tmYearToCalendar(tm.Year), tm.Month, tm.Day);
    Serial.println(DOW);
  } else {
    if (RTC.chipPresent()) {
      Serial.println("The DS1307 is stopped.  Please run the SetTime");
      Serial.println("example to initialize the time and begin running.");
      Serial.println();
    } else {
      Serial.println("DS1307 read error!  Please check the circuitry.");
      Serial.println();
    }
    delay(9000);
  }
  delay(1000);
}
 
void print2digits(int number) {
  if (number >= 0 && number < 10) {
    Serial.write('0');
  }
  Serial.print(number);
}
 
String DayofDate(int y, int m, int d) {
  String DOW = " ";
  long totalDay = 0;
  for (int i = 1900; i <= y; i++) {
    //입력 년도 이전 까지는 12월 까지 다 더함
    if (i < y) {
      for (int j = 1; j <= 12; j++) {
        totalDay += MonthDays(i, j);
      }
      //입력 년도는 입력 월 이전까지 더함
    } else {
      for (int j = 1; j < m; j++) {
        totalDay += MonthDays(i, j);
      }
    }
  }
  //나머지 일 수를 구해진 전체 일수에 더함
  totalDay += d;
  //기준일인 1900년 1월 1일이 월요일이므로
  switch (totalDay % 7) {
    case 0:
      DOW = "Sunday";
      break;
    case 1:
      DOW = "Monday";
      break;
    case 2:
      DOW = "Tuesday";
      break;
    case 3:
      DOW = "Wednesday";
      break;
    case 4:
      DOW = "Thursday";
      break;
    case 5:
      DOW = "Friday";
      break;
    case 6:
      DOW = "Saturday";
      break;
  }
  return DOW;
}
 
int MonthDays(int y, int m) {
  int dayOfMonth = 0;
  //윤년일 조건
  boolean ly = ((y % 4 == 0&& (y % 100 != 0)) || y % 400 == 0;
  //31일 일 조건
  boolean is31 = (m == 1|| (m == 3|| (m == 5|| (m == 7)
                 || (m == 8|| (m == 10|| (m == 12);
 
  if (ly && m == 2) {
    dayOfMonth = 29;
  } else if (!ly && m == 2) {
    dayOfMonth = 28;
  } else if (is31) {
    dayOfMonth = 31;
  } else {
    dayOfMonth = 30;
  }
  return dayOfMonth;
}
 
 
cs




3. 마무리

현재시간 (2017년 3월 27일)의 요일을 알려줍니다. 월요일(Monday)이라고 뜨네요.

이제 Blynk앱에서 설정한 요일&시간과 현재 요일&시간이 일치하는지 확인하는 코드를 작성하면 됩니다.



댓글 0

MADE BY

조혜인

arduino, processing, rhino, sketchup, 아두이노, 에프터이펙트, 포토샵, 프리미어
알람시계 요일 설정하기(RTC 1307)현재글 Blynk 앱 완성하기 이전글