|
@@ -0,0 +1,382 @@
|
|
|
|
|
+#include "Wire.h"
|
|
|
|
|
+#include <FastLED.h>
|
|
|
|
|
+
|
|
|
|
|
+#define LED_PIN 5
|
|
|
|
|
+#define NUM_LEDS 98
|
|
|
|
|
+#define BRIGHTNESS 64
|
|
|
|
|
+#define LED_TYPE WS2812
|
|
|
|
|
+#define COLOR_ORDER GRB
|
|
|
|
|
+#define DS3231_I2C_ADDRESS 0x68
|
|
|
|
|
+
|
|
|
|
|
+CRGB leds[NUM_LEDS];
|
|
|
|
|
+CRGB primaryColor = CRGB::White;
|
|
|
|
|
+
|
|
|
|
|
+byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
|
|
|
|
|
+
|
|
|
|
|
+byte count;
|
|
|
|
|
+
|
|
|
|
|
+// Convert normal decimal numbers to binary coded decimal
|
|
|
|
|
+byte decToBcd(byte val)
|
|
|
|
|
+{
|
|
|
|
|
+ return( (val/10*16) + (val%10) );
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// Convert binary coded decimal to normal decimal numbers
|
|
|
|
|
+byte bcdToDec(byte val)
|
|
|
|
|
+{
|
|
|
|
|
+ return( (val/16*10) + (val%16) );
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void setup()
|
|
|
|
|
+{
|
|
|
|
|
+ Wire.begin();
|
|
|
|
|
+ Serial.begin(9600);
|
|
|
|
|
+ FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
|
|
|
|
|
+ FastLED.setBrightness( BRIGHTNESS );
|
|
|
|
|
+ count = 0;
|
|
|
|
|
+ // set the initial time here:
|
|
|
|
|
+ // DS3231 seconds, minutes, hours, day, date, month, year
|
|
|
|
|
+ //setDS3231time(30,13,0,5,8,11,18);
|
|
|
|
|
+}
|
|
|
|
|
+void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
|
|
|
|
|
+dayOfMonth, byte month, byte year)
|
|
|
|
|
+{
|
|
|
|
|
+ // sets time and date data to DS3231
|
|
|
|
|
+ Wire.beginTransmission(DS3231_I2C_ADDRESS);
|
|
|
|
|
+ Wire.write(0); // set next input to start at the seconds register
|
|
|
|
|
+ Wire.write(decToBcd(second)); // set seconds
|
|
|
|
|
+ Wire.write(decToBcd(minute)); // set minutes
|
|
|
|
|
+ Wire.write(decToBcd(hour)); // set hours
|
|
|
|
|
+ Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
|
|
|
|
|
+ Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
|
|
|
|
|
+ Wire.write(decToBcd(month)); // set month
|
|
|
|
|
+ Wire.write(decToBcd(year)); // set year (0 to 99)
|
|
|
|
|
+ Wire.endTransmission();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek,
|
|
|
|
|
+byte *dayOfMonth, byte *month, byte *year)
|
|
|
|
|
+{
|
|
|
|
|
+ Wire.beginTransmission(DS3231_I2C_ADDRESS);
|
|
|
|
|
+ Wire.write(0); // set DS3231 register pointer to 00h
|
|
|
|
|
+ Wire.endTransmission();
|
|
|
|
|
+ Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
|
|
|
|
|
+ // request seven bytes of data from DS3231 starting from register 00h
|
|
|
|
|
+ *second = bcdToDec(Wire.read() & 0x7f);
|
|
|
|
|
+ *minute = bcdToDec(Wire.read());
|
|
|
|
|
+ *hour = bcdToDec(Wire.read() & 0x3f);
|
|
|
|
|
+ *dayOfWeek = bcdToDec(Wire.read());
|
|
|
|
|
+ *dayOfMonth = bcdToDec(Wire.read());
|
|
|
|
|
+ *month = bcdToDec(Wire.read());
|
|
|
|
|
+ *year = bcdToDec(Wire.read());
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void displayTime()
|
|
|
|
|
+{
|
|
|
|
|
+ //byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
|
|
|
|
|
+ // retrieve data from DS3231
|
|
|
|
|
+ readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
|
|
|
|
|
+ &year);
|
|
|
|
|
+ // send it to the serial monitor
|
|
|
|
|
+ Serial.print(hour, DEC);
|
|
|
|
|
+ // convert the byte variable to a decimal number when displayed
|
|
|
|
|
+ Serial.print(":");
|
|
|
|
|
+ if (minute<10)
|
|
|
|
|
+ {
|
|
|
|
|
+ Serial.print("0");
|
|
|
|
|
+ }
|
|
|
|
|
+ Serial.print(minute, DEC);
|
|
|
|
|
+ Serial.print(":");
|
|
|
|
|
+ if (second<10)
|
|
|
|
|
+ {
|
|
|
|
|
+ Serial.print("0");
|
|
|
|
|
+ }
|
|
|
|
|
+ Serial.print(second, DEC);
|
|
|
|
|
+ Serial.print(" ");
|
|
|
|
|
+ Serial.print(dayOfMonth, DEC);
|
|
|
|
|
+ Serial.print("/");
|
|
|
|
|
+ Serial.print(month, DEC);
|
|
|
|
|
+ Serial.print("/");
|
|
|
|
|
+ Serial.print(year, DEC);
|
|
|
|
|
+ Serial.print(" Day of week: ");
|
|
|
|
|
+ switch(dayOfWeek){
|
|
|
|
|
+ case 1:
|
|
|
|
|
+ Serial.println("Sunday");
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 2:
|
|
|
|
|
+ Serial.println("Monday");
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 3:
|
|
|
|
|
+ Serial.println("Tuesday");
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 4:
|
|
|
|
|
+ Serial.println("Wednesday");
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 5:
|
|
|
|
|
+ Serial.println("Thursday");
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 6:
|
|
|
|
|
+ Serial.println("Friday");
|
|
|
|
|
+ break;
|
|
|
|
|
+ case 7:
|
|
|
|
|
+ Serial.println("Saturday");
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+void loop()
|
|
|
|
|
+{
|
|
|
|
|
+ displayTime(); // display the real-time clock data on the Serial Monitor,
|
|
|
|
|
+ readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
|
|
|
|
|
+ &year);
|
|
|
|
|
+ setLeds();
|
|
|
|
|
+ FastLED.show();
|
|
|
|
|
+ delay(1000); // every second
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void setLeds(){
|
|
|
|
|
+ clearAllLeds();
|
|
|
|
|
+ /*
|
|
|
|
|
+ leds[count] = CRGB::White;
|
|
|
|
|
+ count++;
|
|
|
|
|
+ if(count == NUM_LEDS)
|
|
|
|
|
+ count = 0;
|
|
|
|
|
+ */
|
|
|
|
|
+
|
|
|
|
|
+ //byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
|
|
|
|
|
+ setIt();
|
|
|
|
|
+ setIs();
|
|
|
|
|
+ setMinutes();
|
|
|
|
|
+ setHours();
|
|
|
|
|
+ setOclock();
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void clearAllLeds(){
|
|
|
|
|
+ for(int i = 0; i < NUM_LEDS; i++){
|
|
|
|
|
+ leds[i] = CRGB::Black;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+void setIt(){
|
|
|
|
|
+ //if(second & B00000001){
|
|
|
|
|
+ leds[0] = primaryColor;
|
|
|
|
|
+ leds[1] = primaryColor;
|
|
|
|
|
+ //}
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void setIs(){
|
|
|
|
|
+ leds[2] = primaryColor;
|
|
|
|
|
+ leds[3] = primaryColor;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void setMinutes(){
|
|
|
|
|
+ if(minute < 3){
|
|
|
|
|
+ //do nothing
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(minute < 8){
|
|
|
|
|
+ //5 past
|
|
|
|
|
+ setFive();
|
|
|
|
|
+ setMinutesLeds();
|
|
|
|
|
+ setPast();
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(minute < 13){
|
|
|
|
|
+ //10 past
|
|
|
|
|
+ setTen();
|
|
|
|
|
+ setMinutesLeds();
|
|
|
|
|
+ setPast();
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(minute < 18){
|
|
|
|
|
+ //Quarter past
|
|
|
|
|
+ setQuarter();
|
|
|
|
|
+ setPast();
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(minute < 23){
|
|
|
|
|
+ //20 past
|
|
|
|
|
+ setTwenty();
|
|
|
|
|
+ setMinutesLeds();
|
|
|
|
|
+ setPast();
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(minute < 28){
|
|
|
|
|
+ //25 past
|
|
|
|
|
+ setTwenty();
|
|
|
|
|
+ setFive();
|
|
|
|
|
+ setMinutesLeds();
|
|
|
|
|
+ setPast();
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(minute < 33){
|
|
|
|
|
+ //half past
|
|
|
|
|
+ setHalf();
|
|
|
|
|
+ setPast();
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(minute < 38){
|
|
|
|
|
+ //25 to
|
|
|
|
|
+ setTwenty();
|
|
|
|
|
+ setFive();
|
|
|
|
|
+ setMinutesLeds();
|
|
|
|
|
+ setTo();
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(minute < 43){
|
|
|
|
|
+ //20 to
|
|
|
|
|
+ setTwenty();
|
|
|
|
|
+ setMinutesLeds();
|
|
|
|
|
+ setTo();
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(minute < 48){
|
|
|
|
|
+ //Quarter to
|
|
|
|
|
+ setQuarter();
|
|
|
|
|
+ setTo();
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(minute < 53){
|
|
|
|
|
+ //10 to
|
|
|
|
|
+ setTen();
|
|
|
|
|
+ setMinutesLeds();
|
|
|
|
|
+ setTo();
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(minute < 58){
|
|
|
|
|
+ //5 to
|
|
|
|
|
+ setFive();
|
|
|
|
|
+ setMinutesLeds();
|
|
|
|
|
+ setTo();
|
|
|
|
|
+ }
|
|
|
|
|
+ else{
|
|
|
|
|
+ //minutes = 58 or 59
|
|
|
|
|
+ //do nothing
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+void setFive(){
|
|
|
|
|
+//five = leds 24-27
|
|
|
|
|
+ for(int i = 24; i < 28; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+void setTen(){
|
|
|
|
|
+//ten = leds 4-6
|
|
|
|
|
+ for(int i = 4; i < 7; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void setQuarter(){
|
|
|
|
|
+//Quarter = leds 17-23
|
|
|
|
|
+ for(int i = 17; i < 24; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+void setTwenty(){
|
|
|
|
|
+//twenty = leds 11-16
|
|
|
|
|
+ for(int i = 11; i < 17; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+void setHalf(){
|
|
|
|
|
+//half = leds 7-10
|
|
|
|
|
+ for(int i = 7; i < 11; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void setMinutesLeds(){
|
|
|
|
|
+//minutes = leds 28-34
|
|
|
|
|
+ for(int i = 28; i < 35; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void setPast(){
|
|
|
|
|
+//past = leds 43-46
|
|
|
|
|
+ for(int i = 43; i < 47; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void setTo(){
|
|
|
|
|
+//to = leds 41-42
|
|
|
|
|
+ for(int i = 41; i < 43; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void setHours(){
|
|
|
|
|
+ if(hour > 12)
|
|
|
|
|
+ hour = hour-12;
|
|
|
|
|
+ if((hour == 1 && minute < 33) || (hour == 12 && minute >= 33) || (hour == 0 && minute >= 33)){
|
|
|
|
|
+ //set 1
|
|
|
|
|
+ for(int i = 38; i < 41; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if((hour == 2 && minute < 33) || (hour == 1 && minute >= 33)){
|
|
|
|
|
+ //set 2
|
|
|
|
|
+ for(int i = 35; i < 38; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if((hour == 3 && minute < 33) || (hour == 2 && minute >= 33)){
|
|
|
|
|
+ //set 3
|
|
|
|
|
+ for(int i = 47; i < 52; i++){
|
|
|
|
|
+ leds[i] = primaryCo"telemetry.enableTelemetry": falselor;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if((hour == 4 && minute < 33) || (hour == 3 && minute >= 33)){
|
|
|
|
|
+ //set 4
|
|
|
|
|
+ for(int i = 52; i < 56; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if((hour == 5 && minute < 33) || (hour == 4 && minute >= 33)){
|
|
|
|
|
+ //set 5
|
|
|
|
|
+ for(int i = 56; i < 60; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if((hour == 6 && minute < 33) || (hour == 5 && minute >= 33)){
|
|
|
|
|
+ //set 6
|
|
|
|
|
+ for(int i = 70; i < 73; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if((hour == 7 && minute < 33) || (hour == 6 && minute >= 33)){
|
|
|
|
|
+ //set 7
|
|
|
|
|
+ for(int i = 65; i < 70; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if((hour == 8 && minute < 33) || (hour == 7 && minute >= 33)){
|
|
|
|
|
+ //set 8
|
|
|
|
|
+ for(int i = 60; i < 65; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if((hour == 9 && minute < 33) || (hour == 8 && minute >= 33)){
|
|
|
|
|
+ //set 9
|
|
|
|
|
+ for(int i = 73; i < 77; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if((hour == 10 && minute < 33) || (hour == 9 && minute >= 33)){
|
|
|
|
|
+ //set 10
|
|
|
|
|
+ for(int i = 77; i < 80; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if((hour == 11 && minute < 33) || (hour == 10 && minute >= 33)){
|
|
|
|
|
+ //set 11
|
|
|
|
|
+ for(int i = 80; i < 86; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if((hour == 12 && minute < 33) || (hour == 11 && minute >= 33)||(hour == 0 && minute < 33)){
|
|
|
|
|
+ //set 12
|
|
|
|
|
+ for(int i = 92; i < 98; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void setOclock(){
|
|
|
|
|
+ if((minute < 3) || (minute >= 58)){
|
|
|
|
|
+ for(int i = 86; i < 92; i++){
|
|
|
|
|
+ leds[i] = primaryColor;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|