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
WordClock
Yet another wordclock...
Program for displaying time in (german) words on WS2812B LED-Matrix. Uses DS3231 RTC .
More fotos see:
https://photos.app.goo.gl/mSN6G145IdupbKv13
main.cpp@8:fb636d513c5d, 2017-11-07 (annotated)
- Committer:
- charly
- Date:
- Tue Nov 07 18:28:04 2017 +0000
- Revision:
- 8:fb636d513c5d
- Parent:
- 7:10b0f6ee5047
UHR only on full hours
Who changed what in which revision?
User | Revision | Line number | New 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 | } |