Arduino Project 4CH Relay Timer #06
มาถึงส่วนสุดท้ายของโปรเจคนี้กันแล้ว นั่นคือส่วนของการตรวจสอบเวลาและสั่งให้ Relay on หรือ off ตามเวลาที่เราได้ตั้งค่าไว้ โดยจะแยกการทำงานเป็นสองส่วน ส่วนแรกจะทำการตรวจสอบเมื่อเปิดเครื่องครั้งแรก และมีการเปลี่ยนแปลงการตั้งค่า และอีกส่วนจะทำงานตาม Loop การทำงานของเครื่องไปเรื่อย ๆ
ก่อนอื่นมาประกาศตัวแปรเพิ่ม และเพิ่มเติม การกำหนดขา Output ดังนี้
Code
Code
int RelayPin[4] ={2,3,11,12}; //กำหนดขา Output ที่ต่อกับ Relay shield
boolean firstTime;
void setup()
{
//ตั้งค่า pin relay
for(int j=0;j<=3;j++){
pinMode(RelayPin[j], OUTPUT);
}
firstTime=true;
}
Void loop()
{
case MAIN_DISPLAY:
showTime();
if(refreshState==true){showRelayState();refreshState=false;}
//เพิ่มสองบรรทัดด้านล่างนี้
ในส่วนของ case MAIN_DISPLAY:
if(firstTime==true){checkTime();
firstTime=false; }
MinuteCheckTime();
break;
}
|
มาดูกันที่การทำงานส่วนแรก คือเมื่อเปิดเครื่องครั้งแรก และมีการเปลี่ยนการตั้งค่าตัวเครื่อง เมื่อเครื่องเปิดขึ้นมาครั้งแรกต้องทำการตรวจสอบว่าสถานะ ณ เวลาที่เปิดเครื่องขึ้นมานั้น Relay แต่ละตัวอยู่ในสถานะ On หรือ Off
อ้างอิงจากการตั้งค่าของ Relay แต่ละตัวจะมี ได้ 2 กรณี นั่นคือ
1. เวลาเปิด (Start) น้อยกว่าเวลาปิด (Stop) และ
2. เวลาเปิด (Start) มากกกว่าเวลาปิด(Stop)
มาดูกันที่กรณีแรก เวลาเปิด น้อยกว่าเวลาปิด Output ของ Relay สามารถเป็นไปได้ดังนี้
ผมจะทำเงื่อนไขตรวจสอบกรณีที่ Output เป็น ON ตามไฮไลท์สีเหลืองไว้
อีกกรณีคือ เวลาเปิด มากกว่า เวลาปิด Output ของ Relay สามารถเป็นไปได้ดังนี้
จะทำเงื่อนไขตรวจสอบในกรณีที่ Output เป็น OFF ตามไฮไลท์สีเหลืองไว้
จากเงื่อนไขข้างต้น ทำเป็น Flow การตรวจสอบได้ดังนี้
Code
void checkTime()
{
int nowH;
int nowM;
now = RTC.now();
nowH=now.hour(); //ดึงค่า ชั่วโมง ณ ปัจจุบัน
nowM=now.minute(); //ดึงค่า นาที ณ ปัจจุบัน
int chkType; //ตรวจสอบว่าตั้งเวลาไว้แบบใหน
int chk1; //ตัวแปรไว้เก็บค่า Now - START
int chk2; //ตัวแปรไว้เก็บค่า STOP - Now
for (int i = 1 ; i <=4 ;
i++)
{
if(AlarmSt[i-1]==true) //ถ้าสนานะของ Relay เปิดทำงานอยู่
{
chkType=compareTime(FAlarmHH[i-1],FAlarmMM[i-1],OAlarmHH[i-1],OAlarmMM[i-1]);
chk1=compareTime(nowH,nowM,OAlarmHH[i-1],OAlarmMM[i-1]);
chk2=compareTime(FAlarmHH[i-1],FAlarmMM[i-1],nowH,nowM);
if(chkType>0) //กรณีตั้งเวลาปิดมากกว่าเวลาเปิด
{
if(((chk1
> 0) && (chk2 > 0)) || (chk1 == 0))
{
// ตั้งค่าเป็น LOW จะเป็นการ On relay
digitalWrite(RelayPin[i-1],LOW);
}
else
{
digitalWrite(RelayPin[i-1],HIGH);
}
}
else
if ( chkType<0 ) //กรณีตั้งเวลาเปิดมากกว่าเวลาปิด
{
if(((chk1
< 0) && (chk2 < 0)) || (chk2 == 0))
{
digitalWrite(RelayPin[i-1],HIGH);
}
else
{
digitalWrite(RelayPin[i-1],LOW);
}
}
else
{
//กรณีตั้งเวลาเปิดและเวลาปิดไว้เท่ากัน
digitalWrite(RelayPin[i-1],HIGH);
}
}
Else //ถ้าสนานะของ Relay ปิดทำงานอยู่
{
digitalWrite(RelayPin[i-1],HIGH);
}
}
}
|
void MinuteCheckTime()
{
int nowH;
int nowM;
now = RTC.now();
nowH=now.hour();
nowM=now.minute();
for (int i = 1 ; i <=4 ;
i++)
{
if(AlarmSt[i-1]==true) //ถ้าสนานะของ Relay เปิดทำงานอยู่
{
if((OAlarmHH[i-1]==nowH)
&& (OAlarmMM[i-1]==nowM)) //กรณีเวลาเปิดตรงกับเวลาปัจจุบัน
{digitalWrite(RelayPin[i-1],LOW);}
else if
((FAlarmHH[i-1]==nowH) && (FAlarmMM[i-1]==nowM)) //กรณีเวลาปิดตรงกับเวลาปัจจุบัน
{digitalWrite(RelayPin[i-1],HIGH);}
}
else if(AlarmSt[i-1]==false) //ถ้าสนานะของ Relay ปิดทำงานอยู่
{
digitalWrite(RelayPin[i-1],HIGH);
}
}
}
|
และ Function ในการตรวจสอบค่าความต่างของเวลาครับ
Code
int compareTime(int H1, int M1, int H2, int M2)
{
int retVal;
//เปลี่ยนค่ามาเป็นหน่วยนาที
int Val1=(H1 * 60) + M1;
int Val2=(H2 * 60) + M2;
//เอามาลบกัน
retVal = Val1 - Val2;
//ส่งค่ากลับ
return retVal;
}
|
ในส่วนของ Relay shield นั่น การสั่งให้ Relay ทำงาน
ต้องกำหนด Pin นั่นเป็น LOW นะครับ
เท่านี้ก็เป็นอันเสร็จสิ้นขั้นตอนการตรวจสอบเวลาแล้ว
เท่านี้ก็เป็นอันเสร็จสิ้นขั้นตอนการตรวจสอบเวลาแล้ว
ความคิดเห็น
แสดงความคิดเห็น