#include "RTClib.h"
#include "pitches.h"
RTC_DS1307 rtc;
#define buzzer 8
const byte buttonPin[] = {13, 11, 12, 9, 10};
const int dataPin = 2;
const int clockPin = 3;
const int latchPin = 4;
int hours, mins, secs, rob;
int Sethours = 0, Setmins = 0;
bool check = false;
bool workSeg = true;
const byte digitPatterns[10] = {
B00111111, B00000110, B01011011, B01001111, B01100110,
B01101101, B01111101, B00000111, B01111111, B01101111
};
int melody[] = {
NOTE_E7, NOTE_E7, 0, NOTE_E7,
0, NOTE_C7, NOTE_E7, 0,
NOTE_G7, 0, 0, 0,
NOTE_G6, 0, 0, 0
};
void setup() {
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(buzzer, OUTPUT);
for (byte Bpin : buttonPin) pinMode(Bpin, INPUT_PULLUP);
if (!rtc.begin()) {
Serial.begin(115200);
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
}
void loop() {
DateTime now = rtc.now();
hours = now.hour();
mins = now.minute();
secs = now.second();
if (workSeg) {
SegmentClock(hours, mins, secs);
if (hours == Sethours && mins == Setmins && check == true) {
playAlarm();
}
} else {
ResetSegment(Sethours, Setmins);
Sethours = upValue(Sethours, buttonPin[2], 23);
Sethours = downtValue(Sethours, buttonPin[3], 23);
Setmins = upValue(Setmins, buttonPin[1], 59);
Setmins = downtmins(Setmins, buttonPin[4], 59);
}
toggleMode();
delay(50);
}
void playAlarm() {
for (int j = 0; j < 5; j++)
for (int i = 0; i < 16; i++) {
tone(buzzer, melody[i], 83.33);
delay(200);
}
noTone(buzzer);
check = false;
Sethours = 0;
Setmins = 0;
}
int upValue(int value, int pin, int max) {
if (digitalRead(pin) == LOW) {
value = value < max ? value + 1 : 0;
delay(170);
}
return value;
}
int downtValue(int value, int pin, int max) {
if (digitalRead(pin) == LOW) {
value = value > 0 ? value - 1 : max;
delay(170);
}
return value;
}
int downtmins(int value, int pin, int max) {
if (digitalRead(pin) == LOW) {
value = value > 0 ? value - 1 : max;
delay(170);
}
return value;
}
void toggleMode() {
static int lastButtonState = HIGH;
int buttonState = digitalRead(buttonPin[0]);
if (lastButtonState == HIGH && buttonState == LOW) {
workSeg = !workSeg;
check = true;
}
lastButtonState = buttonState;
}
void ResetSegment(int Sethours, int Setmins) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, ~digitPatterns[0]);
shiftOut(dataPin, clockPin, MSBFIRST, ~digitPatterns[0]);
shiftOut(dataPin, clockPin, MSBFIRST, ~digitPatterns[Setmins % 10]);
shiftOut(dataPin, clockPin, MSBFIRST, ~digitPatterns[Setmins / 10]);
shiftOut(dataPin, clockPin, MSBFIRST, ~digitPatterns[Sethours % 10]);
shiftOut(dataPin, clockPin, MSBFIRST, ~digitPatterns[Sethours / 10]);
digitalWrite(latchPin, HIGH);
delay(100);
}
void SegmentClock(int hours, int mins, int secs) {
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, ~digitPatterns[secs % 10]);
shiftOut(dataPin, clockPin, MSBFIRST, ~digitPatterns[secs / 10]);
shiftOut(dataPin, clockPin, MSBFIRST, ~digitPatterns[mins % 10]);
shiftOut(dataPin, clockPin, MSBFIRST, ~digitPatterns[mins / 10]);
shiftOut(dataPin, clockPin, MSBFIRST, ~digitPatterns[hours % 10]);
shiftOut(dataPin, clockPin, MSBFIRST, ~digitPatterns[hours / 10]);
digitalWrite(latchPin, HIGH);
delay(100);
}