#include <LiquidCrystal.h>
#include <Keypad.h>
#include <Ds1302.h> // DS1302 library
/* Display */
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
/* Keypad setup */
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {A0, A1, A2, A3};
byte colPins[KEYPAD_COLS] = {A4, A5, 2, 3};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);
/* DS1302 RTC setup */
Ds1302 rtc(6, 5, 4); // RST, DAT, CLK pins
Ds1302::DateTime now;
Ds1302::DateTime alarmTime;
bool alarmSet = false;
void showSplashScreen() {
lcd.print("Arduino Alarm");
lcd.setCursor(3, 1);
String message = "Clock";
for (byte i = 0; i < message.length(); i++) {
lcd.print(message[i]);
delay(50);
}
delay(500);
}
void updateDisplay() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Time: ");
lcd.print(now.hour);
lcd.print(":");
if (now.minute < 10) lcd.print("0"); // Add leading zero for minutes
lcd.print(now.minute);
lcd.print(":");
if (now.second < 10) lcd.print("0"); // Add leading zero for seconds
lcd.print(now.second);
lcd.setCursor(0, 1);
if (alarmSet) {
lcd.print("Alarm: ");
lcd.print(alarmTime.hour);
lcd.print(":");
if (alarmTime.minute < 10) lcd.print("0"); // Add leading zero for minutes
lcd.print(alarmTime.minute);
} else {
lcd.print("No Alarm Set");
}
}
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
// Initialize RTC
rtc.init();
//rtc.setWriteProtect(false); // Disable write protection
// Set initial time (only needed once)
// Ds1302::DateTime initialTime = {2023, 10, 1, 12, 0, 0, Ds1302::kSunday};
// rtc.setDateTime(&initialTime);
showSplashScreen();
lcd.clear();
}
void processInput(char key) {
if (key == 'A') {
// Set alarm time
alarmSet = true;
alarmTime = now; // Set alarm time to current time
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Set Alarm Time");
} else if (key == 'B') {
// Clear alarm
alarmSet = false;
} else if (key >= '0' && key <= '9') {
// Adjust alarm time
if (alarmSet) {
int hour = alarmTime.hour;
int minute = alarmTime.minute;
if (key == '1') hour = (hour + 1) % 24; // Increment hour
if (key == '2') minute = (minute + 1) % 60; // Increment minute
alarmTime = {now.year, now.month, now.day, hour, minute, 0, now.dow}; // Update alarm time
}
}
}
void loop() {
rtc.getDateTime(&now); // Get current time from RTC
updateDisplay();
char key = keypad.getKey();
if (key) {
processInput(key);
}
if (alarmSet && now.hour == alarmTime.hour && now.minute == alarmTime.minute) {
// Trigger alarm
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ALARM!!!");
// Add code to trigger buzzer or LED here
delay(1000); // Prevent multiple triggers
}
delay(100);
}