본문 바로가기
아두이노

아두이노와 달력 - #최종

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

지금 까지 달력, 날짜에 대한 정의를 내리고 객체까지 만들어 봤다.

물론 더 할것이 있다. 귀찮아서 안한것도 분명히 있다.

아래 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[] = {0312831303130313130313031};
 
      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.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!
  }
}
 
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(123456);
       
    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

댓글