WordClock-Program to display time in words on WS2812B-LED-Stripe. With DS3231 RTC

Dependencies:   PixelArray WordClock_de ds3231 mbed

Fork of mbed_ws2812b by Yoshitaka Kuwata

WordClock

Yet another wordclock...

Program for displaying time in (german) words on WS2812B LED-Matrix. Uses DS3231 RTC .

/media/uploads/charly/20171105_220942.jpg

/media/uploads/charly/20171101_112354.jpg

More fotos see:

https://photos.app.goo.gl/mSN6G145IdupbKv13

Revision:
7:10b0f6ee5047
Parent:
4:ed0ac1dd6ae4
--- a/main.cpp	Sun Nov 05 20:36:48 2017 +0000
+++ b/main.cpp	Mon Nov 06 20:47:56 2017 +0000
@@ -22,10 +22,46 @@
 #include "WordClock.h"
 #include "ds3231.h"
 
+/** add simple DST info to nvram of ds3231
+* we abuse bit RS1(bit3) from control-register which normally controls frequency of output-pin
+*/
+class Ds3231_dst : public Ds3231
+{
+public:
+    Ds3231_dst(PinName sda, PinName scl) : Ds3231(sda,scl) {}
 
-// brigtness beween 0 and 1.0
-#define BRIGHTNESS 0.5
-
+/** set_DST(bool dst)
+*/      
+    uint16_t set_DST(bool dst) {
+        ds3231_cntl_stat_t data = {0xAA, 0xAA};
+        uint16_t rtn_val;
+        // first read CR
+        rtn_val = get_cntl_stat_reg(&data);
+        // applay dst
+        if (dst) {
+            data.control |= 1<<3;
+        } else {
+            data.control &= ~(1<<3);
+        }
+        //write back
+        rtn_val = set_cntl_stat_reg(data);
+        return 0;
+    }
+/** bool get_DST()
+*/
+    bool get_DST() {
+        ds3231_cntl_stat_t data = {0xAA, 0xAA};
+        uint16_t rtn_val;
+        // first read CR
+        rtn_val = get_cntl_stat_reg(&data);
+        // get dst
+        if (data.control & (1<<3)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+};
 
 int main()
 {
@@ -34,25 +70,81 @@
     WordClock clock(p5);
 
     //RTC with DS3231 : sda, scl
-    Ds3231 rtc(p9, p10);
+    Ds3231_dst rtc(p9, p10);
 
     Timer timer;
+    
+    //DaylightSavingTIme?
+    bool DST = false;
 
+    //Serial pc(USBTX, USBRX); // tx, rx
     {
+        //pc.baud(115200);
+        //pc.printf("\n\rconnected to mbed - WordClock...\n\r");
+        
         // set time and date
         //time and calendar variables
-        ds3231_time_t time = {0, 47, 20, 0, 0};      //sec, min, hour, am/pm(1=pm), mode(1=12h)
-        ds3231_calendar_t calendar = {7, 5, 11, 2017};  //day(1=mon), date, month, year
+        ds3231_time_t time = {0, 39, 21, 0, 0};      //sec, min, hour, am/pm(1=pm), mode(1=12h)
+        ds3231_calendar_t calendar = {1, 6, 11, 17};  //day(1=mon), date, month, year(2 digits)
         uint16_t rtn_val;
         // only set RTC when required!
-        //rtn_val = rtc.set_time(time);
-        //rtn_val = rtc.set_calendar(calendar);
+//        rtn_val = rtc.set_time(time);
+//        rtn_val = rtc.set_calendar(calendar);
+//        rtn_val = rtc.set_DST(false);
+
+        // initial display
+
+        // show Winterzeit/Sommerzeit as stored in RTC
+        if (rtc.get_DST()){
+            // SZ for Sommerzeit
+            clock.sz();
+            DST = true;
+        }else{
+            //WZ for Winterzeit
+            clock.wz();
+            DST = false;
+        }
+        wait(2); 
+
+        while (1) { //display loop
+
+            //read time 
+            rtn_val = rtc.get_time(&time);
+            //pc.printf("%2d:%2d ",time.hours,time.minutes);
+
+            // read date
+            rtn_val = rtc.get_calendar(&calendar);
+            //pc.printf("%2d.%2d.%2d - day:%d \n\r",calendar.date, calendar.month,calendar.year, calendar.day);
+            
 
-        while (1) {
-            //read time an show on LED
-            rtn_val = rtc.get_time(&time);
+            // check for DST time change 
+            // only valid for europe!!!
+            // see http://www.instructables.com/id/The-Arduino-and-Daylight-Saving-Time-Europe/
+
+            //switch to ~DST on last sunday in october
+            if (calendar.day == 7 && calendar.month == 10 && calendar.date >= 25 && time.hours == 3 && DST==true){
+                time.hours=2;
+                DST=false;
+                rtc.set_time(time);
+                rtc.set_DST(DST);
+                //show WZ
+                clock.wz();
+                wait(2);
+            }
+            //switch to DST on last sunday in march
+            if (calendar.day == 7 && calendar.month == 3 && calendar.date >= 25 && time.hours == 2 && DST==false){
+                time.hours=3;
+                DST=true;
+                rtc.set_time(time);
+                rtc.set_DST(DST);
+                //show SZ
+                clock.sz();
+                wait(2);
+            }
+            
+            //display time
             clock.display_time(time.hours,time.minutes,time.seconds);
-            wait_ms(10);
+            wait_ms(100);
         }
 
         //testprograms from here on
@@ -63,7 +155,7 @@
             // time fast forward
             for (int h=0; h<=23; h++) {
                 for (int m=0; m<=59; m++) {
-                    for (int s=0;s<=59;s++){
+                    for (int s=0; s<=59; s++) {
                         clock.display_time(h,m,s);
                         wait_ms(5);
                     }