#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27,16,2);
char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
int amin = 0 ;
int ahour = 0;
int mode = 6;
int increase = 7;
int decrease = 8;
int confirm = 9;
int menu = 0;
int astatus = 0;
int change = 0;
void setup ()
{
pinMode(mode,INPUT_PULLUP);
pinMode(increase, INPUT_PULLUP);
pinMode(decrease, INPUT_PULLUP);
pinMode(confirm, INPUT_PULLUP);
Serial.begin(9600);
lcd.init();
lcd.backlight();
if (! rtc.begin())
{
lcd.print("Couldn't find RTC");
while (1);
}
if (! rtc.isrunning())
{
lcd.print("RTC is NOT running!");
}
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));//auto update from computer time
}
void loop ()
{
if(digitalRead(mode) == LOW){
menu = (menu + 1) % 3; // Reset to 0 when it reaches 2
delay(200); // Debouncing delay
}
if(menu == 0 ){
displayTime();
}
else if(menu == 1){
showAll();
}
else if(menu == 2){
setAlarm();
}
}
void showAll(){
lcd.clear();
while (digitalRead(mode)==HIGH){
displayNow();
alarmShow();
}
}
void setAlarm() {
lcd.clear();
DateTime now = rtc.now();
while(digitalRead(mode)==HIGH){
lcd.setCursor(0, 0);
lcd.print("Set alarm time:");
lcd.setCursor(5, 1);
lcd.print((ahour < 10) ? "0" : "");
lcd.print(ahour, DEC);
lcd.print(":");
lcd.print((amin < 10) ? "0" : "");
lcd.print(amin, DEC);
if (digitalRead(confirm) == LOW) {
change = (change + 1) % 2;
delay(200);
}
if (change == 0) {
setAlarmMinute();
}
if(change==1){
setAlarmHour();
}
if(astatus==1){
if(now.minute()==amin&&now.hour()==ahour){
lcd.clear();
lcd.print("Alarm!!!!!");
delay(60000);
}
}
}
}
void setAlarmHour(){
while(digitalRead(confirm)==HIGH&&digitalRead(mode)==HIGH){
if(digitalRead(increase) == LOW){
if(ahour >= 23){
ahour = 0;
} else {
ahour++;
}
lcd.setCursor(5,1);
if(ahour < 10){
lcd.print("0");
}
lcd.print(ahour, DEC);
delay(200); // Debouncing delay
}
if(digitalRead(decrease) == LOW){
if(ahour <= 0){
ahour = 23;
} else {
ahour--;
}
lcd.setCursor(5,1);
if(ahour < 10){
lcd.print("0");
}
lcd.print(ahour, DEC);
delay(200); // Debouncing delay
}
}
}
void setAlarmMinute(){
while(digitalRead(confirm)==HIGH&&digitalRead(mode)==HIGH){
if(digitalRead(increase)==LOW){
if(amin >= 59){
amin = 0;
} else {
amin++;
}
lcd.setCursor(8,1);
if(amin < 10){
lcd.print("0");
}
lcd.print(amin, DEC);
delay(200); // Debouncing delay
}
if(digitalRead(decrease)==LOW){
if(amin <= 0){
amin = 59;
} else {
amin--;
}
lcd.setCursor(8,1);
if(amin < 10){
lcd.print("0");
}
lcd.print(amin, DEC);
delay(200); // Debouncing delay
}
}
}
void alarmShow(){
lcd.setCursor(0,1);
lcd.print("Alarm:");
lcd.setCursor(7,1);
if(ahour<10){
lcd.print("0");
lcd.print(ahour,DEC);
}else{
lcd.print(ahour,DEC);
}
lcd.print(":");
if(amin<10){
lcd.print("0");
lcd.print(amin,DEC);
}else{
lcd.print(amin,DEC);
}
lcd.setCursor(13,1);
if(digitalRead(confirm)==LOW){
astatus=(astatus+1)%2;
delay(200);
lcd.clear();
}
if(astatus==0){
lcd.print("OFF");
}
if(astatus==1){
lcd.print("ON");
}
}
void displayNow(){
DateTime now = rtc.now();
lcd.setCursor(0,0);
lcd.print("Now:");
lcd.setCursor(4, 0);
if(now.hour()<=9)
{
lcd.print("0");
lcd.print(now.hour());
}
else {
lcd.print(now.hour());
}
lcd.print(':');
if(now.minute()<=9)
{
lcd.print("0");
lcd.print(now.minute());
}
else {
lcd.print(now.minute());
}
lcd.print(':');
if(now.second()<=9)
{
lcd.print("0");
lcd.print(now.second());
}
else {
lcd.print(now.second());
}
lcd.print(" ");
}
void displayTime(){
DateTime now = rtc.now();
lcd.setCursor(4, 1);
if(now.hour()<=9)
{
lcd.print("0");
lcd.print(now.hour());
}
else {
lcd.print(now.hour());
}
lcd.print(':');
if(now.minute()<=9)
{
lcd.print("0");
lcd.print(now.minute());
}
else {
lcd.print(now.minute());
}
lcd.print(':');
if(now.second()<=9)
{
lcd.print("0");
lcd.print(now.second());
}
else {
lcd.print(now.second());
}
lcd.print(" ");
lcd.setCursor(1, 0);
lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
lcd.print(",");
if(now.day()<=9)
{
lcd.print("0");
lcd.print(now.day());
}
else {
lcd.print(now.day());
}
lcd.print('/');
if(now.month()<=9)
{
lcd.print("0");
lcd.print(now.month());
}
else {
lcd.print(now.month());
}
lcd.print('/');
if(now.year()<=9)
{
lcd.print("0");
lcd.print(now.year());
}
else {
lcd.print(now.year());
}
}