#include #include #include "RTClib.h" RTC_DS1307 RTC; //replace this value with the number of LEDS on your strip #define NUM_LEDS 60 #define DATA_PIN 3 #define CLOCK_PIN 13 //Define colors for hours, minutes and seconds. //you can also define custom RGB colors like this: CRGB( 255, 255, 255); #define hourColor CRGB::Blue; #define minuteColor CRGB::Green; #define secondColor CRGB::Red; //Define overlapping colors #define HMoverlap CRGB::Cyan; #define MSoverlap CRGB::Yellow; #define SHoverlap CRGB::Purple; unsigned long actTime = 0; unsigned long remTime = 0; const unsigned long period = 500; bool blinkState = false; bool menuTriggered = false; bool toggleSeconds = true; int BRIGHTNESS = 51; const int menuButton = 8; const int upButton = 6; const int downButton = 4; boolean buttonPrev = false; boolean buttonPrev2 = false; boolean buttonPrev3 = false; int menuState = 0; // Define the array of leds CRGB leds[NUM_LEDS]; int periodic[NUM_LEDS] {0,58,59,57,56,55,54,53,52,51,50,42,43,44,45,46,47,48,49,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,5,4,3,2,1}; void setup() { Serial.begin(9600); Wire.begin(); RTC.begin(); //uncomment the following line when you first upload the code to set the time //RTC.adjust(DateTime(__DATE__, __TIME__)); //you an also use the following line to set a custom time //RTC.adjust(DateTime(2022, 2, 24, 14, 20, 0)); pinMode(menuButton, INPUT); FastLED.addLeds(leds, NUM_LEDS); // GRB ordering is typical FastLED.setBrightness(BRIGHTNESS); } void loop() { menuButtonState(); if(menuState==0){ if((digitalRead(upButton) && buttonPrev2)){ if(toggleSeconds){ toggleSeconds=false; }else{toggleSeconds=true;} Serial.println(toggleSeconds); } buttonPrev2 = !digitalRead(upButton); //increase brightness in increments if((digitalRead(downButton) && buttonPrev3)){ if (BRIGHTNESS <255){ BRIGHTNESS = BRIGHTNESS + 51; }else{ BRIGHTNESS = 51; } FastLED.setBrightness(BRIGHTNESS); Serial.print("Brightness set to: "); Serial.println(BRIGHTNESS); } buttonPrev3 = !digitalRead(downButton); FastLED.clear(); showTime(); }else if(menuState==1){ setMinute(); }else if(menuState==2){ setHour(); } } void showTime(){ unsigned long currentMillis = millis(); DateTime now = RTC.now(); if((now.second()==now.minute()) && toggleSeconds){ leds[periodic[now.second()]] = MSoverlap; leds[periodic[now.hour()]] = hourColor; }else if((now.second()==now.hour()) && toggleSeconds){ leds[periodic[now.second()]] = SHoverlap; leds[periodic[now.minute()]] = minuteColor; }else if(now.minute()==now.hour()){ if(toggleSeconds){leds[periodic[now.second()]] = secondColor;} leds[periodic[now.minute()]] = HMoverlap }else{ if(toggleSeconds){leds[periodic[now.second()]] = secondColor;} leds[periodic[now.minute()]] = minuteColor; leds[periodic[now.hour()]] = hourColor; } FastLED.show(); leds[periodic[now.second()]] = CRGB::Black; leds[periodic[now.minute()]] = CRGB::Black; leds[periodic[now.hour()]] = CRGB::Black; } void menuButtonState() { if(digitalRead(menuButton) && buttonPrev){ menuTriggered = false; if(menuState<2){ menuState = menuState + 1; }else{ menuState = 0; } Serial.println(menuState); } buttonPrev = !digitalRead(menuButton); } void setMinute() { // FastLED.clear(); actTime = millis(); DateTime now = RTC.now(); RTC.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), 1)); if(digitalRead(upButton) && buttonPrev2){ leds[periodic[now.minute()]] = CRGB::Black; RTC.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute()+1, now.second())); }else if(digitalRead(downButton) && buttonPrev3){ leds[periodic[now.minute()]] = CRGB::Black; RTC.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute()-1, now.second())); } buttonPrev2 = !digitalRead(upButton); buttonPrev3 = !digitalRead(downButton); if (actTime - remTime >= period){ remTime = actTime; if(!blinkState) { blinkState = true; Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); if(now.second()==now.minute()){ leds[periodic[now.second()]] = MSoverlap; leds[periodic[now.hour()]] = hourColor; }else if(now.second()==now.hour()){ leds[periodic[now.second()]] = SHoverlap; leds[periodic[now.minute()]] = minuteColor; }else if(now.minute()==now.hour()){ leds[periodic[now.second()]] = secondColor; leds[periodic[now.minute()]] = HMoverlap; }else{ leds[periodic[now.second()]] = secondColor; leds[periodic[now.minute()]] = minuteColor; leds[periodic[now.hour()]] = hourColor; } FastLED.show(); } else { blinkState = false; leds[periodic[now.minute()]] = CRGB::Black; FastLED.show(); // leds[periodic[now.hour()]] = CRGB::Black; // leds[periodic[now.second()]] = CRGB::Black; } } if(!menuTriggered){ Serial.println("menu triggered!!"); FastLED.clear(); menuTriggered = true; } } void setHour() { // FastLED.clear(); actTime = millis(); DateTime now = RTC.now(); RTC.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), 1)); if(!menuTriggered){ Serial.println("menu triggered!!"); FastLED.clear(); menuTriggered = true; } if(digitalRead(upButton) && buttonPrev2){ leds[periodic[now.hour()]] = CRGB::Black; RTC.adjust(DateTime(now.year(), now.month(), now.day(), now.hour()+1, now.minute(), now.second())); }else if(digitalRead(downButton) && buttonPrev3){ leds[periodic[now.hour()]] = CRGB::Black; RTC.adjust(DateTime(now.year(), now.month(), now.day(), now.hour()-1, now.minute(), now.second())); } buttonPrev2 = !digitalRead(upButton); buttonPrev3 = !digitalRead(downButton); if (actTime - remTime >= period){ remTime = actTime; if(!blinkState) { blinkState = true; Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); if(now.second()==now.minute()){ leds[periodic[now.second()]] = MSoverlap; leds[periodic[now.hour()]] = hourColor; }else if(now.second()==now.hour()){ leds[periodic[now.second()]] = SHoverlap; leds[periodic[now.minute()]] = minuteColor; }else if(now.minute()==now.hour()){ leds[periodic[now.second()]] = secondColor; leds[periodic[now.minute()]] = HMoverlap; }else{ leds[periodic[now.second()]] = secondColor; leds[periodic[now.minute()]] = minuteColor; leds[periodic[now.hour()]] = hourColor; } FastLED.show(); } else { blinkState = false; leds[periodic[now.hour()]] = CRGB::Black; FastLED.show(); // leds[periodic[now.hour()]] = CRGB::Black; // leds[periodic[now.second()]] = CRGB::Black; } } } void increaseBrightness(){ }