ข้ามไปที่เนื้อหาหลัก

Arduino Project 4CH Relay Timer #06

Arduino Project 4CH Relay Timer #06

มาถึงส่วนสุดท้ายของโปรเจคนี้กันแล้ว นั่นคือส่วนของการตรวจสอบเวลาและสั่งให้ Relay on หรือ off ตามเวลาที่เราได้ตั้งค่าไว้ โดยจะแยกการทำงานเป็นสองส่วน ส่วนแรกจะทำการตรวจสอบเมื่อเปิดเครื่องครั้งแรก และมีการเปลี่ยนแปลงการตั้งค่า และอีกส่วนจะทำงานตาม Loop การทำงานของเครื่องไปเรื่อย ๆ



ก่อนอื่นมาประกาศตัวแปรเพิ่ม และเพิ่มเติม การกำหนดขา Output ดังนี้
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);
    }
  }
}

อีกส่วนที่จะทำงานตามรอบไปเรื่อย ๆ จะมีการทำงานดังนี้
(Flow 2)


Code
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 นะครับ
เท่านี้ก็เป็นอันเสร็จสิ้นขั้นตอนการตรวจสอบเวลาแล้ว

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

เทคนิคการสร้าง Folder ลับ (การซ่อน Folder) 2

เทคนิคการสร้าง Folder ลับ (การซ่อน Folder) 2 วันนี้ก็จะเอาเทคนิคการซ่อน Folder มาฝากกันเพิ่มเติมนะครับ จะต่างจากในบทความแรก https://lazedev.blogspot.com/2016/03/folder-folder.html ซึ่งเป็นการเก็บแบบ System file ธรรมดา โดยคราวนี้จะเพิ่มความสามารถให้ Folder ที่เราซ่อนไว้ให้เข้ายากขึ้นไปอีกนิด (ซ่อนได้เนียนขึ้น) นะครับ มาดูขั้นตอนกันเลย

Make BIG checkbox in Excel

ทำ Checkbox ขนาดใหญ่ใน Excel ในบางครั้งเมื่อเราต้องการทำฟอร์มเอกสารให้คนอื่นกรอก ก็มักจะมีตัว Checkbox เพื่อให้คลิ๊กเลือกในรายการที่เรากำหนดไว้ โดยจะเพิ่มจากตัว ActiveX control ที่มีอยู่แล้วใน Excel แต่ปัญหาคือเจ้าตัว checkbox นี้มันปรับขนาดไม่ได้ พอเราปรับขนาดหน้าจอเล็กลง เจ้าตัว checkbox นี่ก็จะเล็กลงตาม ทำให้ความไฮโซของแบบฟอร์มลดลงไป

เอา Password Excel VBA ออก

พอดีว่ากำลังทำโปรเจ็คฐานข้อมูลเกี่ยวกับ Excel VBA แต่ทำ ๆ ไปดันลืม พาสเวิดที่ตัวเองใส่ไว้ซะงั้น เลยต้องลำบากลำบนไปค้นหาวิธีการเอาพาสเวิดนั้นออก ดูไปแล้วก็พอมีวิธีอยู่ ก็เลยทำเป็นบทความเก็บไว้ดีกว่า มาดูกันเลย **เป็นการเอารหัสของ VBA ใน Excel ออกนะครับ ไม่ใช่รหัสของ Excel