#include <FastLED.h>
#include "RTClib.h"
#include <Wire.h>
#define LED_PIN 7
#define NUM_LEDS 4
const byte interruptMode = 2;
const byte interruptTime = 3;
CRGB leds[NUM_LEDS];
RTC_DS1307 rtc;
uint8_t hour;
uint8_t minute;
uint8_t second;
uint8_t Mode;
uint8_t SetTime;
uint8_t blink = 5;
uint32_t BlinkTimer;
uint32_t ResetTime;
uint32_t lastTime;
uint32_t lastTimeMode;
int ModePin = 10;
int TimePin = 11;
bool SwitchMode = false;
bool SwitchTime = false;
void setup() {
Serial.begin(9600);
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
pinMode(ModePin, INPUT_PULLUP);
pinMode(TimePin, INPUT_PULLUP);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
pinMode(interruptMode, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptMode), Modeinterrupt, CHANGE);
pinMode(interruptTime, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptTime), Timeinterrupt, CHANGE);
Serial.println("Setting the time...");
rtc.adjust(DateTime(2023, 4, 27, 0, 0, 0)); // Set initial time if RTC is reset
}
void loop() {
// Get current time from RTC
DateTime now = rtc.now();
hour = now.hour();
minute = now.minute();
second = now.second();
// Serial Monitor output
Serial.print(hour, DEC);
Serial.print(':');
Serial.print(minute, DEC);
Serial.print(':');
Serial.print(second, DEC);
Serial.print(':');
Serial.print(Mode, DEC);
Serial.print(':');
Serial.print(SetTime, DEC);
Serial.println();
// Mode Switch
switch (Mode) {
case 0: // Show the Time
Clock();
ResetTime = millis() + 30000;
break;
case 1: // Setting the minute
BlinkMinute();
TimeSetMinute1();
if (ResetTime < millis()) {
Mode = 0;
}
break;
case 2: // Setting the minute x10
BlinkMinute();
TimeSetMinute10();
if (ResetTime < millis()) {
Mode = 0;
}
break;
case 3: // Setting the hours
BlinkHour();
TimeSetHour();
if (ResetTime < millis()) {
Mode = 0;
}
break;
case 4: // Lightshow if you press both Buttons shortly after exiting mode 3
Lightshow();
break;
}
}
void TimeSetMinute1() {
if (SetTime == 1) {
rtc.adjust(DateTime(rtc.now().year(), rtc.now().month(), rtc.now().day(), rtc.now().hour(), (rtc.now().minute() + 1) % 60, rtc.now().second()));
SetTime = 0;
}
}
void TimeSetMinute10() {
if (SetTime == 1) {
rtc.adjust(DateTime(rtc.now().year(), rtc.now().month(), rtc.now().day(), rtc.now().hour(), (rtc.now().minute() + 10) % 60, rtc.now().second()));
SetTime = 0;
}
}
void TimeSetHour() {
if (SetTime == 1) {
rtc.adjust(DateTime(rtc.now().year(), rtc.now().month(), rtc.now().day(), (rtc.now().hour() + 1) % 24, rtc.now().minute(), rtc.now().second()));
SetTime = 0;
}
}
void Timeinterrupt() {
if (millis() > (lastTime + 500)) {
if (Mode != 0) {
if (SwitchTime == false) {
SetTime = 1;
} else {
SwitchTime = false;
}
lastTime = millis();
}
}
}
void Modeinterrupt() {
if (digitalRead(interruptMode) == HIGH) {
if (millis() > (lastTimeMode + 1000)) {
if (SwitchMode == false) {
Mode++;
Mode = Mode % 5; // Number of Modes
delay(400);
} else {
SwitchMode = false;
}
lastTimeMode = millis();
}
}
}
void Clock() {
// Hour Rings (1 & 2)
switch (hour) {
case 0: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(4, 4, 4); break;
case 1: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(25, 5, 0); break;
case 2: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(255, 0, 0); break;
case 3: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(255, 64, 0); break;
case 4: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(255, 196, 0); break;
case 5: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(0, 255, 0); break;
case 6: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(0, 0, 255); break;
case 7: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(200, 0, 255); break;
case 8: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(48, 48, 48); break;
case 9: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(255, 255, 255); break;
case 10: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(4, 4, 4); break;
case 11: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(25, 5, 0); break;
case 12: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(255, 0, 0); break;
case 13: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(255, 64, 0); break;
case 14: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(255, 196, 0); break;
case 15: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(0, 255, 0); break;
case 16: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(0, 0, 255); break;
case 17: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(196, 0, 255); break;
case 18: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(48, 48, 48); break;
case 19: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(255, 255, 255); break;
case 20: leds[3] = CRGB(255, 0, 0); leds[2] = CRGB(4, 4, 4); break;
case 21: leds[3] = CRGB(255, 0, 0); leds[2] = CRGB(25, 5, 0); break;
case 22: leds[3] = CRGB(255, 0, 0); leds[2] = CRGB(255, 0, 0); break;
case 23: leds[3] = CRGB(255, 0, 0); leds[2] = CRGB(255, 64, 0); break;
}
//////////////////////////////////////////Ring 3 & 4//////////////////////////////////////////
switch (minute) {
case 0: leds[1] = CRGB(4, 4, 4); leds[0] = CRGB(4, 4, 4); FastLED.show(); break;
case 1: leds[1] = CRGB(4, 4, 4); leds[0] = CRGB(25, 5, 0); FastLED.show(); break;
case 2: leds[1] = CRGB(4, 4, 4); leds[0] = CRGB(255, 0, 0); FastLED.show(); break;
case 3: leds[1] = CRGB(4, 4, 4); leds[0] = CRGB(255, 64, 0); FastLED.show(); break;
case 4: leds[1] = CRGB(4, 4, 4); leds[0] = CRGB(255, 196, 0); FastLED.show(); break;
case 5: leds[1] = CRGB(4, 4, 4); leds[0] = CRGB(0, 255, 0); FastLED.show(); break;
case 6: leds[1] = CRGB(4, 4, 4); leds[0] = CRGB(0, 0, 255); FastLED.show(); break;
case 7: leds[1] = CRGB(4, 4, 4); leds[0] = CRGB(200, 0, 255); FastLED.show(); break;
case 8: leds[1] = CRGB(4, 4, 4); leds[0] = CRGB(48, 48, 48); FastLED.show(); break;
case 9: leds[1] = CRGB(4, 4, 4); leds[0] = CRGB(255, 255, 255); FastLED.show(); break;
case 10: leds[1] = CRGB(25, 5, 0); leds[0] = CRGB(4, 4, 4); FastLED.show(); break;
case 11: leds[1] = CRGB(25, 5, 0); leds[0] = CRGB(25, 5, 0); FastLED.show(); break;
case 12: leds[1] = CRGB(25, 5, 0); leds[0] = CRGB(255, 0, 0); FastLED.show(); break;
case 13: leds[1] = CRGB(25, 5, 0); leds[0] = CRGB(255, 64, 0); FastLED.show(); break;
case 14: leds[1] = CRGB(25, 5, 0); leds[0] = CRGB(255, 196, 0); FastLED.show(); break;
case 15: leds[1] = CRGB(25, 5, 0); leds[0] = CRGB(0, 255, 0); FastLED.show(); break;
case 16: leds[1] = CRGB(25, 5, 0); leds[0] = CRGB(0, 0, 255); FastLED.show(); break;
case 17: leds[1] = CRGB(25, 5, 0); leds[0] = CRGB(196, 0, 255); FastLED.show(); break;
case 18: leds[1] = CRGB(25, 5, 0); leds[0] = CRGB(48, 48, 48); FastLED.show(); break;
case 19: leds[1] = CRGB(25, 5, 0); leds[0] = CRGB(255, 255, 255); FastLED.show(); break;
case 20: leds[1] = CRGB(255, 0, 0); leds[0] = CRGB(4, 4, 4); FastLED.show(); break;
case 21: leds[1] = CRGB(255, 0, 0); leds[0] = CRGB(25, 5, 0); FastLED.show(); break;
case 22: leds[1] = CRGB(255, 0, 0); leds[0] = CRGB(255, 0, 0); FastLED.show(); break;
case 23: leds[1] = CRGB(255, 0, 0); leds[0] = CRGB(255, 64, 0); FastLED.show(); break;
case 24: leds[1] = CRGB(255, 0, 0); leds[0] = CRGB(255, 196, 0); FastLED.show(); break;
case 25: leds[1] = CRGB(255, 0, 0); leds[0] = CRGB(0, 255, 0); FastLED.show(); break;
case 26: leds[1] = CRGB(255, 0, 0); leds[0] = CRGB(0, 0, 255); FastLED.show(); break;
case 27: leds[1] = CRGB(255, 0, 0); leds[0] = CRGB(200, 0, 255); FastLED.show(); break;
case 28: leds[1] = CRGB(255, 0, 0); leds[0] = CRGB(48, 48, 48); FastLED.show(); break;
case 29: leds[1] = CRGB(255, 0, 0); leds[0] = CRGB(255, 255, 255); FastLED.show(); break;
case 30: leds[1] = CRGB(255, 64, 0);leds[0] = CRGB(4, 4, 4); FastLED.show(); break;
case 31: leds[1] = CRGB(255, 64, 0); leds[0] = CRGB(25, 5, 0); FastLED.show(); break;
case 32: leds[1] = CRGB(255, 64, 0); leds[0] = CRGB(255, 0, 0); FastLED.show(); break;
case 33: leds[1] = CRGB(255, 64, 0); leds[0] = CRGB(255, 64, 0); FastLED.show(); break;
case 34: leds[1] = CRGB(255, 64, 0); leds[0] = CRGB(255, 196, 0); FastLED.show(); break;
case 35: leds[1] = CRGB(255, 64, 0); leds[0] = CRGB(0, 255, 0); FastLED.show(); break;
case 36: leds[1] = CRGB(255, 64, 0); leds[0] = CRGB(0, 0, 255); FastLED.show(); break;
case 37: leds[1] = CRGB(255, 64, 0); leds[0] = CRGB(196, 0, 255); FastLED.show(); break;
case 38: leds[1] = CRGB(255, 64, 0); leds[0] = CRGB(48, 48, 48); FastLED.show(); break;
case 39: leds[1] = CRGB(255, 64, 0); leds[0] = CRGB(255, 255, 255); FastLED.show(); break;
case 40: leds[1] = CRGB(255, 196, 0); leds[0] = CRGB(4, 4, 4); FastLED.show(); break;
case 41: leds[1] = CRGB(255, 196, 0); leds[0] = CRGB(25, 4, 0); FastLED.show(); break;
case 42: leds[1] = CRGB(255, 196, 0); leds[0] = CRGB(255, 0, 0); FastLED.show(); break;
case 43: leds[1] = CRGB(255, 196, 0); leds[0] = CRGB(255, 64, 0); FastLED.show(); break;
case 44: leds[1] = CRGB(255, 196, 0); leds[0] = CRGB(255, 196, 0); FastLED.show(); break;
case 45: leds[1] = CRGB(255, 196, 0); leds[0] = CRGB(0, 255, 0); FastLED.show(); break;
case 46: leds[1] = CRGB(255, 196, 0); leds[0] = CRGB(0, 0, 255); FastLED.show(); break;
case 47: leds[1] = CRGB(255, 196, 0); leds[0] = CRGB(196, 0, 255); FastLED.show(); break;
case 48: leds[1] = CRGB(255, 196, 0); leds[0] = CRGB(48, 48, 48); FastLED.show(); break;
case 49: leds[1] = CRGB(255, 196, 0); leds[0] = CRGB(255, 255, 255); FastLED.show(); break;
case 50: leds[1] = CRGB(0, 255, 0); leds[0] = CRGB(4, 4, 4); FastLED.show(); break;
case 51: leds[1] = CRGB(0, 255, 0); leds[0] = CRGB(25, 5, 0); FastLED.show(); break;
case 52: leds[1] = CRGB(0, 255, 0); leds[0] = CRGB(255, 0, 0); FastLED.show(); break;
case 53: leds[1] = CRGB(0, 255, 0); leds[0] = CRGB(255, 64, 0); FastLED.show(); break;
case 54: leds[1] = CRGB(0, 255, 0); leds[0] = CRGB(255, 196, 0); FastLED.show(); break;
case 55: leds[1] = CRGB(0, 255, 0); leds[0] = CRGB(0, 255, 0); FastLED.show(); break;
case 56: leds[1] = CRGB(0, 255, 0); leds[0] = CRGB(0, 0, 255); FastLED.show(); break;
case 57: leds[1] = CRGB(0, 255, 0); leds[0] = CRGB(196, 0, 255); FastLED.show(); break;
case 58: leds[1] = CRGB(0, 255, 0); leds[0] = CRGB(48, 48, 48); FastLED.show(); break;
case 59: leds[1] = CRGB(0, 255, 0); leds[0] = CRGB(255, 255, 255); FastLED.show(); break;
}
delay(100);
FastLED.show();
}
void Lightshow() {
for (int Dot = 0; Dot < NUM_LEDS; Dot++) {
leds[Dot] = CRGB::Blue;
FastLED.show();
delay(30);
}
for (int Dot = 0; Dot < NUM_LEDS; Dot++) {
leds[Dot] = CRGB::Green;
FastLED.show();
delay(30);
}
for (int Dot = 0; Dot < NUM_LEDS; Dot++) {
leds[Dot] = CRGB::Red;
FastLED.show();
delay(30);
}
}
void BlinkMinute() {
if (BlinkTimer < millis()) {
if (blink == 5) {
blink = 0;
} else {
blink = 5;
}
BlinkTimer = millis() + 500;
}
if (blink == 5) {
if (minute >= 0 && minute <= 9) leds[1] = CRGB(4, 4, 4);
if (minute >= 10 && minute <= 19) leds[1] = CRGB(25, 5, 0);
if (minute >= 20 && minute <= 29) leds[1] = CRGB(255, 0, 0);
if (minute >= 30 && minute <= 39) leds[1] = CRGB(0, 255, 0);
if (minute >= 40 && minute <= 49) leds[1] = CRGB(0, 0, 255);
if (minute >= 50 && minute <= 59) leds[1] = CRGB(255, 255, 255);
} else {
leds[1] = CRGB(0, 0, 0);
}
FastLED.show();
}
void BlinkHour() {
if (BlinkTimer < millis()) {
if (blink == 5) {
blink = 0;
} else {
blink = 5;
}
BlinkTimer = millis() + 500;
}
if (blink == 5) {
switch (hour) {
case 0: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(4, 4, 4); break;
case 1: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(25, 5, 0); break;
case 2: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(255, 0, 0); break;
case 3: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(255, 64, 0); break;
case 4: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(255, 196, 0); break;
case 5: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(0, 255, 0); break;
case 6: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(0, 0, 255); break;
case 7: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(200, 0, 255); break;
case 8: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(48, 48, 48); break;
case 9: leds[3] = CRGB(4, 4, 4); leds[2] = CRGB(255, 255, 255); break;
case 10: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(4, 4, 4); break;
case 11: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(25, 5, 0); break;
case 12: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(255, 0, 0); break;
case 13: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(255, 64, 0); break;
case 14: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(255, 196, 0); break;
case 15: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(0, 255, 0); break;
case 16: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(0, 0, 255); break;
case 17: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(196, 0, 255); break;
case 18: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(48, 48, 48); break;
case 19: leds[3] = CRGB(25, 5, 0); leds[2] = CRGB(255, 255, 255); break;
case 20: leds[3] = CRGB(255, 0, 0); leds[2] = CRGB(4, 4, 4); break;
case 21: leds[3] = CRGB(255, 0, 0); leds[2] = CRGB(25, 5, 0); break;
case 22: leds[3] = CRGB(255, 0, 0); leds[2] = CRGB(255, 0, 0); break;
case 23: leds[3] = CRGB(255, 0, 0); leds[2] = CRGB(255, 64, 0); break;
}
} else {
leds[3] = CRGB(0, 0, 0);
leds[2] = CRGB(0, 0, 0);
}
FastLED.show();
}