Word_clock.ino 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. #include "Wire.h"
  2. #include <FastLED.h>
  3. #define LED_PIN 5
  4. #define NUM_LEDS 98
  5. #define BRIGHTNESS 64
  6. #define LED_TYPE WS2812
  7. #define COLOR_ORDER GRB
  8. #define DS3231_I2C_ADDRESS 0x68
  9. CRGB leds[NUM_LEDS];
  10. CRGB primaryColor = CRGB::White;
  11. byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  12. byte count;
  13. // Convert normal decimal numbers to binary coded decimal
  14. byte decToBcd(byte val)
  15. {
  16. return( (val/10*16) + (val%10) );
  17. }
  18. // Convert binary coded decimal to normal decimal numbers
  19. byte bcdToDec(byte val)
  20. {
  21. return( (val/16*10) + (val%16) );
  22. }
  23. void setup()
  24. {
  25. Wire.begin();
  26. Serial.begin(9600);
  27. FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  28. FastLED.setBrightness( BRIGHTNESS );
  29. count = 0;
  30. // set the initial time here:
  31. // DS3231 seconds, minutes, hours, day, date, month, year
  32. //setDS3231time(30,13,0,5,8,11,18);
  33. }
  34. void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
  35. dayOfMonth, byte month, byte year)
  36. {
  37. // sets time and date data to DS3231
  38. Wire.beginTransmission(DS3231_I2C_ADDRESS);
  39. Wire.write(0); // set next input to start at the seconds register
  40. Wire.write(decToBcd(second)); // set seconds
  41. Wire.write(decToBcd(minute)); // set minutes
  42. Wire.write(decToBcd(hour)); // set hours
  43. Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  44. Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  45. Wire.write(decToBcd(month)); // set month
  46. Wire.write(decToBcd(year)); // set year (0 to 99)
  47. Wire.endTransmission();
  48. }
  49. void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek,
  50. byte *dayOfMonth, byte *month, byte *year)
  51. {
  52. Wire.beginTransmission(DS3231_I2C_ADDRESS);
  53. Wire.write(0); // set DS3231 register pointer to 00h
  54. Wire.endTransmission();
  55. Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  56. // request seven bytes of data from DS3231 starting from register 00h
  57. *second = bcdToDec(Wire.read() & 0x7f);
  58. *minute = bcdToDec(Wire.read());
  59. *hour = bcdToDec(Wire.read() & 0x3f);
  60. *dayOfWeek = bcdToDec(Wire.read());
  61. *dayOfMonth = bcdToDec(Wire.read());
  62. *month = bcdToDec(Wire.read());
  63. *year = bcdToDec(Wire.read());
  64. }
  65. void displayTime()
  66. {
  67. //byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  68. // retrieve data from DS3231
  69. readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  70. &year);
  71. // send it to the serial monitor
  72. Serial.print(hour, DEC);
  73. // convert the byte variable to a decimal number when displayed
  74. Serial.print(":");
  75. if (minute<10)
  76. {
  77. Serial.print("0");
  78. }
  79. Serial.print(minute, DEC);
  80. Serial.print(":");
  81. if (second<10)
  82. {
  83. Serial.print("0");
  84. }
  85. Serial.print(second, DEC);
  86. Serial.print(" ");
  87. Serial.print(dayOfMonth, DEC);
  88. Serial.print("/");
  89. Serial.print(month, DEC);
  90. Serial.print("/");
  91. Serial.print(year, DEC);
  92. Serial.print(" Day of week: ");
  93. switch(dayOfWeek){
  94. case 1:
  95. Serial.println("Sunday");
  96. break;
  97. case 2:
  98. Serial.println("Monday");
  99. break;
  100. case 3:
  101. Serial.println("Tuesday");
  102. break;
  103. case 4:
  104. Serial.println("Wednesday");
  105. break;
  106. case 5:
  107. Serial.println("Thursday");
  108. break;
  109. case 6:
  110. Serial.println("Friday");
  111. break;
  112. case 7:
  113. Serial.println("Saturday");
  114. break;
  115. }
  116. }
  117. void loop()
  118. {
  119. displayTime(); // display the real-time clock data on the Serial Monitor,
  120. readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  121. &year);
  122. setLeds();
  123. FastLED.show();
  124. delay(1000); // every second
  125. }
  126. void setLeds(){
  127. clearAllLeds();
  128. /*
  129. leds[count] = CRGB::White;
  130. count++;
  131. if(count == NUM_LEDS)
  132. count = 0;
  133. */
  134. //byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  135. setIt();
  136. setIs();
  137. setMinutes();
  138. setHours();
  139. setOclock();
  140. }
  141. void clearAllLeds(){
  142. for(int i = 0; i < NUM_LEDS; i++){
  143. leds[i] = CRGB::Black;
  144. }
  145. }
  146. void setIt(){
  147. //if(second & B00000001){
  148. leds[0] = primaryColor;
  149. leds[1] = primaryColor;
  150. //}
  151. }
  152. void setIs(){
  153. leds[2] = primaryColor;
  154. leds[3] = primaryColor;
  155. }
  156. void setMinutes(){
  157. if(minute < 3){
  158. //do nothing
  159. }
  160. else if(minute < 8){
  161. //5 past
  162. setFive();
  163. setMinutesLeds();
  164. setPast();
  165. }
  166. else if(minute < 13){
  167. //10 past
  168. setTen();
  169. setMinutesLeds();
  170. setPast();
  171. }
  172. else if(minute < 18){
  173. //Quarter past
  174. setQuarter();
  175. setPast();
  176. }
  177. else if(minute < 23){
  178. //20 past
  179. setTwenty();
  180. setMinutesLeds();
  181. setPast();
  182. }
  183. else if(minute < 28){
  184. //25 past
  185. setTwenty();
  186. setFive();
  187. setMinutesLeds();
  188. setPast();
  189. }
  190. else if(minute < 33){
  191. //half past
  192. setHalf();
  193. setPast();
  194. }
  195. else if(minute < 38){
  196. //25 to
  197. setTwenty();
  198. setFive();
  199. setMinutesLeds();
  200. setTo();
  201. }
  202. else if(minute < 43){
  203. //20 to
  204. setTwenty();
  205. setMinutesLeds();
  206. setTo();
  207. }
  208. else if(minute < 48){
  209. //Quarter to
  210. setQuarter();
  211. setTo();
  212. }
  213. else if(minute < 53){
  214. //10 to
  215. setTen();
  216. setMinutesLeds();
  217. setTo();
  218. }
  219. else if(minute < 58){
  220. //5 to
  221. setFive();
  222. setMinutesLeds();
  223. setTo();
  224. }
  225. else{
  226. //minutes = 58 or 59
  227. //do nothing
  228. }
  229. }
  230. void setFive(){
  231. //five = leds 24-27
  232. for(int i = 24; i < 28; i++){
  233. leds[i] = primaryColor;
  234. }
  235. }
  236. void setTen(){
  237. //ten = leds 4-6
  238. for(int i = 4; i < 7; i++){
  239. leds[i] = primaryColor;
  240. }
  241. }
  242. void setQuarter(){
  243. //Quarter = leds 17-23
  244. for(int i = 17; i < 24; i++){
  245. leds[i] = primaryColor;
  246. }
  247. }
  248. void setTwenty(){
  249. //twenty = leds 11-16
  250. for(int i = 11; i < 17; i++){
  251. leds[i] = primaryColor;
  252. }
  253. }
  254. void setHalf(){
  255. //half = leds 7-10
  256. for(int i = 7; i < 11; i++){
  257. leds[i] = primaryColor;
  258. }
  259. }
  260. void setMinutesLeds(){
  261. //minutes = leds 28-34
  262. for(int i = 28; i < 35; i++){
  263. leds[i] = primaryColor;
  264. }
  265. }
  266. void setPast(){
  267. //past = leds 43-46
  268. for(int i = 43; i < 47; i++){
  269. leds[i] = primaryColor;
  270. }
  271. }
  272. void setTo(){
  273. //to = leds 41-42
  274. for(int i = 41; i < 43; i++){
  275. leds[i] = primaryColor;
  276. }
  277. }
  278. void setHours(){
  279. if(hour > 12)
  280. hour = hour-12;
  281. if((hour == 1 && minute < 33) || (hour == 12 && minute >= 33) || (hour == 0 && minute >= 33)){
  282. //set 1
  283. for(int i = 38; i < 41; i++){
  284. leds[i] = primaryColor;
  285. }
  286. }
  287. if((hour == 2 && minute < 33) || (hour == 1 && minute >= 33)){
  288. //set 2
  289. for(int i = 35; i < 38; i++){
  290. leds[i] = primaryColor;
  291. }
  292. }
  293. if((hour == 3 && minute < 33) || (hour == 2 && minute >= 33)){
  294. //set 3
  295. for(int i = 47; i < 52; i++){
  296. leds[i] = primaryCo"telemetry.enableTelemetry": falselor;
  297. }
  298. }
  299. if((hour == 4 && minute < 33) || (hour == 3 && minute >= 33)){
  300. //set 4
  301. for(int i = 52; i < 56; i++){
  302. leds[i] = primaryColor;
  303. }
  304. }
  305. if((hour == 5 && minute < 33) || (hour == 4 && minute >= 33)){
  306. //set 5
  307. for(int i = 56; i < 60; i++){
  308. leds[i] = primaryColor;
  309. }
  310. }
  311. if((hour == 6 && minute < 33) || (hour == 5 && minute >= 33)){
  312. //set 6
  313. for(int i = 70; i < 73; i++){
  314. leds[i] = primaryColor;
  315. }
  316. }
  317. if((hour == 7 && minute < 33) || (hour == 6 && minute >= 33)){
  318. //set 7
  319. for(int i = 65; i < 70; i++){
  320. leds[i] = primaryColor;
  321. }
  322. }
  323. if((hour == 8 && minute < 33) || (hour == 7 && minute >= 33)){
  324. //set 8
  325. for(int i = 60; i < 65; i++){
  326. leds[i] = primaryColor;
  327. }
  328. }
  329. if((hour == 9 && minute < 33) || (hour == 8 && minute >= 33)){
  330. //set 9
  331. for(int i = 73; i < 77; i++){
  332. leds[i] = primaryColor;
  333. }
  334. }
  335. if((hour == 10 && minute < 33) || (hour == 9 && minute >= 33)){
  336. //set 10
  337. for(int i = 77; i < 80; i++){
  338. leds[i] = primaryColor;
  339. }
  340. }
  341. if((hour == 11 && minute < 33) || (hour == 10 && minute >= 33)){
  342. //set 11
  343. for(int i = 80; i < 86; i++){
  344. leds[i] = primaryColor;
  345. }
  346. }
  347. if((hour == 12 && minute < 33) || (hour == 11 && minute >= 33)||(hour == 0 && minute < 33)){
  348. //set 12
  349. for(int i = 92; i < 98; i++){
  350. leds[i] = primaryColor;
  351. }
  352. }
  353. }
  354. void setOclock(){
  355. if((minute < 3) || (minute >= 58)){
  356. for(int i = 86; i < 92; i++){
  357. leds[i] = primaryColor;
  358. }
  359. }
  360. }