#include <LiquidCrystal.h>
#include <RTClib.h>
#define ENCODER_CLK A0
#define ENCODER_DT A1
#define ENCODER_SW A2
int now_hour=0;
int alarm_h=21;
int alarm_m=21;
int sw_flag=0;
int rig_flag=0;
int lef_flag=0;
int lastClk = HIGH;
int sw_val=1;
int sw_val_n=1;
int set=0;
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
RTC_DS1307 rtc;
void setup() {
Serial.begin(115200);
lcd.begin(16, 2);
rtc.begin();
pinMode(ENCODER_SW, INPUT_PULLUP);
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
lcd.setCursor(0,0);
lcd.print("Date:");
// DateTime now = rtc.now();
// Serial.print(now.year(), DEC);
// Serial.print(now.month(), DEC);
// Serial.print(now.day(), DEC);
}
void loop() {
// Serial.print("hhh\n");
DateTime now = rtc.now();
// show_time();
encoder_det();
if(sw_flag==1)
{
sw_flag=0;
if(set<2)
set++;
else
set=0;
Serial.print(set);
}
switch(set)
{
case 0 : show_time();
break;
// case 1 : show_alarm();
// break;
case 1 : if(rig_flag==1)
{
rig_flag=0;
if(alarm_h<23)
alarm_h++;
else
alarm_h=0;
}
else if(lef_flag==1)
{
lef_flag=0;
if(alarm_h>0)
alarm_h--;
else
alarm_h=0;
}
// Serial.print(alarm_h);
lcd.setCursor(8,1);
lcd.print("_");
show_alarm();
break;
case 2 : if(rig_flag==1)
{
rig_flag=0;
if(alarm_m<59)
alarm_m++;
else
alarm_m=0;
}
else if(lef_flag==1)
{
lef_flag=0;
if(alarm_m>0)
alarm_m--;
else
alarm_m=0;
}
// Serial.print(alarm_m);
lcd.setCursor(8,1);
lcd.print(" ");
lcd.setCursor(13,1);
lcd.print("_");
show_alarm();
break;
}
if(alarm_h==now.hour()&&alarm_m==now.minute())
tone(7, 262, 250); // Plays 262Hz tone for 0.250 seconds
}
void encoder_det()
{
int newClk = digitalRead(ENCODER_CLK);
if (newClk != lastClk)
{
lastClk = newClk;
int dtValue = digitalRead(ENCODER_DT);
if (newClk == LOW && dtValue == HIGH)
{
// Serial.println("Rotated clockwise >");
rig_flag=1;
}
if (newClk == LOW && dtValue == LOW)
{
// Serial.println("Rotated clockwise <");
lef_flag=1;
}
}
sw_val=digitalRead(ENCODER_SW);
if((sw_val==0)&&(sw_val_n==1))
{
sw_flag=1;
Serial.println("sw");
delay(10);
}
sw_val_n=sw_val;
}
void show_alarm()
{
lcd.setCursor(0,1);
lcd.print("Alarm:");
if(alarm_h<10)
{
lcd.setCursor(6,1);
lcd.print(" ");
lcd.setCursor(7,1);
}
else
lcd.setCursor(6,1);
lcd.print(alarm_h);
if(alarm_m<10)
{
lcd.setCursor(11,1);
lcd.print(" ");
lcd.setCursor(12,1);
}
else
lcd.setCursor(11,1);
lcd.print(alarm_m);
lcd.setCursor(9,1);
lcd.print(" ");
lcd.setCursor(14,1);
lcd.print(" ");
}
void show_time()
{
lcd.setCursor(0,1);
lcd.print(" Time:");
DateTime now = rtc.now();
lcd.setCursor(5,0);
lcd.print(now.year());
lcd.setCursor(10,0);
lcd.print(now.month());
lcd.setCursor(13,0);
lcd.print(now.day());
// show hour
now_hour=now.hour();
if(now_hour>12)
{
now_hour=now_hour-12;
lcd.setCursor(8,1);
lcd.print("PM");
}
else
{
lcd.setCursor(8,1);
lcd.print("AM");
}
if(now_hour<10)
{
lcd.setCursor(6,1);
lcd.print(" ");
lcd.setCursor(7,1);
}
else
lcd.setCursor(6,1);
lcd.print(now_hour);
// show minute
if(now.minute()<10)
{
lcd.setCursor(11,1);
lcd.print(" ");
lcd.setCursor(12,1);
}
else
lcd.setCursor(11,1);
lcd.print(now.minute());
// show second
if(now.second()<10)
{
lcd.setCursor(14,1);
lcd.print(" ");
lcd.setCursor(15,1);
}
else
lcd.setCursor(14,1);
lcd.print(now.second());
lcd.setCursor(13,1);
lcd.print(" ");
}