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

Committer:
charly
Date:
Mon Nov 06 20:47:56 2017 +0000
Revision:
7:10b0f6ee5047
Parent:
4:ed0ac1dd6ae4
added support for automatic switch between DST and back. Only valid for europe.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charly 1:23535cfbf924 1 // Wordclock with WS2812-LED-Stripe
charly 1:23535cfbf924 2 // with 11x10 LED-Matrix and 4 minute-LEDS
charly 4:ed0ac1dd6ae4 3 // and DS3231 RTC
morecat_lab 0:afb6ebe20c1f 4 /*
morecat_lab 0:afb6ebe20c1f 5
charly 1:23535cfbf924 6 ESKISTLFÜNF
charly 1:23535cfbf924 7 ZEHNZWANZIG
charly 1:23535cfbf924 8 DREIVIERTEL
charly 1:23535cfbf924 9 TGNACHVORJM
charly 1:23535cfbf924 10 HALBXZWÖLFP
charly 1:23535cfbf924 11 ZWEINSIEBEN
charly 1:23535cfbf924 12 KDREIRHFÜNF
charly 1:23535cfbf924 13 ELFNEUNVIER
charly 1:23535cfbf924 14 WACHTZEHNRS
charly 1:23535cfbf924 15 BSECHSFMUHR
charly 2:d39f37d64441 16 ****
charly 1:23535cfbf924 17 */
morecat_lab 0:afb6ebe20c1f 18
morecat_lab 0:afb6ebe20c1f 19
morecat_lab 0:afb6ebe20c1f 20 #include "mbed.h"
morecat_lab 0:afb6ebe20c1f 21 #include "neopixel.h"
charly 1:23535cfbf924 22 #include "WordClock.h"
charly 4:ed0ac1dd6ae4 23 #include "ds3231.h"
morecat_lab 0:afb6ebe20c1f 24
charly 7:10b0f6ee5047 25 /** add simple DST info to nvram of ds3231
charly 7:10b0f6ee5047 26 * we abuse bit RS1(bit3) from control-register which normally controls frequency of output-pin
charly 7:10b0f6ee5047 27 */
charly 7:10b0f6ee5047 28 class Ds3231_dst : public Ds3231
charly 7:10b0f6ee5047 29 {
charly 7:10b0f6ee5047 30 public:
charly 7:10b0f6ee5047 31 Ds3231_dst(PinName sda, PinName scl) : Ds3231(sda,scl) {}
morecat_lab 0:afb6ebe20c1f 32
charly 7:10b0f6ee5047 33 /** set_DST(bool dst)
charly 7:10b0f6ee5047 34 */
charly 7:10b0f6ee5047 35 uint16_t set_DST(bool dst) {
charly 7:10b0f6ee5047 36 ds3231_cntl_stat_t data = {0xAA, 0xAA};
charly 7:10b0f6ee5047 37 uint16_t rtn_val;
charly 7:10b0f6ee5047 38 // first read CR
charly 7:10b0f6ee5047 39 rtn_val = get_cntl_stat_reg(&data);
charly 7:10b0f6ee5047 40 // applay dst
charly 7:10b0f6ee5047 41 if (dst) {
charly 7:10b0f6ee5047 42 data.control |= 1<<3;
charly 7:10b0f6ee5047 43 } else {
charly 7:10b0f6ee5047 44 data.control &= ~(1<<3);
charly 7:10b0f6ee5047 45 }
charly 7:10b0f6ee5047 46 //write back
charly 7:10b0f6ee5047 47 rtn_val = set_cntl_stat_reg(data);
charly 7:10b0f6ee5047 48 return 0;
charly 7:10b0f6ee5047 49 }
charly 7:10b0f6ee5047 50 /** bool get_DST()
charly 7:10b0f6ee5047 51 */
charly 7:10b0f6ee5047 52 bool get_DST() {
charly 7:10b0f6ee5047 53 ds3231_cntl_stat_t data = {0xAA, 0xAA};
charly 7:10b0f6ee5047 54 uint16_t rtn_val;
charly 7:10b0f6ee5047 55 // first read CR
charly 7:10b0f6ee5047 56 rtn_val = get_cntl_stat_reg(&data);
charly 7:10b0f6ee5047 57 // get dst
charly 7:10b0f6ee5047 58 if (data.control & (1<<3)) {
charly 7:10b0f6ee5047 59 return true;
charly 7:10b0f6ee5047 60 } else {
charly 7:10b0f6ee5047 61 return false;
charly 7:10b0f6ee5047 62 }
charly 7:10b0f6ee5047 63 }
charly 7:10b0f6ee5047 64 };
morecat_lab 0:afb6ebe20c1f 65
charly 2:d39f37d64441 66 int main()
charly 2:d39f37d64441 67 {
charly 1:23535cfbf924 68
charly 1:23535cfbf924 69 // WordClock object with leds connected to p5 (MOSI)
charly 2:d39f37d64441 70 WordClock clock(p5);
charly 1:23535cfbf924 71
charly 4:ed0ac1dd6ae4 72 //RTC with DS3231 : sda, scl
charly 7:10b0f6ee5047 73 Ds3231_dst rtc(p9, p10);
charly 4:ed0ac1dd6ae4 74
charly 1:23535cfbf924 75 Timer timer;
charly 7:10b0f6ee5047 76
charly 7:10b0f6ee5047 77 //DaylightSavingTIme?
charly 7:10b0f6ee5047 78 bool DST = false;
charly 2:d39f37d64441 79
charly 7:10b0f6ee5047 80 //Serial pc(USBTX, USBRX); // tx, rx
charly 4:ed0ac1dd6ae4 81 {
charly 7:10b0f6ee5047 82 //pc.baud(115200);
charly 7:10b0f6ee5047 83 //pc.printf("\n\rconnected to mbed - WordClock...\n\r");
charly 7:10b0f6ee5047 84
charly 4:ed0ac1dd6ae4 85 // set time and date
charly 4:ed0ac1dd6ae4 86 //time and calendar variables
charly 7:10b0f6ee5047 87 ds3231_time_t time = {0, 39, 21, 0, 0}; //sec, min, hour, am/pm(1=pm), mode(1=12h)
charly 7:10b0f6ee5047 88 ds3231_calendar_t calendar = {1, 6, 11, 17}; //day(1=mon), date, month, year(2 digits)
charly 4:ed0ac1dd6ae4 89 uint16_t rtn_val;
charly 4:ed0ac1dd6ae4 90 // only set RTC when required!
charly 7:10b0f6ee5047 91 // rtn_val = rtc.set_time(time);
charly 7:10b0f6ee5047 92 // rtn_val = rtc.set_calendar(calendar);
charly 7:10b0f6ee5047 93 // rtn_val = rtc.set_DST(false);
charly 7:10b0f6ee5047 94
charly 7:10b0f6ee5047 95 // initial display
charly 7:10b0f6ee5047 96
charly 7:10b0f6ee5047 97 // show Winterzeit/Sommerzeit as stored in RTC
charly 7:10b0f6ee5047 98 if (rtc.get_DST()){
charly 7:10b0f6ee5047 99 // SZ for Sommerzeit
charly 7:10b0f6ee5047 100 clock.sz();
charly 7:10b0f6ee5047 101 DST = true;
charly 7:10b0f6ee5047 102 }else{
charly 7:10b0f6ee5047 103 //WZ for Winterzeit
charly 7:10b0f6ee5047 104 clock.wz();
charly 7:10b0f6ee5047 105 DST = false;
charly 7:10b0f6ee5047 106 }
charly 7:10b0f6ee5047 107 wait(2);
charly 7:10b0f6ee5047 108
charly 7:10b0f6ee5047 109 while (1) { //display loop
charly 7:10b0f6ee5047 110
charly 7:10b0f6ee5047 111 //read time
charly 7:10b0f6ee5047 112 rtn_val = rtc.get_time(&time);
charly 7:10b0f6ee5047 113 //pc.printf("%2d:%2d ",time.hours,time.minutes);
charly 7:10b0f6ee5047 114
charly 7:10b0f6ee5047 115 // read date
charly 7:10b0f6ee5047 116 rtn_val = rtc.get_calendar(&calendar);
charly 7:10b0f6ee5047 117 //pc.printf("%2d.%2d.%2d - day:%d \n\r",calendar.date, calendar.month,calendar.year, calendar.day);
charly 7:10b0f6ee5047 118
charly 1:23535cfbf924 119
charly 7:10b0f6ee5047 120 // check for DST time change
charly 7:10b0f6ee5047 121 // only valid for europe!!!
charly 7:10b0f6ee5047 122 // see http://www.instructables.com/id/The-Arduino-and-Daylight-Saving-Time-Europe/
charly 7:10b0f6ee5047 123
charly 7:10b0f6ee5047 124 //switch to ~DST on last sunday in october
charly 7:10b0f6ee5047 125 if (calendar.day == 7 && calendar.month == 10 && calendar.date >= 25 && time.hours == 3 && DST==true){
charly 7:10b0f6ee5047 126 time.hours=2;
charly 7:10b0f6ee5047 127 DST=false;
charly 7:10b0f6ee5047 128 rtc.set_time(time);
charly 7:10b0f6ee5047 129 rtc.set_DST(DST);
charly 7:10b0f6ee5047 130 //show WZ
charly 7:10b0f6ee5047 131 clock.wz();
charly 7:10b0f6ee5047 132 wait(2);
charly 7:10b0f6ee5047 133 }
charly 7:10b0f6ee5047 134 //switch to DST on last sunday in march
charly 7:10b0f6ee5047 135 if (calendar.day == 7 && calendar.month == 3 && calendar.date >= 25 && time.hours == 2 && DST==false){
charly 7:10b0f6ee5047 136 time.hours=3;
charly 7:10b0f6ee5047 137 DST=true;
charly 7:10b0f6ee5047 138 rtc.set_time(time);
charly 7:10b0f6ee5047 139 rtc.set_DST(DST);
charly 7:10b0f6ee5047 140 //show SZ
charly 7:10b0f6ee5047 141 clock.sz();
charly 7:10b0f6ee5047 142 wait(2);
charly 7:10b0f6ee5047 143 }
charly 7:10b0f6ee5047 144
charly 7:10b0f6ee5047 145 //display time
charly 4:ed0ac1dd6ae4 146 clock.display_time(time.hours,time.minutes,time.seconds);
charly 7:10b0f6ee5047 147 wait_ms(100);
charly 4:ed0ac1dd6ae4 148 }
charly 4:ed0ac1dd6ae4 149
charly 4:ed0ac1dd6ae4 150 //testprograms from here on
charly 2:d39f37d64441 151
charly 2:d39f37d64441 152 timer.start();
charly 2:d39f37d64441 153
charly 2:d39f37d64441 154 while(1) {
charly 3:ebe0c4fa97b8 155 // time fast forward
charly 3:ebe0c4fa97b8 156 for (int h=0; h<=23; h++) {
charly 3:ebe0c4fa97b8 157 for (int m=0; m<=59; m++) {
charly 7:10b0f6ee5047 158 for (int s=0; s<=59; s++) {
charly 4:ed0ac1dd6ae4 159 clock.display_time(h,m,s);
charly 4:ed0ac1dd6ae4 160 wait_ms(5);
charly 4:ed0ac1dd6ae4 161 }
charly 3:ebe0c4fa97b8 162 }
charly 3:ebe0c4fa97b8 163 }
charly 3:ebe0c4fa97b8 164
charly 2:d39f37d64441 165 // all words
charly 3:ebe0c4fa97b8 166 for (int i=1; i<=NUMWORDS; i++) {
charly 2:d39f37d64441 167 clock.test_display(3,i);
charly 3:ebe0c4fa97b8 168 wait_ms(800);
charly 3:ebe0c4fa97b8 169 }
charly 2:d39f37d64441 170 //all leds on with rainbow colors
charly 2:d39f37d64441 171 while ( int(timer.read()/10.0) %2 == 0) {
charly 2:d39f37d64441 172 clock.test_display(1);
charly 2:d39f37d64441 173 wait_ms(100);
charly 2:d39f37d64441 174 }
charly 2:d39f37d64441 175 // every led on for 250ms
charly 3:ebe0c4fa97b8 176 for (int i=0; i<NUMLEDS; i++) {
charly 3:ebe0c4fa97b8 177 clock.test_display(2,i);
charly 3:ebe0c4fa97b8 178 wait_ms(250);
charly 3:ebe0c4fa97b8 179 }
charly 2:d39f37d64441 180 timer.reset();
charly 1:23535cfbf924 181 }
morecat_lab 0:afb6ebe20c1f 182 }
charly 2:d39f37d64441 183
morecat_lab 0:afb6ebe20c1f 184 }