반응형
지금 까지 달력, 날짜에 대한 정의를 내리고 객체까지 만들어 봤다.
물론 더 할것이 있다. 귀찮아서 안한것도 분명히 있다.
아래 3개 정도는 직접 만들어 보기 바란다. 그냥 비어 있는것으로...
Calendar operator- (const Calendar &)
{
int y,m,d, hr, mi, se;
return Calendar(y,m,d, hr, mi, se);
};
Calendar operator- (int sec)
{
int y,m,d, hr, mi, se;
return Calendar(y,m,d, hr, mi, se);
};
Calendar operator+ (int sec)
{
int y,m,d, hr, mi, se;
return Calendar(y,m,d, hr, mi, se);
};
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
그리고 마지막으로 이야기 하고 싶은것은
loop 혹은 main 함수만 보면 전체 코드가 이해 할 수 있게 코딩하면 된다.
본인은 보통 소설을 쓰지 말라고 한다.
장황하게 길게 만드는 코딩을 이야기 한다.
모르는 사람도 척 보면 이해 할 수 있는 코딩이 최고의 코딩이다.
내부적인 원리나 동작은 중요하지도 않고 관심도 없다.
전체 코드가 잘 계산해서 돌아가는것만 관심이 있다.
이게 코딩의 기본이라는것을 처음하는분들에게 이야기 하고 싶다.
<최종 전체코드>
#include <SoftwareSerial.h>
#include <Wire.h>
#define DS3231_I2C_ADDRESS 104
// 데이터핀 연결
// SCL - pin A5
// SDA - pin A4
class Calendar
{
private :
union
{
int s[6];
struct
{
int year;
int month;
int day;
int hour;
int minute;
int second;
};
};
public:
Calendar()
{
year = 0;
month = 0;
day = 0;
hour = 0;
minute = 0;
second = 0;
};
Calendar(int y,int m, int d, int hr, int mi, int se)
{
year = y;
month = m;
day = d;
hour = hr;
minute = mi;
second = se;
}
Calendar operator+ (const Calendar &r)
{
int y,m,d, hr, mi, se;
int months[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
hr = hour;
mi = minute;
se = second;
d = day;
m = month;
y = year;
if(((y% 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) months[2]=29;
se += r.second;
while(se >= 60)
{
se -= 60;
mi += 1;
}
mi += r.minute;
while(mi >= 60)
{
mi -= 60;
hr += 1;
}
hr += r.hour;
while(hr >= 24)
{
hr -= 24;
d += 1;
}
d += r.day;
while(d > months[m])
{
d -= months[m];
m++;
if(m >12)
{
m = 1;
y += 1;
if(((y% 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) months[2]=29;
else months[2]=28;
}
}
m += r.month;
while(m > 12)
{
m -=12;
y++;
}
y += r.year;
if(((y% 4 == 0) && (y % 100 != 0)) || (y % 400 == 0)) months[2]=29;
else months[2]=28;
if(d > months[m]) d = months[m];
return Calendar(y,m,d, hr, mi, se);
};
Calendar operator- (const Calendar &)
{
int y,m,d, hr, mi, se;
return Calendar(y,m,d, hr, mi, se);
};
Calendar operator- (int sec)
{
int y,m,d, hr, mi, se;
return Calendar(y,m,d, hr, mi, se);
};
Calendar operator+ (int sec)
{
int y,m,d, hr, mi, se;
return Calendar(y,m,d, hr, mi, se);
};
friend bool operator == (const Calendar &l, const Calendar &r)
{
for(int i = 0; i < 6; i++)
{
if (l.s[i] != r.s[i]) return false;
}
return true;
};
friend bool operator > (const Calendar &l, const Calendar &r)
{
for(int i = 0; i < 6; i++)
{
if (l.s[i] > r.s[i]) return true;
else if (l.s[i] < r.s[i]) return false;
}
return false;
};
friend bool operator < (const Calendar &l, const Calendar &r)
{
for(int i = 0; i < 6; i++)
{
if (l.s[i] < r.s[i]) return true;
else if (l.s[i] > r.s[i]) return false;
}
return false;
};
void print(HardwareSerial& sw)
{
char buf[30];
sprintf(buf, "%4d/%02d/%02d - %02d:%02d:%02d", year, month, day, hour, minute, second);
}
};
byte seconds, minutes, hours, day, date, month, year;
void get3231Date()
{
// send request to receive data starting at register 0
Wire.beginTransmission(DS3231_I2C_ADDRESS); // 104 is DS3231 device address
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes
if(Wire.available())
{
day = Wire.read();
date = Wire.read();
year = Wire.read();
seconds = (((seconds & B11110000)>>4)*10 + (seconds & B00001111)); // convert BCD to decimal
minutes = (((minutes & B11110000)>>4)*10 + (minutes & B00001111)); // convert BCD to decimal
hours = (((hours & B00110000)>>4)*10 + (hours & B00001111)); // convert BCD to decimal (assume 24 hour mode)
day = (day & B00000111); // 1-7
date = (((date & B00110000)>>4)*10 + (date & B00001111)); // 1-31
month = (((month & B00010000)>>4)*10 + (month & B00001111)); //msb7 is century overflow
year = (((year & B11110000)>>4)*10 + (year & B00001111));
}
else
{
//oh noes, no data!
}
}
void setup()
{
Wire.begin();
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
get3231Date();
Calendar cdt(2000+year, month, date, hours, minutes, seconds);
Calendar todt = cdt + Calendar(1, 2, 3, 4, 5, 6);
Serial.print("-------");
Serial.println();
delay(1000);
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
'아두이노' 카테고리의 다른 글
아두이노 이더넷 웹서버 만들기 -#1 (0) | 2020.04.05 |
---|---|
아두이노와 7세그먼트(잡담) (0) | 2020.03.29 |
아두이노와 달력 - #13 (0) | 2020.03.07 |
아두이노와 달력 - #12 (0) | 2020.03.07 |
아두이노와 달력 - #11 (0) | 2020.03.07 |
댓글