// มีปัญหา void SetMOn (int j,int m,int e) ออกloop เอง แก้ 30ms millis ไม่หาย
#include <LiquidCrystal_PCF8574.h>
LiquidCrystal_PCF8574 lcd(0x27); // ค่า 0x27 เป็นค่าเฉพาะแต่ละบอร์ด จอ
#include <Wire.h> // i2c bus
#include "RTClib.h"
#include "EEPROM-Storage.h" // ใช้ใน Wokwi
//#include "EEPROM.h" ใช้ใน Arduino IDE
RTC_DS1307 RTC; // ประกาศใช้ RTC สำหรับ นาฬิกา DS1307
//************Variables*************
int p,c,sp; //p ใช้ส่ง่ค่าเลือกP1,2,3 ;c ใช้ส่งค่าคอลัมป์; sp ใช้ส่งค่าใน SetProg
int OK=2;
int btt;
int hourupg;
int minupg;
unsigned int T;
unsigned int Dpy;
unsigned int memi[1][1],TimerOn[3][2],TimerOff[3][2];
//************Button*****************//
const byte BUTTON_SET =A2; // Button SET MENU' PB0
const byte BUTTON_UP =A1; // Button + Yellow PB1
const byte BUTTON_DW =A0; // Button - Green PB5
const byte BUTTON_CANCEL=2; //
//**************RELAY for Zone ***************//
#define Zone1 6
#define Zone2 5
#define Zone3 4
#define Zone4 3
#define buzzer 10
void setup()
{ Dpy=0; //show P1,=1 show P2,=2 showP3
// Serial.begin(9600);
lcd.begin(20,4);
lcd.setBacklight(255);
Wire.begin(); ///fn.i2c
RTC.begin(); /// fn.Clock
pinMode(BUTTON_SET,INPUT_PULLUP); // https://www.arduino.cc/en/Tutorial/InputPullupSerial
pinMode(BUTTON_UP,INPUT_PULLUP);
pinMode(BUTTON_DW,INPUT_PULLUP);
pinMode(BUTTON_CANCEL,INPUT_PULLUP);
pinMode(Zone1,OUTPUT);
pinMode(Zone2,OUTPUT);
pinMode(Zone3,OUTPUT);
pinMode(Zone4,OUTPUT);
pinMode(buzzer, OUTPUT);
}
void loop()
{
static unsigned long LcdTime = millis(); //ตั้งค่านับเวลาให้ LCD
static unsigned long ActZTime = millis();
static unsigned long TimeSwUp = millis(); //ตั้งค่านับเวลาให้ button Up
static unsigned long TimeSwDw = millis(); //ตั้งค่านับเวลาให้ button Dw
static unsigned long TimeSwSet = millis(); //ตั้งค่านับเวลาให้ button Set
static boolean FlagUp = false;
static boolean FlagDw = false;
static boolean FlagSet = false;
static boolean Display = true;
static boolean ButtonSet = false;
static boolean ButtonUp = false;
static boolean ButtonDw = false;
if ((millis()-LcdTime)>=500) // ตั้งค่า millis ให้แสดงผลทุก 500ms
{
LcdTime = millis();
DisplayTimenow();
}
if ((millis()-ActZTime)>=500) // ตั้งค่า millis ให้แสดงผลทุก 500ms
{
ActZTime = millis();
ActZone ();
}
if(Dpy==0){
if(Display == true)
{
DisplayP1();
c=9;
p=0;
showmem(c,p);
//Serial.println("You select P1");
Display = false;
}
}
if (Dpy==1)
{
if(Display == true)
{
DisplayP2();
c=9;
p=16;
showmem(c,p);
//Serial.println("You select P2");
Display = false;
}
}
if(Dpy==2){
if(Display == true)
{
DisplayP3();
c=9;
p=32;
showmem(c,p);
//Serial.println("You select P3");
Display = false;
}
}
////////////////////////////////////////////////
if(digitalRead(BUTTON_UP)==0)
{
if((millis()-TimeSwUp)>50){ // เมื่อมีสัญญาณ 0 เช้ามาให้เช็คอีกรอบว่า
if(digitalRead(BUTTON_UP)==0){ // ให้เช็คอีกรอบว่า ตอนนี้ยังเป็น 0 อยู่ไม
if(FlagUp == false){ // ถ้าเป็นให้เข้ามาเพื่อเคลียค่า Flag=false
FlagUp = true;
Display = true;
if(Dpy<2){Dpy++;}
else{Dpy=0;}
}
}
}
}else{
TimeSwUp=millis();
FlagUp = false;
}
////////////////////////////////////////////////////// Debounce by millis
if(digitalRead(BUTTON_DW)==0)
{
if((millis()-TimeSwDw)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_DW)==0){ // เช็คอีกรอบว่า = 0
if(FlagDw == false){ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagDw = true;
Display = true;
if(Dpy>0){Dpy--;}
else{Dpy=2;}
}
}
}
}else{
TimeSwDw=millis(); //ให้เริ่มนับตาม millis
FlagDw = false; // รีเซทค่า FlagDw
}
////////////////////////////////////////////////////// Debounce by millis
if (digitalRead(BUTTON_SET) == 0)
{
if((millis()-TimeSwSet)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_SET)==0){ // เช็คอีกรอบว่า = 0
if(FlagSet == false){ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagSet = true;
SelectMenu(); // เรียก fn. ทำงาน วน
Display = true;
}
}
}
}else{
TimeSwSet=millis(); //ส่งค่าเริ่มต้น millis ให้ตัวแปร TimSwSet
FlagSet = false; // รีเซทค่า FlagDw
}
}
void SelectMenu (void)
{
static unsigned long LcdTime = millis(); //ตั้งค่านับเวลาให้ LCD
static unsigned long ActZTime = millis();
static unsigned long TimeSwUp = millis(); //ตั้งค่านับเวลาให้ button Up
static unsigned long TimeSwDw = millis(); //ตั้งค่านับเวลาให้ button Dw
static unsigned long TimeSwSet = millis(); //ตั้งค่านับเวลาให้ button Set
static boolean FlagUp = false;
static boolean FlagDw = false;
static boolean FlagSet = false;
static boolean Display = true;
// ตัวแปรไม่ต้อง ใส่แบบ static นำก็ได้เพราะการทำงานไม่ได้ออกนอก loop while อยู่แล้ว
boolean Exit = false;
boolean ButtonSet = true; /// ??? ฟัง เวลา 25.20
boolean ButtonUp = false;
boolean ButtonDw = false;
boolean ButtonCancel = false;
byte Menu = 0;
const char MenuText[4][21]= { "Press Set=> Set-Pro1", // [4][21] 4 คือจน.แถว 21 คอลัมป์ เพื่อ จาก20 เป็น21
"Press Set=> Set-Pro2",
"Press Set=> Set-Pro3",
"Press Set=> Set-Time", };
while(Exit == false)
{
if(Display == true)
{
Display = false;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Press Up/Down Select");
lcd.setCursor(0,3);
lcd.print("Press Cancel -> Exit");
lcd.setCursor(0,2);
lcd.print(MenuText[Menu]);
}
////////////////////////////////////////////////////// Debounce by millis
if (digitalRead(BUTTON_SET) == 0)
{
if((millis()-TimeSwSet)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_SET)==0){ // เช็คอีกรอบว่า = 0
if(FlagSet == false){ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagSet = true;
switch(Menu){ ////////// ****สามารถนำ Fn. มาใส่ตรงนี้ได้เลย
case 0: //Serial.println("You select Set P1");
sp=0;
SetProg(sp);
break;
case 1: //Serial.println("You select Set P2");
sp=1;
SetProg(sp);
;break;
case 2: //Serial.println("You select Set P3");
sp=2;
SetProg(sp);
;break;
case 3: //Serial.println("You select Set Time");
sp=2;
DisplaySetHour();
DisplaySetMinute(); ;
;break;
}
}
}
}
else{
TimeSwSet=millis(); //ส่งค่าเริ่มต้น millis ให้ตัวแปร TimSwSet
FlagSet = false; // รีเซทค่า FlagDw
}
///////////////////////////////////////////////////
////////////////////////////////////////////////
if(digitalRead(BUTTON_UP)==0)
{
if((millis()-TimeSwUp)>50){ // เมื่อมีสัญญาณ 0 เช้ามาให้เช็คอีกรอบว่า
if(digitalRead(BUTTON_UP)==0){ // ให้เช็คอีกรอบว่า ตอนนี้ยังเป็น 0 อยู่ไม
if(FlagUp == false){ // ถ้าเป็นให้เข้ามาเพื่อเคลียค่า Flag=false
FlagUp = true;
Display = true;
if(Menu<3){
Menu++;
}
else{
Menu=0;
}
Display = true; //////////////////เมื่อมีการกด Display จะเป็น true
}
}
}
else{
TimeSwUp=millis();
FlagUp = false;
}
////////////////////////////////////////////////////// Debounce by millis
if(digitalRead(BUTTON_DW)==0)
{
if((millis()-TimeSwDw)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_DW)==0){ // เช็คอีกรอบว่า = 0
if(FlagDw == false){ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagDw = true;
Display = true;
if(Dpy>0){Dpy--;}
else{Dpy=2;}
}
}
}
}else{
TimeSwDw=millis(); //ให้เริ่มนับตาม millis
FlagDw = false; // รีเซทค่า FlagDw
}
if (digitalRead(BUTTON_DW)==0)
{
delay(1);
if(digitalRead(BUTTON_DW) ==0){
if(ButtonDw ==false)
{
ButtonDw = true;
if(Menu>0)
{
Menu--;
}
else{
Menu=3;
}
Display = true; //////////////////เมื่อมีการกด Display จะเป็น true
}
}
}
else{
ButtonDw= false;
}
////////////////////////////////////////////////////////
if (digitalRead(BUTTON_CANCEL)==0)
{
delay(1);
if(digitalRead(BUTTON_CANCEL) ==0)
{
if(ButtonCancel ==false)
{
ButtonCancel = true;
Exit = true; //////เมื่อ Exitเป้นtrue ก็จะออกจาก loop while
}
}
}
else{
ButtonCancel = false;
}
////////////////////////////////////////////////////////
}
}
void DisplayP1() // menu == 0
{
////////////////////////////////////////////////////////
//lcd.clear();
//DisplayTimenow() ;
lcd.setCursor(0, 0);
lcd.print("[P1] Z1>--:--=--:--");
lcd.setCursor(0, 1);
lcd.print(" Z2>--:--=--:--");
lcd.setCursor(0, 2);
lcd.print("[Time]Z3>--:--=--:--");
lcd.setCursor(5, 3);
lcd.print(" Z4>--:--=--:--");
}
/////////////////////////////////////
void DisplayP2() // Dpy== 1
{
////////////////////////////////////////////////////////
//lcd.clear();
//DisplayTimenow() ;
lcd.setCursor(0, 0);
lcd.print("[P2] Z1>--:--=--:--");
lcd.setCursor(0, 1);
lcd.print(" Z2>--:--=--:--");
lcd.setCursor(0, 2);
lcd.print("Time Z3>--:--=--:--");
lcd.setCursor(5, 3);
lcd.print(" Z4>--:--=--:--");
}
/////////////////////////////////////
void DisplayP3() // Dpy== 2
{
////////////////////////////////////////////////////////
//lcd.clear();
//DisplayTimenow() ;
lcd.setCursor(0, 0);
lcd.print("[P3] Z1>--:--=--:--");
lcd.setCursor(0, 1);
lcd.print(" Z2>--:--=--:--");
lcd.setCursor(0, 2);
lcd.print("Time Z3>--:--=--:--");
lcd.setCursor(5, 3);
lcd.print(" Z4>--:--=--:--");
}
//////////////////////////////////////
void DisplayTimenow()
{
DateTime now = RTC.now();
lcd.setCursor(0, 3);
if (now.hour() <= 9) // เช็คค่าก่่อนว่าค่าที่ส่งมามากกว่า9จะโชว์ค่า0ก่อน
{
lcd.print("0");
}
lcd.print(now.hour(), DEC); // ถ้าไม่มีเลข0คือ>9 คือ2หลักให้โชว์เลย
//hourupg = now.hour();
lcd.print(":");
if (now.minute() <= 9)
{
lcd.print("0");
}
lcd.print(now.minute(), DEC);
//minupg = now.minute();
}
////////////////////////////////////////////
void showmem(int c,int p)
{
//////////////////////////////// TimeOn-Hour
T = EEPROM.read(0+p);
TimerOn[0][0]=T;
lcd.setCursor(c,0);
if (T<=9){lcd.print(0);}
if(T>23){lcd.print("**");}
else
{lcd.print(T);}
T = EEPROM.read(4+p);
TimerOn[1][0]=T;
lcd.setCursor(c,1);
if (T<=9){lcd.print(0);}
if(T>23){lcd.print("**");}
else
{lcd.print(T);}
T = EEPROM.read(8+p);
TimerOn[2][0]=T;
lcd.setCursor(c,2);
if (T<=9){lcd.print(0);}
if(T>23){lcd.print("**");}
else
{lcd.print(T);}
T = EEPROM.read(12+p);
TimerOn[3][0]=T;
lcd.setCursor(c,3);
if (T<=9){lcd.print(0);}
if(T>23){lcd.print("**");}
else
{lcd.print(T);}
//////////////////////////////// TimeOn-Min
T = EEPROM.read(1+p);
TimerOn[0][1]=T;
lcd.setCursor((c+3),0);
if (T<=9){lcd.print(0);}
if(T>59){lcd.print("**");}
else
{lcd.print(T);}
T = EEPROM.read(5+p);
TimerOn[1][1]=T;
lcd.setCursor((c+3),1);
if (T<=9){lcd.print(0);}
if(T>59){lcd.print("**");}
else
{lcd.print(T);}
T = EEPROM.read(9+p);
TimerOn[2][1]=T;
lcd.setCursor((c+3),2);
if (T<=9){lcd.print(0);}
if(T>59){lcd.print("**");}
else
{lcd.print(T);}
T = EEPROM.read(13+p);
TimerOn[3][1]=T;
lcd.setCursor((c+3),3);
if (T<=9){lcd.print(0);}
if(T>59){lcd.print("**");}
else
{lcd.print(T);}
///////////////////////////////////////// Time Off-Hour
T = EEPROM.read(2+p);
TimerOff[0][0]=T;
lcd.setCursor((c+6),0);
if (T<=9){lcd.print(0);}
if(T>23){lcd.print("**");}
else
{lcd.print(T);}
T = EEPROM.read(6+p);
TimerOff[1][0]=T;
lcd.setCursor((c+6),1);
if (T<=9){lcd.print(0);}
if(T>23){lcd.print("**");}
else
{lcd.print(T);}
T = EEPROM.read(10+p);
TimerOff[2][0]=T;
lcd.setCursor((c+6),2);
if (T<=9){lcd.print(0);}
if(T>23){lcd.print("**");}
else
{lcd.print(T);}
T = EEPROM.read(14+p);
TimerOff[3][0]=T;
lcd.setCursor((c+6),3);
if (T<=9){lcd.print(0);}
if(T>23){lcd.print("**");}
else
{lcd.print(T);}
////////////////////////////////////////////Time Off-Min
T = EEPROM.read(3+p);
TimerOff[0][1]=T;
lcd.setCursor((c+9),0);
if (T<=9){lcd.print(0);}
if(T>59){lcd.print("**");}
else
{lcd.print(T);}
T = EEPROM.read(7+p);
TimerOff[1][1]=T;
lcd.setCursor((c+9),1);
if (T<=9){lcd.print(0);}
if(T>59){lcd.print("**");}
else
{lcd.print(T);}
T = EEPROM.read(11+p);
TimerOff[2][1]=T;
lcd.setCursor((c+9),2);
if (T<=9){lcd.print(0);}
if(T>59){lcd.print("**");}
else
{lcd.print(T);}
T = EEPROM.read(15+p);
TimerOff[3][1]=T;
lcd.setCursor((c+9),3);
if (T<=9){lcd.print(0);}
if(T>59){lcd.print("**");}
else
{lcd.print(T);}
}
////////////////////////////////////////////
////////////////////////////////////////////
void DisplaySetHour()
{
boolean Display = true; // ให้หน้าจอเริ่มทำงาน
boolean Exit = false;
boolean ButtonSet = true; /// ??? ฟัง เวลา 25.20
boolean ButtonUp = false;
boolean ButtonDw = false;
boolean ButtonCancel = false;
/////////////////////////////////////////////////////////////
static boolean FlagUp = false;
static boolean FlagDw = false;
static boolean FlagSt = false;
static unsigned long TimeSwUp = millis(); //ตั้งค่านับเวลาให้ button Up
static unsigned long TimeSwDw = millis(); //ตั้งค่านับเวลาให้ button Dw
static unsigned long TimeSwSt = millis(); //ตั้งค่านับเวลาให้ button St
DateTime now = RTC.now();
hourupg = now.hour();
while ( Exit == false )
{
////////////////////////////////////////////////////// Debounce by millis
if(digitalRead(BUTTON_UP)==0)
{
if((millis()-TimeSwUp)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_UP)==0){ // เช็คอีกรอบว่า = 0
if(FlagUp == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagUp = true;
Display = true; // Reflash lcd
if (hourupg == 23)
{
hourupg = 0;
}
else{hourupg = hourupg + 1;}
}
}
}
} else{
TimeSwUp=millis(); //ให้เริ่มนับตาม millis
FlagUp = false; // รีเซทค่า FlagDw
}
//////////////////////////////////////////
if(digitalRead(BUTTON_DW)==0)
{
if((millis()-TimeSwDw)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_DW)==0){ // เช็คอีกรอบว่า = 0
if(FlagDw == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagDw = true;
Display = true; // Reflash lcd
if (hourupg == 0)
{
hourupg = 23;
}
else{hourupg = hourupg - 1;}
}
}
}
}else{
TimeSwDw=millis(); //ให้เริ่มนับตาม millis
FlagDw = false; // รีเซทค่า FlagDw
}
if (Display ==true){
Display =false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SET- Hour");
lcd.setCursor(0, 1);
lcd.print("Press[UP]/[DW]Select");
lcd.setCursor(0, 2);
lcd.print("Press [SET]->OK");
DisplayTimenow();
lcd.setCursor(0, 3);
lcd.blink();
if (hourupg <= 9) // เช็คค่าก่่อนว่าค่าที่ส่งมามากกว่า9จะโชว์ค่า0ก่อน
{
lcd.print("0");
}
lcd.print(hourupg);
lcd.setCursor(1, 3);
}
if(digitalRead(BUTTON_SET)==0)
{
if((millis()-TimeSwSt)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_SET)==0){ // เช็คอีกรอบว่า = 0
if(FlagSt == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagSt = true;
Display = true; // Reflash lcd
Exit = true ; ////////////////// out loop while
}
}
}
}else{
TimeSwSt=millis(); //ให้เริ่มนับตาม millis
FlagSt = false; // รีเซทค่า FlagDw
}
}
////////////////////////////////////////// out loop while
}
////////////////////////////////////////////////////////////
////////////////////////////////////////////
void DisplaySetMinute()
{
boolean Display = true; // ให้หน้าจอเริ่มทำงาน
boolean Exit = false;
boolean ButtonSet = true; /// ??? ฟัง เวลา 25.20
boolean ButtonUp = false;
boolean ButtonDw = false;
boolean ButtonCancel = false;
/////////////////////////////////////////////////////////////
static boolean FlagUp = false;
static boolean FlagDw = false;
static boolean FlagSt = false;
static unsigned long TimeSwUp = millis(); //ตั้งค่านับเวลาให้ button Up
static unsigned long TimeSwDw = millis(); //ตั้งค่านับเวลาให้ button Dw
static unsigned long TimeSwSt = millis(); //ตั้งค่านับเวลาให้ button St
DateTime now = RTC.now();
minupg = now.minute();
while ( Exit == false )
{
////////////////////////////////////////////////////// Debounce by millis
if(digitalRead(BUTTON_UP)==0)
{
if((millis()-TimeSwUp)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_UP)==0){ // เช็คอีกรอบว่า = 0
if(FlagUp == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagUp = true;
Display = true; // Reflash lcd
if (minupg == 59)
{
minupg = 0;
}
else{minupg = minupg + 1;}
}
}
}
} else{
TimeSwUp=millis(); //ให้เริ่มนับตาม millis
FlagUp = false; // รีเซทค่า FlagDw
}
//////////////////////////////////////////
if(digitalRead(BUTTON_DW)==0)
{
if((millis()-TimeSwDw)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_DW)==0){ // เช็คอีกรอบว่า = 0
if(FlagDw == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagDw = true;
Display = true; // Reflash lcd
if (minupg == 0)
{
minupg = 59;
}
else{minupg = minupg - 1;}
}
}
}
}else{
TimeSwDw=millis(); //ให้เริ่มนับตาม millis
FlagDw = false; // รีเซทค่า FlagDw
}
if (Display ==true){
Display =false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SET- Minute");
lcd.setCursor(0, 1);
lcd.print("Press[UP]/[DW]Select");
lcd.setCursor(0, 2);
lcd.print("Press [SET]->OK");
lcd.setCursor(0,3);
if(hourupg<9){lcd.print("0");}
lcd.print(hourupg, DEC);
lcd.print(":");
lcd.setCursor(3, 3);
lcd.blink();
if (minupg <= 9) // เช็คค่าก่่อนว่าค่าที่ส่งมามากกว่า9จะโชว์ค่า0ก่อน
{
lcd.print("0");
}
lcd.print(minupg);
lcd.setCursor(4, 3);
}
if(digitalRead(BUTTON_SET)==0)
{
if((millis()-TimeSwSt)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_SET)==0){ // เช็คอีกรอบว่า = 0
if(FlagSt == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagSt = true;
Display = true; // Reflash lcd
Exit = true ; ////////////////// out loop while
}
}
}
}else{
TimeSwSt=millis(); //ให้เริ่มนับตาม millis
FlagSt = false; // รีเซทค่า FlagDw
}
}
////////////////////////////////////////// out loop while
RTC.adjust(DateTime(2024, 1, 21, hourupg, minupg, 0));
lcd.noBlink();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Save-Time");
lcd.setCursor(0, 1);
lcd.print(hourupg, DEC);
lcd.print(":");
lcd.print(minupg, DEC);
delay(1500);
SelectMenu();
}
///////////////////******* MEM EEPROM AND SET PROGRAM *************
void SetProg(int sp) // sp = ค่าของ P1,P2,P3
{
int i,j,k,l,e; // i,j,k ใช้เป็นตัวชี้ใน fn i=fn.showH j=fn.showM
// k=fn.showOffH l=fn.showOffM ,m = กำหนดรอบfor , e=ตัวชี้ EEPROM
i=0,j=0,k=0,l=0;
if(sp==0){e=0;}
if(sp==1){e=18;}
if(sp==2){e=32;}
showscreen(sp);
inkey (i,e,j,k,l);
///////////////////////////// END ////////////////
lcd.clear();
lcd.noBlink();
lcd.clear();
lcd.setCursor(0,1);
lcd.print("Save - Time Control");
delay(1000);
SelectMenu();
}
void inkey (int i,int e,int j,int k,int l)
{
int Ex=0;
while((i < 4)&& (Ex==0) ) // เงื่อนไข i และ Ex ต้องไม่เป็นจริงทั้งคู่่และจะยังำม่ออกลูปจนกระทั้งทำครบ ลูป
{
Ex= SetHOn(i,e);
//Ex=Ex-0;
i=i+1;
e=e+1;
if (Ex>0){break;}
Ex= SetMOn(j,e);
j=j+1;
e=e+1;
if (Ex>0){break;}
Ex= SetHOff(k,e);
k=k+1;
e=e+1;
if (Ex>0){break;}
Ex= SetMOff(l,e);
l=l+1;
e=e+1;
if (Ex>0){break;}
lcd.setCursor(0,1);
lcd.print("Ex=");
lcd.print(Ex);
//Ex=Ex;
}
}
///////// ******* ///////////// ******** //////////
int SetHOn (int i,int e)
{
int Ex=0;
boolean Display = true; // ให้หน้าจอเริ่มทำงาน
boolean Exit = false;
// boolean ButtonSet = false; /// ??? ฟัง เวลา 25.20
//boolean ButtonUp = false;
//boolean ButtonDw = false;
//boolean ButtonCancel = false;
/////////////////////////////////////////////////////////////
boolean FlagUp = false;
boolean FlagDw = false;
boolean FlagSt = false;
boolean FlagCn = false;
unsigned long TimeSwUp = millis(); //ตั้งค่านับเวลาให้ button Up
unsigned long TimeSwDw = millis(); //ตั้งค่านับเวลาให้ button Dw
unsigned long TimeSwSt = millis(); //ตั้งค่านับเวลาให้ button St
unsigned long TimeSwCn = millis();
//boolean Display = true; // ให้หน้าจอเริ่มทำงาน
T=EEPROM.read(e);
if(T>23)
{T=0;}
while(Exit == false)
{
//if(Display == true){
//Display = false;
////////////////////////////////////////// Debounce by millis
if(digitalRead(BUTTON_UP)==0)
{
if((millis()-TimeSwUp)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_UP)==0){ // เช็คอีกรอบว่า = 0
if(FlagUp == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagUp = true;
Display = true; // Reflash lcd
if (T== 23)
{
T = 0;
}
else{T = T+ 1;}
}
}
}
} else{
TimeSwUp=millis(); //ให้เริ่มนับตาม millis
FlagUp = false; // รีเซทค่า FlagDw
}
//////////////////////////////////////////
if(digitalRead(BUTTON_DW)==0)
{
if((millis()-TimeSwDw)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_DW)==0){ // เช็คอีกรอบว่า = 0
if(FlagDw == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagDw = true;
Display = true; // Reflash lcd
if (T== 0)
{
T = 23;
}
else{T = T - 1;}
}
}
}
}else{
TimeSwDw=millis(); //ให้เริ่มนับตาม millis
FlagDw = false; // รีเซทค่า FlagDw
}
//////////////////////// END //////////////// Debounce by millis
if (Display ==true){
Display =false;
lcd.blink();
lcd.setCursor(6,i); // Show key set
if (T<=9){lcd.print(0);}
lcd.print(T);
lcd.setCursor(7,i);
}
if(digitalRead(BUTTON_SET)==0)
{
if((millis()-TimeSwSt)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_SET)==0){ // เช็คอีกรอบว่า = 0
if(FlagSt == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagSt = true;
Display = true; // Reflash lcd
Exit = true ; ////////////////// out loop while
}
}
}
}else{
TimeSwSt=millis(); //ให้เริ่มนับตาม millis
FlagSt = false; // รีเซทค่า FlagDw
}
//////////////////////////////////////////// CANCEL
if(digitalRead(BUTTON_CANCEL)==0)
{
if((millis()-TimeSwCn)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_CANCEL)==0){ // เช็คอีกรอบว่า = 0
if(FlagCn == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagCn = true;
Display = true; // Reflash lcd
//SelectMenu () ; ///////////////// out loop while
Ex=7;
lcd.setCursor(18,3); // Show key set
lcd.print(Ex);
}
}
}
}else{
TimeSwCn=millis(); //ให้เริ่มนับตาม millis
FlagCn = false; // รีเซทค่า FlagDw
}
}
////////////////////////////////////////// out loop while
EEPROM.write(e,T); // save EEPROM
lcd.setCursor(0,3);
lcd.print("Ex="); // Show key set
lcd.print(Ex);
return (Ex);
}
///////// ******* ///////////// ******** //////////
int SetMOn (int j,int e)
{
int Ex=0;
boolean Display = true; // ให้หน้าจอเริ่มทำงาน
boolean Exit = false;
boolean ButtonSet = false; /// ??? ฟัง เวลา 25.20
boolean ButtonUp = false;
boolean ButtonDw = false;
boolean ButtonCancel = false;
/////////////////////////////////////////////////////////////
boolean FlagUp = false;
boolean FlagDw = false;
boolean FlagSt = false;
unsigned long TimeSwUp = millis(); //ตั้งค่านับเวลาให้ button Up
unsigned long TimeSwDw = millis(); //ตั้งค่านับเวลาให้ button Dw
unsigned long TimeSwSt = millis(); //ตั้งค่านับเวลาให้ button St
//boolean Display = true; // ให้หน้าจอเริ่มทำงาน
unsigned long TimeSwCn = millis();
boolean FlagCn = false;
T=EEPROM.read(e);
if(T>23)
{T=0;}
while(Exit == false)
{
//if(Display == true){
//Display = false;
////////////////////////////////////////// Debounce by millis
if(digitalRead(BUTTON_UP)==0)
{
if((millis()-TimeSwUp)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_UP)==0){ // เช็คอีกรอบว่า = 0
if(FlagUp == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagUp = true;
Display = true; // Reflash lcd
if (T== 59)
{
T = 0;
}
else{T = T+ 1;}
}
}
}
} else{
TimeSwUp=millis(); //ให้เริ่มนับตาม millis
FlagUp = false; // รีเซทค่า FlagDw
}
//////////////////////////////////////////
if(digitalRead(BUTTON_DW)==0)
{
if((millis()-TimeSwDw)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_DW)==0){ // เช็คอีกรอบว่า = 0
if(FlagDw == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagDw = true;
Display = true; // Reflash lcd
if (T== 0)
{
T = 59;
}
else{T = T - 1;}
}
}
}
}else{
TimeSwDw=millis(); //ให้เริ่มนับตาม millis
FlagDw = false; // รีเซทค่า FlagDw
}
//////////////////////// END //////////////// Debounce by millis
if (Display ==true){
Display =false;
lcd.setCursor(9,j); // Show key set
if (T<=9){lcd.print(0);}
lcd.print(T);
lcd.setCursor(10,j);
}
if(digitalRead(BUTTON_SET)==0)
{
if((millis()-TimeSwSt)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_SET)==0){ // เช็คอีกรอบว่า = 0
if(FlagSt == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagSt = true;
Display = true; // Reflash lcd
Exit = true ; ////////////////// out loop while
}
}
}
}else{
TimeSwSt=millis(); //ให้เริ่มนับตาม millis
FlagSt = false; // รีเซทค่า FlagDw
}
//////////////////////////////////////////// CANCEL
if(digitalRead(BUTTON_CANCEL)==0)
{
if((millis()-TimeSwCn)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_CANCEL)==0){ // เช็คอีกรอบว่า = 0
if(FlagCn == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagCn = true;
Display = true; // Reflash lcd
//SelectMenu () ; ///////////////// out loop while
Ex=7;
lcd.setCursor(18,3); // Show key set
lcd.print(Ex);
}
}
}
}else{
TimeSwCn=millis(); //ให้เริ่มนับตาม millis
FlagCn = false; // รีเซทค่า FlagDw
}
}
////////////////////////////////////////// out loop while
EEPROM.write(e,T); // save EEPROM
lcd.setCursor(0,3); // Show T set
lcd.print(T) ;
delay(800);
return (Ex);
}
int SetHOff (int k,int e)
{
int Ex=0;
boolean Display = true; // ให้หน้าจอเริ่มทำงาน
boolean Exit = false;
boolean ButtonSet = false; /// ??? ฟัง เวลา 25.20
boolean ButtonUp = false;
boolean ButtonDw = false;
boolean ButtonCancel = false;
/////////////////////////////////////////////////////////////
boolean FlagUp = false;
boolean FlagDw = false;
boolean FlagSt = false;
unsigned long TimeSwUp = millis(); //ตั้งค่านับเวลาให้ button Up
unsigned long TimeSwDw = millis(); //ตั้งค่านับเวลาให้ button Dw
unsigned long TimeSwSt = millis(); //ตั้งค่านับเวลาให้ button St
//boolean Display = true; // ให้หน้าจอเริ่มทำงาน
unsigned long TimeSwCn = millis();
boolean FlagCn = false;
T=EEPROM.read(e);
if(T>23)
{T=0;}
while(Exit == false)
{
//if(Display == true){
//Display = false;
////////////////////////////////////////// Debounce by millis
if(digitalRead(BUTTON_UP)==0)
{
if((millis()-TimeSwUp)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_UP)==0){ // เช็คอีกรอบว่า = 0
if(FlagUp == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagUp = true;
Display = true; // Reflash lcd
if (T== 23)
{
T = 0;
}
else{T = T+ 1;}
}
}
}
} else{
TimeSwUp=millis(); //ให้เริ่มนับตาม millis
FlagUp = false; // รีเซทค่า FlagDw
}
//////////////////////////////////////////
if(digitalRead(BUTTON_DW)==0)
{
if((millis()-TimeSwDw)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_DW)==0){ // เช็คอีกรอบว่า = 0
if(FlagDw == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagDw = true;
Display = true; // Reflash lcd
if (T== 0)
{
T = 23;
}
else{T = T - 1;}
}
}
}
}else{
TimeSwDw=millis(); //ให้เริ่มนับตาม millis
FlagDw = false; // รีเซทค่า FlagDw
}
//////////////////////// END //////////////// Debounce by millis
if (Display ==true){
Display =false;
lcd.setCursor(12,k); // Show key set
if (T<=9){lcd.print(0);}
lcd.print(T);
lcd.setCursor(13,k);
}
if(digitalRead(BUTTON_SET)==0)
{
if((millis()-TimeSwSt)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_SET)==0){ // เช็คอีกรอบว่า = 0
if(FlagSt == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagSt = true;
Display = true; // Reflash lcd
Exit = true ; ////////////////// out loop while
}
}
}
}else{
TimeSwSt=millis(); //ให้เริ่มนับตาม millis
FlagSt = false; // รีเซทค่า FlagDw
}
//////////////////////////////////////////// CANCEL
if(digitalRead(BUTTON_CANCEL)==0)
{
if((millis()-TimeSwCn)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_CANCEL)==0){ // เช็คอีกรอบว่า = 0
if(FlagCn == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagCn = true;
Display = true; // Reflash lcd
//SelectMenu () ; ///////////////// out loop while
Ex=7;
lcd.setCursor(18,3); // Show key set
lcd.print(Ex);
}
}
}
}else{
TimeSwCn=millis(); //ให้เริ่มนับตาม millis
FlagCn = false; // รีเซทค่า FlagDw
}
}
////////////////////////////////////////// out loop while
EEPROM.write(e,T); // save EEPROM
lcd.setCursor(0,3); // Show T set
lcd.print(T) ;
delay(800);
return (Ex);
}
int SetMOff (int l,int e)
{
int Ex=0;
boolean Display = true; // ให้หน้าจอเริ่มทำงาน
boolean Exit = false;
boolean ButtonSet = false; /// ??? ฟัง เวลา 25.20
boolean ButtonUp = false;
boolean ButtonDw = false;
boolean ButtonCancel = false;
/////////////////////////////////////////////////////////////
boolean FlagUp = false;
boolean FlagDw = false;
boolean FlagSt = false;
unsigned long TimeSwUp = millis(); //ตั้งค่านับเวลาให้ button Up
unsigned long TimeSwDw = millis(); //ตั้งค่านับเวลาให้ button Dw
unsigned long TimeSwSt = millis(); //ตั้งค่านับเวลาให้ button St
unsigned long TimeSwCn = millis();
boolean FlagCn = false;
//boolean Display = true; // ให้หน้าจอเริ่มทำงาน
T=EEPROM.read(e);
if(T>23)
{T=0;}
while(Exit == false)
{
//if(Display == true){
//Display = false;
////////////////////////////////////////// Debounce by millis
if(digitalRead(BUTTON_UP)==0)
{
if((millis()-TimeSwUp)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_UP)==0){ // เช็คอีกรอบว่า = 0
if(FlagUp == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagUp = true;
Display = true; // Reflash lcd
if (T== 59)
{
T = 0;
}
else{T = T+ 1;}
}
}
}
} else{
TimeSwUp=millis(); //ให้เริ่มนับตาม millis
FlagUp = false; // รีเซทค่า FlagDw
}
//////////////////////////////////////////
if(digitalRead(BUTTON_DW)==0)
{
if((millis()-TimeSwDw)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_DW)==0){ // เช็คอีกรอบว่า = 0
if(FlagDw == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagDw = true;
Display = true; // Reflash lcd
if (T== 0)
{
T = 59;
}
else{T = T - 1;}
}
}
}
}else{
TimeSwDw=millis(); //ให้เริ่มนับตาม millis
FlagDw = false; // รีเซทค่า FlagDw
}
//////////////////////// END //////////////// Debounce by millis
if (Display ==true){
Display =false;
lcd.setCursor(15,l); // Show key set
if (T<=9){lcd.print(0);}
lcd.print(T);
lcd.setCursor(16,l);
}
if(digitalRead(BUTTON_SET)==0)
{
if((millis()-TimeSwSt)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_SET)==0){ // เช็คอีกรอบว่า = 0
if(FlagSt == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagSt = true;
Display = true; // Reflash lcd
Exit = true ; ////////////////// out loop while
}
}
}
}else{
TimeSwSt=millis(); //ให้เริ่มนับตาม millis
FlagSt = false; // รีเซทค่า FlagDw
}
//////////////////////////////////////////// CANCEL
if(digitalRead(BUTTON_CANCEL)==0)
{
if((millis()-TimeSwCn)>50){ //ต้องกำหนด ตัวแปร TimeSwDW
if(digitalRead(BUTTON_CANCEL)==0){ // เช็คอีกรอบว่า = 0
if(FlagCn == false)
{ // ถ้าค่า FlagDw ยัง = f ให้กลับค่าเป็น true
FlagCn = true;
Display = true; // Reflash lcd
//SelectMenu () ; ///////////////// out loop while
Ex=7;
lcd.setCursor(18,3); // Show key set
lcd.print(Ex);
}
}
}
}else{
TimeSwCn=millis(); //ให้เริ่มนับตาม millis
FlagCn = false; // รีเซทค่า FlagDw
}
}
////////////////////////////////////////// out loop while
EEPROM.write(e,T); // save EEPROM
lcd.setCursor(0,3); // Show T set
lcd.print(T) ;
delay(800);
return (Ex);
}
void showscreen(int sp)
{
lcd.setCursor(0,0);
if(sp==0){lcd.print("[P1]");}
if(sp==1){lcd.print("[P2]");}
if(sp==2){lcd.print("[P3]");}
lcd.setCursor(4,0);
lcd.print(" : - : ");
lcd.setCursor(0,1);
lcd.print(" : - : ");
lcd.setCursor(0,2);
lcd.print(" : - : ");
lcd.setCursor(0,3);
lcd.print(" : - : ");
}
void ActZone ()
{
unsigned int h,m,q,r;
DateTime now = RTC.now();
///////////////////////// *** Zone1 *** /////////////////////
//// [P1]
if ( now.hour() == EEPROM.read(0) && now.minute() == EEPROM.read(1) )
{
digitalWrite(Zone1,HIGH);
}
if ( now.hour() == EEPROM.read(2) && now.minute() == EEPROM.read(3) )
{
digitalWrite(Zone1,LOW);
}
//// [P2]
if ( now.hour() == EEPROM.read(16) && now.minute() == EEPROM.read(17) )
{
digitalWrite(Zone1,HIGH);
}
if ( now.hour() == EEPROM.read(18) && now.minute() == EEPROM.read(19) )
{
digitalWrite(Zone1,LOW);
}
//// [P3]
if ( now.hour() == EEPROM.read(32) && now.minute() == EEPROM.read(33) )
{
digitalWrite(Zone1,HIGH);
}
if ( now.hour() == EEPROM.read(34) && now.minute() == EEPROM.read(35) )
{
digitalWrite(Zone1,LOW);
}
///////////////////////// *** Zone2 *** /////////////////////
//// [P1]
if ( now.hour() == EEPROM.read(4) && now.minute() == EEPROM.read(5) )
{
digitalWrite(Zone1,HIGH);
}
if ( now.hour() == EEPROM.read(6) && now.minute() == EEPROM.read(7) )
{
digitalWrite(Zone1,LOW);
}
//// [P2]
if ( now.hour() == EEPROM.read(20) && now.minute() == EEPROM.read(21) )
{
digitalWrite(Zone1,HIGH);
}
if ( now.hour() == EEPROM.read(22) && now.minute() == EEPROM.read(23) )
{
digitalWrite(Zone1,LOW);
}
//// [P3]
if ( now.hour() == EEPROM.read(36) && now.minute() == EEPROM.read(37) )
{
digitalWrite(Zone1,HIGH);
}
if ( now.hour() == EEPROM.read(38) && now.minute() == EEPROM.read(39) )
{
digitalWrite(Zone1,LOW);
}
///////////////////////// *** Zone3 *** /////////////////////
//// [P1]
if ( now.hour() == EEPROM.read(8) && now.minute() == EEPROM.read(9) )
{
digitalWrite(Zone1,HIGH);
}
if ( now.hour() == EEPROM.read(10) && now.minute() == EEPROM.read(11) )
{
digitalWrite(Zone1,LOW);
}
//// [P2]
if ( now.hour() == EEPROM.read(24) && now.minute() == EEPROM.read(25) )
{
digitalWrite(Zone1,HIGH);
}
if ( now.hour() == EEPROM.read(26) && now.minute() == EEPROM.read(27) )
{
digitalWrite(Zone1,LOW);
}
//// [P3]
if ( now.hour() == EEPROM.read(40) && now.minute() == EEPROM.read(41) )
{
digitalWrite(Zone1,HIGH);
}
if ( now.hour() == EEPROM.read(42) && now.minute() == EEPROM.read(43) )
{
digitalWrite(Zone1,LOW);
}
///////////////////////// *** Zone4 *** /////////////////////
//// [P1]
if ( now.hour() == EEPROM.read(12) && now.minute() == EEPROM.read(13) )
{
digitalWrite(Zone1,HIGH);
}
if ( now.hour() == EEPROM.read(14) && now.minute() == EEPROM.read(15) )
{
digitalWrite(Zone1,LOW);
}
//// [P2]
if ( now.hour() == EEPROM.read(28) && now.minute() == EEPROM.read(29) )
{
digitalWrite(Zone1,HIGH);
}
if ( now.hour() == EEPROM.read(30) && now.minute() == EEPROM.read(31) )
{
digitalWrite(Zone1,LOW);
}
//// [P3]
if ( now.hour() == EEPROM.read(44) && now.minute() == EEPROM.read(45) )
{
digitalWrite(Zone1,HIGH);
}
if ( now.hour() == EEPROM.read(46) && now.minute() == EEPROM.read(47) )
{
digitalWrite(Zone1,LOW);
}
}