#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
RTC_DS3231 rtc;
const int buzzerPin = 9; // Connect buzzer to pin 9
const int buttonHourPin = 7; // Button for setting hour
const int buttonMinutePin = 8; // Button for setting minute
DateTime alarmTime;
void setup() {
Serial.begin(9600);
pinMode(buzzerPin, OUTPUT);
pinMode(buttonHourPin, INPUT_PULLUP);
pinMode(buttonMinutePin, INPUT_PULLUP);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
// Set default alarm time (8:00 AM)
alarmTime = DateTime(rtc.now().year(), rtc.now().month(), rtc.now().day(), 8, 0, 0);
// Initialize the display
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display(); // Clear the buffer
delay(2000); // Pause for 2 seconds
}
void loop() {
DateTime now = rtc.now();
// Check if buttons are pressed to set the alarm time
if (digitalRead(buttonHourPin) == LOW) {
delay(10); // Debounce delay reduced to 10 milliseconds
if (digitalRead(buttonHourPin) == LOW) {
alarmTime = alarmTime + TimeSpan(0, 1, 0, 0); // Increment hour
}
}
if (digitalRead(buttonMinutePin) == LOW) {
delay(10); // Debounce delay reduced to 10 milliseconds
if (digitalRead(buttonMinutePin) == LOW) {
alarmTime = alarmTime + TimeSpan(0, 0, 1, 0); // Increment minute
}
}
// Check if it's time for the alarm
if (now.hour() == alarmTime.hour() && now.minute() == alarmTime.minute()) {
tone(buzzerPin, 1000); // Generate a tone of 1000 Hz on the buzzer pin
} else {
noTone(buzzerPin); // Stop generating the tone
}
// Display current time and alarm time on OLED display
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print("Current Time:");
display.setCursor(0,10);
display.print(now.year(), DEC);
display.print('/');
display.print(now.month(), DEC);
display.print('/');
display.print(now.day(), DEC);
display.print(" ");
display.print(now.hour(), DEC);
display.print(':');
display.print(now.minute(), DEC);
display.setCursor(0,30);
display.print("Alarm Time:");
display.setCursor(0,40);
display.print(alarmTime.year(), DEC);
display.print('/');
display.print(alarmTime.month(), DEC);
display.print('/');
display.print(alarmTime.day(), DEC);
display.print(" ");
display.print(alarmTime.hour(), DEC);
display.print(':');
display.print(alarmTime.minute(), DEC);
display.display();
delay(10); // Update every second
}