#include <LiquidCrystal_I2C.h> //ไลบรารี่จอ LCD
#include "RTClib.h" //ไลบรารี่นาฬิกา RTC DS1307
RTC_DS1307 rtc; //ตั้งชื่อการเรียกใช้งาน นาฬิกา
LiquidCrystal_I2C lcd(0x27,16,2); //แอดเดรส 0x27 ใส่ขนาดหน้าจอ 16 ตัวอักษร 2 แถว
#define Spring 10 //ใช้งานขาสปริงเกอร์ 10
#define ButtonDown 2 //กำหนดปุ่มลดเป็นขา 2
#define ButtonUp 3 //กำหนดปุ่มเพิ่มเป็นขา 3
#define ButtonSetting 4 //กำหนดปุ่มตั้งค่าเป็นขา 4
String st = "OFF" ; //ตัวแปรไว้เก็บข้อความ ON OFF เพื่อนำมาแสดงจอ
void setup () { //ฟังก์ชัน setup ทำงานครั้งเดียวตอนเมื่อเริ่มโปรแกรม
Serial.begin(9600);
pinMode(Spring, OUTPUT); //ตั้งขา 10 เป็น OUTPUT ขาพัดลม
pinMode(ButtonUp, INPUT_PULLUP); //ตั้งเป็น INPUT
pinMode(ButtonDown, INPUT_PULLUP); //ตั้งเป็น INPUT
pinMode(ButtonSetting, INPUT_PULLUP); //ตั้งเป็น INPUT
lcd.init(); //ใช้งาน จอ LCD
lcd.backlight(); //ใช้งานไฟหน้าจอ
if (! rtc.begin()) { //เช็คว่าเชื่อมต่อกับ Ds1307 ได้ไหม
Serial.println("Couldn't find RTC"); //หากเชื่อมต่อไม่ได้ให้แจ้งเตื่อน
Serial.flush(); //เคลียข้อมูล
abort();
}
lcd.setCursor(1,0); //เซตตำแหน่งการแสดงผลหน้าจอ
lcd.print("HELLO"); //แสดงตัวอักษร
delay(1000); //หน่วงเวลา
}
int h,m,s,h2,m2,h3,m3; //กำหนดตัวแปรเก็บค่าเวลา เวลาจริง เวลาเปิด เวลาปิด
unsigned char ST = 0; //ตัวแปรสถานะการตั้งค่า
void loop () { //ฟังก์ชัน loop ทำงานวนซ้ำตลอด
DateTime now = rtc.now(); //ดึงค่าเวลาจริง
h = now.hour(); //ดึงเวลา ชั่วโมง
m = now.minute(); //ดึงค่าเวลานาที
s = now.second(); //ดึงค่าเวลาวินาที
if( digitalRead(ButtonSetting) == LOW ){ //หากกดปุ่มตั้งค่า
ST++; //เพิ่มค่าตัวแปร ST
if(ST==5){ //หากค่าตัวแปร ST = 5
lcd.clear(); //เคลียร์หน้าจอ
ST=0; //ให้ค่าตัวแปรเป็น 0
}
while(digitalRead(ButtonSetting) == LOW){} //รอจนกว่าจะปล่อยปุ่มตั้งค่า
}else if(digitalRead(ButtonUp) == LOW ){ //หากกดปุ่มเพิ่ม
if(ST==1){ //หากตัวแปร ST = 1
h2++; //เพิ่มค่าตัวแปร
}else if(ST==2){ //หากตัวแปร ST = 2
m2++; //เพิ่มค่าตัวแปร
}else if(ST==3){ //หากตัวแปร ST = 3
h3++; //เพิ่มค่าตัวแปร
}else if(ST==4){ //เพิ่มค่าตัวแปร
m3++; //เพิ่มค่าตัวแปร
}
}else if(digitalRead(ButtonDown) == LOW ){ //หากกดปุ่มลด
if(ST==1){ //หากตัวแปร ST = 1
h2--; //ลดค่าตัวแปร
}else if(ST==2){ //หากตัวแปร ST = 2
m2--; //ลดค่าตัวแปร
}else if(ST==3){ //หากตัวแปร ST = 3
h3--; //ลดค่าตัวแปร
}else if(ST==4){ //หากตัวแปร ST = 4
m3--; //ลดค่าตัวแปร
}
}
show(); //ทำงานในฟังก์ชันแสดงหน้าจอ LCD
delay(200); //หน่วงเวลา
}
void show(){ //ฟังก์ชันแสดงหน้าจอ
if(ST==0){ //หากตัวแปร ST = 0
lcd.setCursor(0,0); //เซตตำแหน่งการแสดงผลหน้าจอ
lcd.print(String(h)+":"+String(m)+":"+String(s)+" ");
lcd.setCursor(9,0); //เซตตำแหน่งการแสดงผลหน้าจอ
lcd.print("ST:"+st);
check(); //ทำงานฟังก์ชัน เช็คเวลาว่าตรงกับการตั้งค่า
}else{
lcd.clear();
if(ST==1){ //หากตัวแปร ST = 1
if(h2<10){
lcd.setCursor(2,0); //เซตตำแหน่งการแสดงผลหน้าจอ
}else{
lcd.setCursor(3,0); //เซตตำแหน่งการแสดงผลหน้าจอ
}
}else if(ST==2){ //หากตัวแปร ST = 2
if(h2<10 && m2<10){
lcd.setCursor(4,0);
}else if(h2<10 || m2<10){
lcd.setCursor(5,0); //เซตตำแหน่งการแสดงผลหน้าจอ
}else{
lcd.setCursor(6,0); //เซตตำแหน่งการแสดงผลหน้าจอ
}
}else if(ST==3){ //หากตัวแปร ST = 3
if(h3<10){
lcd.setCursor(9,0); //เซตตำแหน่งการแสดงผลหน้าจอ
}else{
lcd.setCursor(10,0); //เซตตำแหน่งการแสดงผลหน้าจอ
}
}else if(ST==4){ //หากตัวแปร ST = 4
if(h3<10 && m3<10){
lcd.setCursor(11,0); //เซตตำแหน่งการแสดงผลหน้าจอ
}else if(h3<10 || m3<10){
lcd.setCursor(12,0); //เซตตำแหน่งการแสดงผลหน้าจอ
}else{
lcd.setCursor(13,0); //เซตตำแหน่งการแสดงผลหน้าจอ
}
}
lcd.print("*"); //แสดง *
}
lcd.setCursor(2,1); //เซตตำแหน่งการแสดงผลหน้าจอ
lcd.print(String(h2)+":"+String(m2)); //แสดงเวลาเปิด
lcd.setCursor(9,1); //เซตตำแหน่งการแสดงผลหน้าจอ
lcd.print(String(h3)+":"+String(m3)); //แสดงเวลาปิด
}
void check(){ //ฟังก์ชั้นตรวสอบเวลา
if(h2==h){ //หากชั่วโมงตรงกัน
if(m2==m){ //หากนาทีตรงกัน
st="ON " ; //เปลี่ยนเป็นคำว่า ON
digitalWrite(Spring, HIGH); //สั่งงานเปิด
//เปิดการทำงาน
}
}
if(h3==h){ //หากชั่วโมงตรงกัน
if(m3==m){ //หากนาทีตรงกัน
st = "OFF" ; //เปลี่ยนเป็นคำว่า OFF
digitalWrite(Spring, LOW); //สั่งงานปิด
//ปิดการทำงาน
}
}
}