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

Arduino Project 4CH Relay Timer #05

Arduino Project 4CH Relay Timer #05

ส่วนของโปรแกรมย่อยต่าง ๆ ที่เหลือ
//โปรแกรมย่อย ตั้งค่าเวลาแสดงผลของไฟ LCD
void setBLTime(){
  timeRefBL = millis() + 5000;
}

//โปรแกรมย่อยเปลี่ยนสถานะของตัวเครื่อง ตามปุ่มที่กด
void transition(int xbutton)
{
  switch (state)
  {
        case MAIN_DISPLAY:
            if (xbutton==btnSELECT){state=ALARM_NO; itmMnu=1;}
            break;



        case ALARM_NO:
            if (xbutton==btnRIGHT){state=ALARM_SET_MENU;}
            break;
        case ALARM_SET_MENU:
            if (xbutton==btnRIGHT)
              {
              switch (itmMnu)
              {
                case 1:
                  state=SET_AL_STATE;
                  break;
                case 2:
                  state=SET_TIME;
                  break; 
                case 3:
                  state=SET_TIME;
                break;
              }
             }
       else if(xbutton==btnLEFT)
       {
        state=ALARM_NO;
       }
              break;
    case SET_AL_STATE:
      if ((xbutton==btnRIGHT) || (xbutton==btnLEFT)){state=ALARM_SET_MENU;lcd.noBlink();}
      break;
    case SET_TIME:
      if ((xbutton==btnRIGHT) || (xbutton==btnLEFT)){state=ALARM_SET_MENU;lcd.noBlink();}
            break;
  }
}

//โปรแกรมย่อย ตั้งค่าเวลา รวมเอาทั้งส่วนเวลาเปิด และเวลาปิดเข้าด้วยกันเลย
void setALTime()
{
boolean timeOut=false;
int valHR=0;
int valMIN=0;
int valSet=0;
int rowSet=0;
int colSet=0;
unsigned int maxVal;
boolean setHR=true;
  lcd.clear();
  lcd.setCursor(0,0);
  if(itmMnu==2){lcd.print("START time     " + String(SetRelayNumber,DEC));}
  else{lcd.print("STOP time      " + String(SetRelayNumber,DEC));}
  lcd.setCursor(0,1);

if(itmMnu==2){
valHR=OAlarmHH[SetRelayNumber-1];
valMIN=OAlarmMM[SetRelayNumber-1];
}else{
valHR=FAlarmHH[SetRelayNumber-1];
valMIN=FAlarmMM[SetRelayNumber-1];
}
  lcd.print("HR:00  MIN:00   ");
  lcd.setCursor(3,1);
  lcd.print((valHR < 10 ? "0" : "") + String(valHR));
  lcd.setCursor(11,1);
  lcd.print((valMIN < 10 ? "0" : "") + String(valMIN));
  lcd.blink(); 
 timeRef = millis();
 
  LoopChk:
  if(setHR==true)
  {
  maxVal=23;
  colSet=3;
  rowSet=1;
  valSet=valHR;
  }
  else
  {
  maxVal=59;
  colSet=11;
  rowSet=1;
  valSet=valMIN;
  }
 
  while ( (unsigned long)(millis() - timeRef) < 10000 )
 {
  lcd.setCursor(colSet,rowSet);
  button = read_LCD_buttons();
  waitButtonRelease();
  if (button == btnUP )
  {
  valSet < maxVal ? valSet++ : valSet=maxVal ;
  timeRef = millis();
  }
  else if(button==btnDOWN)
  {
  valSet > 0 ? valSet-- : valSet ;
  timeRef = millis();
  }
  else if(button == btnRIGHT)
  {
    if(setHR){valHR=valSet; setHR=false; timeRef = millis(); goto LoopChk;}
    else
    {
      valMIN=valSet;
      saveTime(valHR,valMIN);
      saveEEPROM(itmMnu);
      showSave();
      timeOut=true;
      break;
    }
  }
  else if(button==btnSELECT)
  {
  break;
  }
  else if(button==btnLEFT)
  {
    if(setHR)
    {
      timeOut=true;
      break;
    }
    else
    {
      valMIN=valSet;setHR=true; timeRef = millis(); goto LoopChk;
    }
  }
  lcd.print((valSet < 10 ? "0" : "") + String(valSet));
  delay(150);
 }

 if (timeOut)transition(button);
 else state = MAIN_DISPLAY;

}

//โปรแกรมย่อยในการบันทึกค่าลงในตัวแปรเวลาที่เราได้สร้างเป็นแบบ Array ไว้
void saveTime(int vHR, int vMIN)
{
switch (itmMnu)
{
case 2:
  OAlarmHH[SetRelayNumber-1]=vHR; 
  OAlarmMM[SetRelayNumber-1]=vMIN;
  break;
case 3:
  FAlarmHH[SetRelayNumber-1]=vHR;
  FAlarmMM[SetRelayNumber-1]=vMIN;
  break;
}
}

//โปรแกรมย่อย ตั้งค่าสถานะของ รีเลย์แต่ละตัว ว่าจะเปิดใช้งานหรือไม่
void setALstate()
{
  boolean timeOut = false;
  boolean selState;
  selState = AlarmSt[SetRelayNumber-1];
  timeRef = millis();
 
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Set AL state    ");

  lcd.setCursor(0,1);
  if(selState){lcd.print("ON");}
  else{lcd.print("OFF");}
 
 while ( (unsigned long)(millis() - timeRef) < 10000 )
 {
  lcd.setCursor(0,1);
  button = read_LCD_buttons();
  waitButtonRelease();
  if ((button == btnUP) || (button==btnDOWN))
  {
    if(selState){selState=false;lcd.print("OFF");}
    else{selState=true;lcd.print("ON ");}
    timeRef = millis();
  }
  else if(button == btnRIGHT)
  {
  AlarmSt[SetRelayNumber-1]=selState;
  saveEEPROM(itmMnu);
  showSave();
  timeOut=true;
  break;
  }
  else if(button==btnSELECT)
  {
  break; 
  }
  else if(button==btnLEFT)
  {
  timeOut=true;
  break; 
  }
  delay(150);
 }

 if (timeOut)transition(button);
 else state = MAIN_DISPLAY;
 
}

//โปรแกรมย่อย แสดงข้อความว่า บันทึกข้อมูลแล้ว
void showSave()
{
lcd.setCursor(0,0);
lcd.print("     -DATA-     ");
lcd.setCursor(0,1);
lcd.print("     -SAVE-     ");
delay(1000);
}

//โปรแกรมย่อย หน้าเมนูแรก เป็นการเลือกว่าจะตั้งค่าให้กับ Relay ตัวใหน
void showAlarmNo()
{
  boolean timeOut = false;
  timeRef = millis();
 
  SetRelayNumber = 1;
 
  lcd.setCursor(0,0);
  lcd.print("select output   ");
  lcd.setCursor(0,1);
  lcd.print("no:             ");

  lcd.setCursor(3,1);

 while ( (unsigned long)(millis() - timeRef) < 10000 )
 {
  int xbutton = read_LCD_buttons();
  waitButtonRelease();
  lcd.setCursor(3,1);
  if (xbutton == btnUP)
  {
  SetRelayNumber < 4 ? SetRelayNumber++ : SetRelayNumber ;
  timeRef = millis();
  }
  else if(xbutton == btnDOWN)
  {
  SetRelayNumber > 1 ? SetRelayNumber-- : SetRelayNumber ;
  timeRef = millis();
  }
  else if(xbutton == btnRIGHT)
  {
  timeOut=true;
  break;
  }
  else if((xbutton==btnSELECT) || (xbutton == btnLEFT))
  {
  break; 
  }
  lcd.print(SetRelayNumber);
  delay(150);
 }

 if (timeOut)transition(btnRIGHT);
 else state = MAIN_DISPLAY;
 
}


//โปรแกรมย่อย แสดงเมนู ให้เลือกตั้งค่า (1 ตั้งค่า Relay 2 เวลาเปิด 3 เวลาปิด)
void showAlarmSet()
{
  boolean timeOut = false;
  timeRef = millis();

  itmMnu = 1;
 
  lcd.setCursor(0,0);
  lcd.print("alarm set menu " + String(SetRelayNumber));
  lcd.setCursor(0,1);
  lcd.print("1state          ");

 
 while ( (unsigned long)(millis() - timeRef) < 10000 )
 {
  lcd.setCursor(0,1);
  button = read_LCD_buttons();
  waitButtonRelease();
  if (button == btnUP)
  {
  itmMnu < 3 ? itmMnu++ : itmMnu ;
  timeRef = millis();
  }
  else if(button == btnDOWN)
  {
  itmMnu > 1 ? itmMnu-- : itmMnu ;
  timeRef = millis();
  }
  else if(button == btnRIGHT)
  {
  timeOut=true;
  break;
  }
  else if(button==btnLEFT)
  {
   timeOut=true;
  break;  
    }
  else if(button==btnSELECT)
  {
  break; 
  }
  switch (itmMnu)
  {
  case 1:
    lcd.print("1State          ");
    break;
  case 2:
    lcd.print("2Start time     ");
    break;
  case 3:
    lcd.print("3Stop time      ");
    break;
  }
  delay(150);
 }

 if (timeOut)transition(button);
 else state = MAIN_DISPLAY;
 
}

//โปรแกรมย่อย แสดงเวลาที่หน้าจอหลัก
void showTime()
{
 
    now = RTC.now();
    lcd.setCursor(0,0);
    lcd.print((now.hour() < 10 ? "0" : "") + String(now.hour()) + ":" +
              (now.minute() < 10 ? "0" : "") + now.minute() );
}

void showRelayState()
{
lcd.setCursor(5,0);
lcd.print(" 1:   2:   ");
lcd.setCursor(0,1);
lcd.print("      3:   4:   ");

//ดึงค่าSetting on/off relay มาแสดง
int j = 0; //เก็บตำแหน่ง คอลัมน์
int k = 0; //เก็บตำแหน่ง  แถว
for (int i = 0; i <= 3;i++)
{
  switch (i)
  {
  case 0:
    j = 8;
    k = 0;
    break;
  case 1:
    j = 13;
    k = 0;
    break;
  case 2:
    j = 8;
    k = 1;
    break;
  case 3:
    j = 13;
    k = 1;
    break;
  }
  lcd.setCursor(j,k);
  if(AlarmSt[i]==true){
  lcd.print("ON ");
  }else{
  lcd.print("OFF");
  }

}

}

//โปรแกรมย่อย บันทึกข้อมูลลงไปใน Rom
void saveEEPROM(int sType)
{
int addr;
switch (sType)
{
case 1:   //บันทึกสถานะ
  addr=0;
  for (int i=0;i<=3;i++)
    {
    EEPROM.write(addr, AlarmSt[i]);
    addr++;
    }
  break;
case 2:   //บันทึกเวลาเปิด
 
    addr=4;
  for (int i=0;i<=3;i++)
    {
    EEPROM.write(addr, OAlarmHH[i]);
    EEPROM.write(addr+4, OAlarmMM[i]);
    addr++;
    }
  break;
case 3:   //บันทึกเวลาปิด
    addr=12;
  for (int i=0;i<=3;i++)
    {
    EEPROM.write(addr, FAlarmHH[i]);
    EEPROM.write(addr+4, FAlarmMM[i]);
    addr++;
    }
  break;
}
}

//โปรแกรมย่อยโหลดข้อมูลมาจาก ROM
void loadEEPROM(int sType)
{
int addr;
switch (sType)
{
case 1:   //โหลดสถานะของ Relay
  addr=0;
  for (int i=0;i<=3;i++)
    {
    AlarmSt[i]= EEPROM.read(addr);
    addr++;
    }
  break;
case 2:   //โหลดเวลาเปิด
 
    addr=4;
  for (int i=0;i<=3;i++)
    {
    OAlarmHH[i]=EEPROM.read(addr);
    OAlarmMM[i]=EEPROM.read(addr+4);
    addr++;
    }
  break;
case 3:   //โหลดเวลาปิด
    addr=12;
  for (int i=0;i<=3;i++)
    {
    FAlarmHH[i]=EEPROM.read(addr);
    FAlarmMM[i]=EEPROM.read(addr+4);
    addr++;
    }
  break;
}
}






Code ที่แสดงนี้เป็นส่วนการแสดงผลเมนูทั้งหมด จะเห็นได้ว่าในแต่ละโปรแกรมย่อย จะมีส่วนตอบสนองต่อการกดปุ่มอยู่ด้วย ซึ่งจากการทดสอบดูแล้วทำงานถูกต้องตามที่ต้องการแล้วดังคลิปด้านล่าง





ในส่วนต่อไปก็จะทำการเพิ่ม Relay shield และโปรแกรมย่อยในการตรวจสอบเวลาเปิดปิด Relay กันดูครับ

ดูต่อ Arduino Project 4CH Relay Timer #06

ความคิดเห็น

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

เทคนิคการสร้าง 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