#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <Arduino.h>
// Define constants
const int addr = 0x27; // Address of your I2C LCD
const int btnPlus = 2;
const int btnMinus = 3;
const int btnSet = 4;
const int btnMode = 5;
const int buzzer = 6; // Define the pin connected to the buzzer
// Define note frequencies (in Hz)
const int NOTE_C4 = 261;
const int NOTE_D4 = 294;
const int NOTE_E4 = 329;
const int NOTE_F4 = 349;
const int NOTE_G4 = 392;
const int NOTE_A4 = 440;
const int NOTE_B4 = 494;
const int NOTE_C5 = 523;
// Melodi sederhana untuk alarm
int melody[] = { NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5 };
int noteDurations[] = { 4, 4, 4, 4, 4, 4, 4, 4 }; // Setiap nada berdurasi 1/4 detik
// Global variables
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(addr, 16, 2);
boolean isSettingAlarm = false;
boolean isAlarmActive = false;
int alarmHour = 0;
int alarmMinute = 0;
int settingMode = 0; // 0: hour, 1: minute
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 200;
unsigned long alarmStartTime = 0; // To track the start time of the alarm
// Variables to track previous state
int lastHour = -1;
int lastMinute = -1;
int lastSecond = -1;
int lastAlarmHour = -1;
int lastAlarmMinute = -1;
boolean lastIsSettingAlarm = false;
int lastSettingMode = -1;
void setup() {
// Initialize serial, RTC, LCD, and buttons
Serial.begin(9600);
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
lcd.init();
lcd.backlight();
pinMode(btnPlus, INPUT_PULLUP);
pinMode(btnMinus, INPUT_PULLUP);
pinMode(btnSet, INPUT_PULLUP);
pinMode(btnMode, INPUT_PULLUP);
pinMode(buzzer, OUTPUT); // Set buzzer pin as output
}
void loop() {
DateTime now = rtc.now();
// Check if alarm is triggered
if (now.hour() == alarmHour && now.minute() == alarmMinute && !isAlarmActive) {
isAlarmActive = true;
alarmStartTime = millis(); // Record the start time of the alarm
Serial.println("Alarm!");
playMelody(); // Play the melody when alarm triggers
}
// If alarm is active, check if 30 seconds have passed
if (isAlarmActive && (millis() - alarmStartTime >= 30000)) {
isAlarmActive = false;
noTone(buzzer); // Stop the buzzer after 30 seconds
}
// Handle button presses with debounce and sound buzzer
if ((millis() - lastDebounceTime) > debounceDelay) {
if (digitalRead(btnMode) == LOW) {
isSettingAlarm = !isSettingAlarm;
lastDebounceTime = millis();
tone(buzzer, 500, 100); // Sound buzzer briefly on button press
}
if (isSettingAlarm) {
if (digitalRead(btnPlus) == LOW) {
if (settingMode == 0) {
alarmHour = (alarmHour + 1) % 24;
} else {
alarmMinute = (alarmMinute + 1) % 60;
}
lastDebounceTime = millis();
tone(buzzer, 500, 100); // Sound buzzer briefly on button press
} else if (digitalRead(btnMinus) == LOW) {
if (settingMode == 0) {
alarmHour = (alarmHour + 23) % 24;
} else {
alarmMinute = (alarmMinute + 59) % 60;
}
lastDebounceTime = millis();
tone(buzzer, 500, 100); // Sound buzzer briefly on button press
}
if (digitalRead(btnSet) == LOW) {
settingMode = (settingMode + 1) % 2;
lastDebounceTime = millis();
tone(buzzer, 500, 100); // Sound buzzer briefly on button press
}
}
}
// Update time display only if it changes
if (now.hour() != lastHour || now.minute() != lastMinute || now.second() != lastSecond) {
lcd.setCursor(0, 0);
lcd.print(now.hour() < 10 ? "0" : "");
lcd.print(now.hour(), DEC);
lcd.print(":");
lcd.print(now.minute() < 10 ? "0" : "");
lcd.print(now.minute(), DEC);
lcd.print(":");
lcd.print(now.second() < 10 ? "0" : "");
lcd.print(now.second(), DEC);
lastHour = now.hour();
lastMinute = now.minute();
lastSecond = now.second();
}
// Update alarm display only if necessary
if (isSettingAlarm != lastIsSettingAlarm || settingMode != lastSettingMode ||
alarmHour != lastAlarmHour || alarmMinute != lastAlarmMinute) {
lcd.setCursor(0, 1);
lcd.print(" "); // Clear the second line
lcd.setCursor(0, 1);
if (isSettingAlarm) {
if (settingMode == 0) {
lcd.print("Set Hour: ");
lcd.print(alarmHour < 10 ? "0" : "");
lcd.print(alarmHour, DEC);
} else {
lcd.print("Set Minute: ");
lcd.print(alarmMinute < 10 ? "0" : "");
lcd.print(alarmMinute, DEC);
}
} else {
lcd.print("Alarm: ");
lcd.print(alarmHour < 10 ? "0" : "");
lcd.print(alarmHour, DEC);
lcd.print(":");
lcd.print(alarmMinute < 10 ? "0" : "");
lcd.print(alarmMinute, DEC);
}
lastIsSettingAlarm = isSettingAlarm;
lastSettingMode = settingMode;
lastAlarmHour = alarmHour;
lastAlarmMinute = alarmMinute;
}
}
// Function to play melody
void playMelody() {
for (int i = 0; i < 8; i++) {
int noteDuration = 1000 / noteDurations[i];
tone(buzzer, melody[i], noteDuration);
delay(noteDuration * 1.30); // Pause between notes
noTone(buzzer); // Stop the tone before playing the next one
}
}