#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
int h=10; //ชั่วโมง
int m=44; //นาที
int s; //วินาที
#define btn_h 2 //ปุ่มชั่วโมง
#define btn_m 4 //ปุ่มนาที
#define btn_set 6 //ปุ่มตั้งเวลา
bool set_state = true;
unsigned long ms;
unsigned long ms_comp = 0;
RTC_DS1307 RTC;
LiquidCrystal_I2C lcd(0x27,16,2);
void setup () {
Serial.begin(9600);
pinMode(btn_h, INPUT);
pinMode(btn_m, INPUT);
pinMode(btn_set, INPUT);
Wire.begin();
RTC.begin();
lcd.begin(16,2);
if (!RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// ตั้งเวลาโดยเรียกใช้เวลาปัจจุบันจากคอมพิวเตอร์
// เรียงลำดับการตั้งค่า ปี(ค.ศ.), เดือนที่, วันที่, ชั่วโมง, นาที, วินาที
RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void loop () {
// กำหนดตัวแปรประเภทเวลา(DateTime) ชื่อ now มีค่าเท่ากับวันเวลาปัจจุบัน
DateTime now = RTC.now();
showTime(); //แสดงออก Srial Monitor
displayLCD(); //แสดงออกจอ LCD
if(digitalRead(btn_set)== 1){
delay(150);
lcd.clear();
set_state = false;
while(set_state == false ){
lcd.setCursor(3,0);
lcd.print("Set Alarm");
lcd.setCursor(3,1);
lcd.print(h);
lcd.setCursor(5,1);
lcd.print("H");
lcd.print(" :");
lcd.setCursor(9,1);
lcd.print(m);
lcd.setCursor(11,1);
lcd.print("M");
if(digitalRead(btn_h) == 1){
delay(150);
h = h + 1;
if(h >= 24){
h = 0;
lcd.setCursor(3,1);
lcd.print(" ");
lcd.setCursor(4,1);
lcd.print(" ");
}
}
if(digitalRead(btn_m) == 1){
delay(150);
m = m + 1;
if(m >= 60){
m = 0;
lcd.setCursor(9,1);
lcd.print(" ");
lcd.setCursor(10,1);
lcd.print(" ");
}
}
if(digitalRead(btn_set) == 1){
delay(150);
set_state = true;
lcd.clear();
}
}
}
if(now.hour() == h && now.minute() == m){
ms = millis();
if(ms - ms_comp >= 1000){
lcd.setCursor(9,0);
lcd.print("ALARM!!");
}
if(ms - ms_comp >= 2000){
lcd.setCursor(9,0);
lcd.print(" ");
ms_comp = ms;
}
}
else{
lcd.setCursor(9,0);
lcd.print(" ");
}
}
void showTime(){
DateTime now = RTC.now();
Serial.print(now.month());
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(),DEC);
Serial.println();
}
void displayLCD(){
DateTime now = RTC.now();
lcd.setCursor(0,0);
lcd.print(now.month(),DEC); lcd.print('/');
lcd.print(now.day(),DEC); lcd.print('/');
lcd.print(now.year(),DEC);
lcd.setCursor(0,1);
lcd.print(now.hour(),DEC); lcd.print(':');
if(now.minute() <= 9){
lcd.setCursor(3,1);
lcd.print(0);
lcd.setCursor(4,1);
lcd.print(now.minute(),DEC);
}
else{
lcd.print(now.minute(),DEC);
}
lcd.print(':');
if(now.second() <= 9){
lcd.setCursor(6,1);
lcd.print(0);
lcd.setCursor(7,1);
lcd.print(now.second(),DEC);
}
else{
lcd.print(now.second(),DEC);
}
}