반응형
사실 많이 있지만, 할 것은 많이 남지 않았다.
여기 까지 따라 왔다면 힘내기 바란다.
앞으로 해야 할 것에 대한 이야기다.
날짜 + 날짜, 날짜 -날짜에 대한 이야기다.
우리는 특정 날짜 시간 + 30분후, 혹은 5분전이라는 표현을 간혹 사용한다.
그러면 날짜에 +30하면 될까 ? 혹은 날짜 -5 하면 될까 ?
물론 안된다.
사람은 논리적으로 이해 하지만 날짜에 대한 사칙연산은 정의 되어 있지 않다.
그렇다 날짜에 대한 사칙연산을 적용해야 할 떄가 온것이다.
곰곰히 생각해 보고 한번 만들어 보기 바란다.
그리고,
이전코드의 전체 코드 이다.
#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 &)
{
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;
};
};
char weekDay[4];
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!
}
switch (day)
{
case 1:
strcpy(weekDay, "Sun");
break;
case 2:
strcpy(weekDay, "Mon");
break;
case 3:
strcpy(weekDay, "Tue");
break;
case 4:
strcpy(weekDay, "Wed");
break;
case 5:
strcpy(weekDay, "Thu");
break;
case 6:
strcpy(weekDay, "Fri");
break;
case 7:
strcpy(weekDay, "Sat");
break;
}
}
void setup()
{
Wire.begin();
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
char buf[50];
char*p = buf;
Calendar sdt(2020, 3, 1, 2, 3, 0);
Calendar edt(2020, 4, 2, 2, 3, 0);
get3231Date();
Calendar cdt(2000+year, month, date, hours, minutes, seconds);
p+= sprintf(p, "%4s 20%2d/%2d/%2d - %2d:%2d:%2d ", weekDay, year, month, date, hours, minutes, seconds);
if( cdt > sdt && cdt < edt)
{
digitalWrite(LED_BUILTIN, HIGH);
p+= sprintf(p, "LED ON");
}
else
{
digitalWrite(LED_BUILTIN, LOW);
p+= sprintf(p, "LED off");
}
Serial.println(buf);
delay(1000);
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
'아두이노' 카테고리의 다른 글
아두이노와 달력 - #12 (0) | 2020.03.07 |
---|---|
아두이노와 달력 - #11 (0) | 2020.03.07 |
아두이노와 달력 - #9 (0) | 2020.03.05 |
아두이노와 달력 - #8 (0) | 2020.03.05 |
아두이노와 달력 - #7 (0) | 2020.03.05 |
댓글