Bläddra i källkod

Winter/Summer Time switch.

Vladimir Shilov 5 år sedan
förälder
incheckning
70898bad63
4 ändrade filer med 51 tillägg och 1 borttagningar
  1. 4 0
      ReadMe.txt
  2. 1 0
      inc/ds3231.h
  3. 12 0
      src/ds3231.c
  4. 34 1
      src/main.c

+ 4 - 0
ReadMe.txt

@@ -51,4 +51,8 @@ My Nixie Clock IN-12 / Мои часы на ГРИ ИН-12
 ---
 2019.06.03
 Продолжаем.
+
 Пониженная яркость с 22:00 до 06:00.
+
+Переход на зимнее/летенее время. Есть нюанс - если запускать прошивку в зимнее 
+время - будет работать неправильно. Доделывать лень - и так норм.

+ 1 - 0
inc/ds3231.h

@@ -89,6 +89,7 @@ void RTC_ReadCalendar(rtc_t * data);
 
 void RTC_WriteAll(rtc_t * data);
 void RTC_WriteTime(rtc_t * data);
+void RTC_WriteHHMM(rtc_t * data);
 void RTC_WriteCalendar(rtc_t * data);
 
 uint8_t bcd2bin(uint8_t bcd);

+ 12 - 0
src/ds3231.c

@@ -100,6 +100,18 @@ void RTC_WriteTime(rtc_t * data) {
   I2C_Stop();
 }
 
+/**
+ * @brief Запись часов и минут
+ */
+void RTC_WriteHHMM(rtc_t * data) {
+  I2C_Start();
+  I2C_WriteByte(DS3231_I2C_WRADDR);
+  I2C_WriteByte(DS3231_TIME_CAL_ADDR + 1);
+  I2C_WriteByte(data->Min);
+  I2C_WriteByte(data->Hr);
+  I2C_Stop();
+}
+
 /**
  * @brief Запись календаря
  */

+ 34 - 1
src/main.c

@@ -49,6 +49,7 @@ static btn_t Button[BTN_NUM] = {
 static volatile uint8_t DISP_WDT = 0;
 static EEMEM uint8_t EEP_Bright;
 static uint8_t Bright;
+static EEMEM uint8_t EEP_SunTime;
 
 /* Constants */
 /* Function prototypes */
@@ -58,6 +59,7 @@ static void btnProcess(void);
 static void valIncrease(uint8_t * val, uint8_t max);
 static void valDecrease(uint8_t * val, uint8_t max);
 static void blink(void);
+static void setSunWinterTime(void);
 
 void main(void) {
   /**
@@ -72,6 +74,7 @@ void main(void) {
   Flag.blink3 = 0;
   Flag.blinkC = 0;
   Flag.saveEEP = 0;
+
   Bright = eeprom_read_byte(&EEP_Bright);
 
   /**
@@ -102,6 +105,7 @@ void main(void) {
 
       RTC_ReadTime(&RTC);
       if (RTC.Sec == 0 && RTC.Min == 0) {
+        // begin of new hour
         if (RTC.Hr == 0) {
           RTC_ReadCalendar(&RTC);
           ES_PlaceEvent(evRefreshCal);
@@ -111,7 +115,9 @@ void main(void) {
         } else {
           OCR2 = Bright;
         }
-      }
+
+        setSunWinterTime();
+      } // begin new hour
 
       if (DISP_WDT != 0) {
         DISP_WDT --;
@@ -176,6 +182,33 @@ static void Board_Init(void) {
   sei();
 }
 
+/**
+ * @brief Correct current time for Sun or Winter
+ */
+static void setSunWinterTime(void) {
+  uint8_t sunTime = eeprom_read_byte(&EEP_SunTime);
+
+  /* Переход на летнее время */
+  if ((RTC.Mon == 3) && (RTC.WD == 7) && (RTC.Hr == 3) && (sunTime != 0)) {
+    if ((RTC.Day + 7) > 31) {
+      RTC.Hr = 4;
+      RTC_WriteHHMM(&RTC);
+      sunTime = 0;
+    }
+  }
+
+  /* Переход на зимнее время */
+  if ((RTC.Mon == 10) && (RTC.WD == 7) && (RTC.Hr == 4) && (sunTime == 0)) {
+    if ((RTC.Day + 7) > 31) {
+      RTC.Hr = 3;
+      RTC_WriteHHMM(&RTC);
+      sunTime = 1;
+    }
+  }
+
+  eeprom_update_byte(&EEP_SunTime, sunTime);
+}
+
 static void dotOn(void) {
   PORTD |= DOT_PIN;
 }