//ปุ่มสีเหลืองมีไว้ตั้งค่าเวลาเปิดปิด
//ปุ่มสีเขียวมีไว้เพิ่มตัวเลขเวลาที่ตั้ง
//ปุ่มสีเหลืองมีไว้ลดเวลาที่จะตั้ง
#include <LiquidCrystal_I2C.h> //ไลบรารี่จอ LCD
#include "RTClib.h" //ไลบรารี่นาฬิกา RTC DS1307
#include <Servo.h> //ไลบรารี่ servo
Servo myservo; //ตั้งชื่อให้ servo
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 () {
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
if (! rtc.begin()) { //เช็คว่าเชื่อมต่อกับ Ds1307 ได้ไหม
Serial.println("Couldn't find RTC"); //หากเชื่อมต่อไม่ได้ให้แจ้งเตื่อน
Serial.flush(); //เคลียข้อมูล
abort(); }
lcd.backlight(); //ใช้งานไฟหน้าจอ
myservo.attach(9); //ใช้งานขา 9 ให้ควบคุม servo
lcd.setCursor(4,0); //เซตตำแหน่งการแสดงผลหน้าจอ
lcd.print("HELLO ovo"); //แสดงตัวอักษร
delay(2000); //หน่วงเวลา 2 วินาที
}
int pos = 0;//ให้ค่า pos = 0
int h,m,s,h2,m2,h3,m3; //กำหนดตัวแปรเก็บค่าเวลา เวลาจริง เวลาเปิด เวลาปิด
int ST = 0; //กำหนดตัวแปล ST = 0
void 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
}
}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);
myservo.write(180);
delay(15);//สั่งงานเปิด
//เปิดการทำงาน
}
}
if(h3==h){ //หากชั่วโมงตรงกัน
if(m3==m){ //หากนาทีตรงกัน
st = "OFF" ; //เปลี่ยนเป็นคำว่า OFF
digitalWrite(Spring, LOW);
myservo.write(90);
delay(15);//หน่วงservo ให้ทำงานช้าลง0.015วินาที
//ปิดการทำงาน
}
}
}