본문 바로가기
아두이노

아두이노와 달력 - #10

by 오징어땅콩2 2020. 3. 5.
반응형

사실 많이 있지만, 할 것은 많이 남지 않았다.

여기 까지 따라 왔다면 힘내기 바란다.

앞으로 해야 할 것에 대한 이야기다.

 

날짜 + 날짜, 날짜 -날짜에 대한 이야기다.

우리는 특정 날짜 시간 + 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.write(0x00); // start at register 0
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // request seven bytes
 
  if(Wire.available()) 
  {
    seconds = Wire.read();  // get seconds
    minutes = Wire.read();  // get minutes
    hours   = Wire.read();  // get hours
    day     = Wire.read();
    date    = Wire.read();
    month   = Wire.read(); //temp month
    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*= buf;
 
    Calendar sdt(202031230);
    Calendar edt(202042230); 
    
    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

댓글