#include <Wire.h>
#include <RTClib.h>
#include <SevSeg.h>
RTC_DS3231 rtc;
SevSeg sevseg;
int buttonHour = 2; // Pin for "Hours" button
int buttonMinute = 3; // Pin for "Minutes" button
int buttonAlarm = 4; // Pin for "Alarm" button
int buzzer = 8; // Pin for buzzer
int setHour = 0;
int setMinute = 0;
void setup() {
pinMode(buttonHour, INPUT_PULLUP);
pinMode(buttonMinute, INPUT_PULLUP);
pinMode(buttonAlarm, INPUT_PULLUP);
pinMode(buzzer, OUTPUT);
// Initialize RTC
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
// Initialize 7-segment display
byte numDigits = 4;
byte digitPins[] = {9, 10, 11, 12};
byte segmentPins[] = {A0, A1, A2, A3, A4, A5, 6, 7};
bool resistorsOnSegments = true;
bool updateWithDelays = false;
bool leadingZeros = true;
sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros);
sevseg.setBrightness(90);
}
void loop() {
DateTime now = rtc.now();
// Check if buttons are pressed for setting time
if (digitalRead(buttonHour) == LOW) {
delay(200); // Debounce
setHour = (setHour + 1) % 24;
}
if (digitalRead(buttonMinute) == LOW) {
delay(200); // Debounce
setMinute = (setMinute + 1) % 60;
}
// Display current time or set time
int currentHour = now.hour();
int currentMinute = now.minute();
if (digitalRead(buttonAlarm) == LOW) {
sevseg.setNumber(setHour * 100 + setMinute, 2);
} else {
sevseg.setNumber(currentHour * 100 + currentMinute, 2);
}
sevseg.refreshDisplay();
// Alarm functionality
if (currentHour == setHour && currentMinute == setMinute) {
digitalWrite(buzzer, HIGH);
delay(1000);
digitalWrite(buzzer, LOW);
}
delay(100);
}