#include <Arduino.h>
#include <SoftwareSerial.h>
#include "Timer.h"
#include <LiquidCrystal.h>
Timer t;
const int buttonPin = 32;     // the number of the pushbutton pin
const int motorPin =  13;      
const int FeedTime =  10;      
const int WatSent  =  30;
const int LigPin   =  34;
const byte Set = 22,  Next= 24, up = 26, down = 28;
//      LCD 接腳:  rs, enable, d4, d5, d6, d7 
//      對應到 Arduino 接腳:  12,   11  ,  5,  4,  3,  2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// variables will change:
byte buttonState,Seting,Nexting,uping,downing = 0;// variable for reading the pushbutton status
int outreg=0;
int day,hour,minu,sec=0;//conter
int menuChg,SetMode,SetMenuSW=0;//Lcd menu
int Norlin2_hour,Norlin2_minu,Norlin2_sec=0;//LCD Normal line2 desplay
byte Lcd_lin2_En=1;
byte lcd_blink_en=0;
int Fed_en,Wat_en,Lig_en=0; //Output EN
int FeedSpace=8,FedSpinTime=15,WatLigON_Max=500;//Output
int WatLigOF_Max=550,WatLigON_Min=0,WatLigOF_Min=250,LigSpace=4,LigSpinTime=4;
int WatlinNow,WatING=0; //Water
int WatTimer,WatTime_day,WatTime_hour,WatTime_minu,WatTime_sec;
int WatLsTime_day,WatLsTime_hour;
int FeedTimer,SpiningTimer,FedRecipro;//Feed
int LigTimer,LigRecipro=3600,LigSpiningTimer; //Light

void setup() {
  // initialize the LED pin as an output:
  pinMode(motorPin, OUTPUT);      
  pinMode(FeedTime, OUTPUT);      
  pinMode(WatSent, OUTPUT);     
  pinMode(LigPin, OUTPUT);      
  pinMode(buttonPin, INPUT);   
  pinMode(Set, INPUT);
  pinMode(Next, INPUT);  
  pinMode(up, INPUT);
  pinMode(down, INPUT);
  // 設定 LCD 的行列數目 (2 x 16)
  lcd.begin(16, 2);
  t.every(2000, LCD_lin2); //call LCD function
  t.every(1000, Conter_main);
  t.every(1000, WaterSensor);
  t.every(1000, Water_main);
  t.every(1000, Feed_main);
  t.every(1000, Light);
  t.every(100, LCD_main); //call LCD function
  t.every(100, Debounce_main); //call LCD function
  Serial.begin(9600); //串列埠功能使用初始化
}

void loop(){
  t.update();
}
void Project_main() {
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {     
    digitalWrite(motorPin,1); 
    digitalWrite(FeedTime,1); 
  } 
  else {
    analogWrite(FeedTime,map(hour, 0, 7, 0, 255));
    digitalWrite(motorPin,0); 
    Conter_main(); //call Conter function
  }
}
void LCD_main() {
  // 將游標設到 column 0, line 0
  lcd.setCursor(0, 0); 
  switch(Seting) {
  case 0:
    lcd.noBlink();
    Lcd_lin2_En=1;
    LCD_Hompage();
    break;
  case 255:
    Lcd_lin2_En=0;
    Setting();
    LCD_Setpage();
    break;
  }
  if (Lcd_lin2_En==1){
    // 將游標設到 column 0, line 1
    lcd.setCursor(0, 1); 
    lcd.print("                ");
    lcd.setCursor(0, 1); 
    switch(menuChg) {
    case 0:
      NorFed_Disp();
      break;
    case 1:
      NorWat_Disp();
      break;
    case 2:
      NorLig_Disp();
      break;
    case 3:
      NorWatLin_Disp();
      break;
    }
    if (menuChg<=2){
      switch(menuChg) {
      case 0://Feed
        Norlin2_hour=FedRecipro/60 /60;
        Norlin2_minu=FedRecipro/60 %60;
        Norlin2_sec =FedRecipro %60 %60;
        break;
      case 1://Water
        Norlin2_hour=0;
        Norlin2_minu=WatLsTime_day;
        Norlin2_sec=WatLsTime_hour;
        break;
      case 2://Lig
        Norlin2_hour=LigRecipro/60 /60;
        Norlin2_minu=LigRecipro/60 %60;
        Norlin2_sec=LigRecipro %60 %60;
        break;
      }
      lcd.setCursor(7, 1);
      lcd.print("_");
      lcd.print(Norlin2_hour);
      lcd.setCursor(10, 1);
      lcd.print(":");
      lcd.print(Norlin2_minu);
      lcd.setCursor(13, 1);
      lcd.print(":");
      lcd.print(Norlin2_sec);
    }
    else{
      lcd.print(WatlinNow);
    }
  }
}
void LCD_Hompage() {
  lcd.print("Day:");
  lcd.print(day);
  lcd.setCursor(7, 0);
  lcd.print("_");
  lcd.print(hour);
  lcd.setCursor(10, 0);
  lcd.print(":");
  lcd.print(minu);
  lcd.setCursor(13, 0);
  lcd.print(":");
  lcd.print(sec);
}
void  Setting(){ //reflash time = 100ms
  if (Nexting==1){
    lcd.clear();
    if (SetMode==7){
      SetMode=0;
    }
    else{
      SetMode=SetMode+1;
    }
    Serial.println(SetMode);
  }
  SetMenuSW=SetMode/2;
  switch(SetMode){
  case 0: //hour
    if (FeedSpace>=9 && (uping==1) || (FeedSpace<=0)&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        FeedSpace=FeedSpace+1;
      }
      else if (downing==1){
        FeedSpace=FeedSpace-1;
      }
    }
    break;
  case 1://sec 
    if (FedSpinTime>=59 && (uping==1)|| FedSpinTime<=0&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        FedSpinTime=FedSpinTime+1;
      }
      else if (downing==1){
        FedSpinTime=FedSpinTime-1;
      }
    }
    break;
  case 2://
    if (WatLigON_Max>=999 && (uping==1) || WatLigON_Max<=WatLigON_Min+10&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        WatLigON_Max=WatLigON_Max+10;
      }
      else if (downing==1){
        WatLigON_Max=WatLigON_Max-10;
      }
    }
    break;
  case 3:
    if (WatLigOF_Max>=999 && (uping==1) || WatLigOF_Max<=WatLigOF_Min+10&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        WatLigOF_Max=WatLigOF_Max+10;
      }
      else if (downing==1){
        WatLigOF_Max=WatLigOF_Max-10;
      }
    }
    break;
  case 4:
    if (WatLigON_Min>=WatLigON_Max-10 && (uping==1) || WatLigON_Min<=0&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        WatLigON_Min=WatLigON_Min+10;
      }
      else if (downing==1){
        WatLigON_Min=WatLigON_Min-10;
      }
    }
    break;
  case 5:
    if (WatLigOF_Min>=WatLigOF_Max-10 && (uping==1) || WatLigOF_Min<=0&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        WatLigOF_Min=WatLigOF_Min+10;
      }
      else if (downing==1){
        WatLigOF_Min=WatLigOF_Min-10;
      }
    }
    break;
  case 6://hour
    if (LigSpace>=23 && (uping==1) || LigSpace<=0&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        LigSpace=LigSpace+1;
      }
      else if (downing==1){
        LigSpace=LigSpace-1;
      }
    }
    break;
  case 7://hour
    if (LigSpinTime>=23 && (uping==1) || LigSpinTime<=0&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        LigSpinTime=LigSpinTime+1;
      }
      else if (downing==1){
        LigSpinTime=LigSpinTime-1;
      }
    }
    break;
  } 
}
void LCD_Setpage() { 
  switch(SetMenuSW){
  case 0 :
    SetFed_Disp();
    break;
  case 1:
    SetWat_Disp();
    break;
  case 2:
    SetWat2_Disp();
    break;
  case 3:
    SetLig_Disp();
    break;
  }
  lcd_blink_en=lcd_blink_en+1; //游標閃爍智能
  if (lcd_blink_en%2==0){
    switch(SetMode){
    case 0:
      lcd.setCursor(10, 0);
      break;
    case 1:
      lcd.setCursor(10, 1);
      break;
    case 2:
      lcd.setCursor(13, 0);
      break;
    case 4:
      lcd.setCursor(13, 0);
      break;
    case 3:
      lcd.setCursor(13, 1);
      break;
    case 5:
      lcd.setCursor(13, 1);
      break;
    case 6:
      lcd.setCursor(9, 0);
      break;
    case 7:
      lcd.setCursor(9, 1);
      break;
    }  
    lcd.blink();
  }
  else{
    lcd.noBlink();
  }
}
void SetFed_Disp(){
  lcd.print("FeedSpace:");
  lcd.print(FeedSpace);
  lcd.setCursor(12, 0);
  lcd.print("Hour");
  lcd.setCursor(0, 1);
  lcd.print("SpinTime :");
  lcd.print(FedSpinTime);
  lcd.setCursor(13, 1);
  lcd.print("Sec");
}
void SetWat_Disp(){
  lcd.print("WatLigON_Max:");
  lcd.print(WatLigON_Max);
  lcd.setCursor(0, 1);
  lcd.print("WatLigOF_Max");
  lcd.setCursor(12, 1);
  lcd.print(":");
  lcd.print(WatLigOF_Max);
}
void SetWat2_Disp(){
  lcd.print("WatLigON_Min:");
  lcd.print(WatLigON_Min);
  lcd.setCursor(0, 1);
  lcd.print("WatLigOF_Min");
  lcd.setCursor(12, 1);
  lcd.print(":");
  lcd.print(WatLigOF_Min);
}
void SetLig_Disp(){
  lcd.print("LigSpace:");
  lcd.print(LigSpace);
  lcd.setCursor(12, 0);
  lcd.print("Hour");
  lcd.setCursor(0, 1);
  lcd.print("SpinTime:");
  lcd.print(LigSpinTime);
  lcd.setCursor(12, 1);
  lcd.print("Hour");
}
void LCD_lin2() {
  if (menuChg==3){
    menuChg=0;
  }
  else{
    menuChg=menuChg+1;
  }//Change page
}
void NorFed_Disp(){
  lcd.print("Fed:");
  if (Fed_en==1){
    lcd.print(" ON");
  }
  else{
    lcd.print("OFF");
  }
}
void NorWat_Disp(){
  lcd.print("Wat:");
  if (Wat_en==1){
    lcd.print(" ON");
  }
  else{
    lcd.print("OFF");
  }
  lcd.setCursor(9, 1);
}
void NorLig_Disp(){
  lcd.print("Lig:");
  if (Lig_en==1){
    lcd.print(" ON");
  }
  else{
    lcd.print("OFF");
  }
  lcd.setCursor(9, 1);
}
void NorWatLin_Disp(){
  lcd.print("WatLin:");
}
void Conter_main() {
  // counter:
  if (sec==59) {
    lcd.clear();
    sec=0;
    if (minu==59){
      minu=0;
      if(hour==23){
        hour=0;
        day=day+1;/*
           
         delay (15000);
         sec=15;*/
      }
      else{
        hour=hour+1;
      }
    }
    else{
      minu=minu+1;
    }
  }
  else{
    sec=sec+1;
  }
}
void Debounce_main() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  if (digitalRead(Set)==1) {
    Seting= ~Seting;
    lcd.clear();
  }
  if (digitalRead(up)||digitalRead(down) ==1) {
    lcd.clear();
  }
  Nexting= digitalRead(Next);
  uping= digitalRead(up);
  downing= digitalRead(down);
}
void WaterSensor(){
  WatlinNow=analogRead(0); 
}
      /*   Output Enable    */
void Water_main(){
  if (Lig_en==0){//WatLigOFF
    if (WatlinNow<=WatLigOF_Min){
      Wat_en=1;
    }
    if (WatlinNow>=WatLigOF_Max){
      Wat_en=0;
    }
    if (Wat_en==1){//Sent Water
      digitalWrite(WatSent,1); 
    }
    else{
      digitalWrite(WatSent,0);
    }
  } 
  else{//WatLigON
    if (WatlinNow<=WatLigON_Min){
      Wat_en=1;
    }
    if (WatlinNow>=WatLigON_Max){
      Wat_en=0;
    }
    if (Wat_en==1){//Sent Water
      digitalWrite(WatSent,1); 
    }
    else{
      digitalWrite(WatSent,0);
    }
  } 
  if (Wat_en==1){
    WatLsTime_day=WatTime_day;
    WatLsTime_hour=WatTime_hour;
    WatTime_day=0;
    WatTime_hour=0;
    WatTime_minu=0;
    WatTime_sec=0;
  }
  else{
   // int WatTimer,WatLsTime,WatTime_hour,WatTime_minu,WatTime_sec;
    if (WatTime_sec==59) {
    WatTime_sec=0;
    if (minu==59){
      WatTime_minu=0;
      if(WatTime_hour==23){
        WatTime_hour=0;
        WatTime_day=WatTime_day+1;
      }
      else{
        WatTime_hour=WatTime_hour+1;
      }
    }
    else{
      WatTime_minu=WatTime_minu+1;
    }
  }
  else{
    WatTime_sec=WatTime_sec+1;
  }
  }
}
int test_fed;
void  Feed_main(){
  if (buttonState==1){
    digitalWrite(motorPin,1); //Feeding
  }
  else{
    if (test_fed==1){
      test_fed=0;
      // 設定 LCD 的行列數目 (2 x 16)
      lcd.begin(16, 2);
    }
    FeedTimer=FeedTimer+1;
    FedRecipro=FeedSpace*60*60-FeedTimer;
    if(FeedTimer>=FeedSpace*60*60){
      Fed_en=1;
      FeedTimer=0;
    }
    if(Fed_en==1){
      if (SpiningTimer>=FedSpinTime){
         SpiningTimer=0;
         Fed_en=0;
      }
      else{
        digitalWrite(motorPin,1); //Feeding
        SpiningTimer=SpiningTimer+1;
        test_fed=1;
      }    
    }
    else{digitalWrite(motorPin,0);}//Stop Feed
  }
}
void Light(){
  LigTimer=LigTimer+1;
  if(Lig_en==1){
    digitalWrite(LigPin,1); //Liging
    if(LigRecipro==0){
      Lig_en=0;
      LigTimer=0;
      LigRecipro=3600;
    }
    else{LigRecipro=LigSpinTime*60*60-LigTimer; }//倒數
  }
  else{
    digitalWrite(LigPin,0);//Stop Lig
    if(LigRecipro==0){    
      Lig_en=1;
      LigTimer=0;
      LigRecipro=3600;
    }
    else{LigRecipro=LigSpace*60*60-LigTimer; //倒數
    }
  }
}

#include <Arduino.h>
#include <SoftwareSerial.h>
#include "Timer.h"
#include <LiquidCrystal.h>
Timer t;
const int buttonPin = 32;     // the number of the pushbutton pin
const int motorPin =  13;      
const int FeedTime =  10;      
const int WatSent  =  30;
const int LigPin   =  34;
const byte Set = 22,  Next= 24, up = 26, down = 28;
//      LCD 接腳:  rs, enable, d4, d5, d6, d7 
//      對應到 Arduino 接腳:  12,   11  ,  5,  4,  3,  2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// variables will change:
byte buttonState,Seting,Nexting,uping,downing = 0;// variable for reading the pushbutton status
int outreg=0;
int day,hour,minu,sec=0;//conter
int menuChg,SetMode,SetMenuSW=0;//Lcd menu
int Norlin2_hour,Norlin2_minu,Norlin2_sec=0;//LCD Normal line2 desplay
byte Lcd_lin2_En=1;
byte lcd_blink_en=0;
int Fed_en,Wat_en,Lig_en=0; //Output EN
int FeedSpace=8,FedSpinTime=15,WatLigON_Max=500;//Output
int WatLigOF_Max=550,WatLigON_Min=0,WatLigOF_Min=250,LigSpace=4,LigSpinTime=4;
int WatlinNow,WatING=0; //Water
int WatTimer,WatTime_day,WatTime_hour,WatTime_minu,WatTime_sec;
int WatLsTime_day,WatLsTime_hour;
int FeedTimer,SpiningTimer,FedRecipro;//Feed
int LigTimer,LigRecipro=3600,LigSpiningTimer; //Light

void setup() {
  // initialize the LED pin as an output:
  pinMode(motorPin, OUTPUT);      
  pinMode(FeedTime, OUTPUT);      
  pinMode(WatSent, OUTPUT);     
  pinMode(LigPin, OUTPUT);      
  pinMode(buttonPin, INPUT);   
  pinMode(Set, INPUT);
  pinMode(Next, INPUT);  
  pinMode(up, INPUT);
  pinMode(down, INPUT);
  // 設定 LCD 的行列數目 (2 x 16)
  lcd.begin(16, 2);
  t.every(2000, LCD_lin2); //call LCD function
  t.every(1000, Conter_main);
  t.every(1000, WaterSensor);
  t.every(1000, Water_main);
  t.every(1000, Feed_main);
  t.every(1000, Light);
  t.every(100, LCD_main); //call LCD function
  t.every(100, Debounce_main); //call LCD function
  Serial.begin(9600); //串列埠功能使用初始化
}

void loop(){
  t.update();
}
void Project_main() {
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {     
    digitalWrite(motorPin,1); 
    digitalWrite(FeedTime,1); 
  } 
  else {
    analogWrite(FeedTime,map(hour, 0, 7, 0, 255));
    digitalWrite(motorPin,0); 
    Conter_main(); //call Conter function
  }
}
void LCD_main() {
  // 將游標設到 column 0, line 0
  lcd.setCursor(0, 0); 
  switch(Seting) {
  case 0:
    lcd.noBlink();
    Lcd_lin2_En=1;
    LCD_Hompage();
    break;
  case 255:
    Lcd_lin2_En=0;
    Setting();
    LCD_Setpage();
    break;
  }
  if (Lcd_lin2_En==1){
    // 將游標設到 column 0, line 1
    lcd.setCursor(0, 1); 
    lcd.print("                ");
    lcd.setCursor(0, 1); 
    switch(menuChg) {
    case 0:
      NorFed_Disp();
      break;
    case 1:
      NorWat_Disp();
      break;
    case 2:
      NorLig_Disp();
      break;
    case 3:
      NorWatLin_Disp();
      break;
    }
    if (menuChg<=2){
      switch(menuChg) {
      case 0://Feed
        Norlin2_hour=FedRecipro/60 /60;
        Norlin2_minu=FedRecipro/60 %60;
        Norlin2_sec =FedRecipro %60 %60;
        break;
      case 1://Water
        Norlin2_hour=0;
        Norlin2_minu=WatLsTime_day;
        Norlin2_sec=WatLsTime_hour;
        break;
      case 2://Lig
        Norlin2_hour=LigRecipro/60 /60;
        Norlin2_minu=LigRecipro/60 %60;
        Norlin2_sec=LigRecipro %60 %60;
        break;
      }
      lcd.setCursor(7, 1);
      lcd.print("_");
      lcd.print(Norlin2_hour);
      lcd.setCursor(10, 1);
      lcd.print(":");
      lcd.print(Norlin2_minu);
      lcd.setCursor(13, 1);
      lcd.print(":");
      lcd.print(Norlin2_sec);
    }
    else{
      lcd.print(WatlinNow);
    }
  }
}
void LCD_Hompage() {
  lcd.print("Day:");
  lcd.print(day);
  lcd.setCursor(7, 0);
  lcd.print("_");
  lcd.print(hour);
  lcd.setCursor(10, 0);
  lcd.print(":");
  lcd.print(minu);
  lcd.setCursor(13, 0);
  lcd.print(":");
  lcd.print(sec);
}
void  Setting(){ //reflash time = 100ms
  if (Nexting==1){
    lcd.clear();
    if (SetMode==7){
      SetMode=0;
    }
    else{
      SetMode=SetMode+1;
    }
    Serial.println(SetMode);
  }
  SetMenuSW=SetMode/2;
  switch(SetMode){
  case 0: //hour
    if (FeedSpace>=9 && (uping==1) || (FeedSpace<=0)&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        FeedSpace=FeedSpace+1;
      }
      else if (downing==1){
        FeedSpace=FeedSpace-1;
      }
    }
    break;
  case 1://sec 
    if (FedSpinTime>=59 && (uping==1)|| FedSpinTime<=0&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        FedSpinTime=FedSpinTime+1;
      }
      else if (downing==1){
        FedSpinTime=FedSpinTime-1;
      }
    }
    break;
  case 2://
    if (WatLigON_Max>=999 && (uping==1) || WatLigON_Max<=WatLigON_Min+10&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        WatLigON_Max=WatLigON_Max+10;
      }
      else if (downing==1){
        WatLigON_Max=WatLigON_Max-10;
      }
    }
    break;
  case 3:
    if (WatLigOF_Max>=999 && (uping==1) || WatLigOF_Max<=WatLigOF_Min+10&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        WatLigOF_Max=WatLigOF_Max+10;
      }
      else if (downing==1){
        WatLigOF_Max=WatLigOF_Max-10;
      }
    }
    break;
  case 4:
    if (WatLigON_Min>=WatLigON_Max-10 && (uping==1) || WatLigON_Min<=0&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        WatLigON_Min=WatLigON_Min+10;
      }
      else if (downing==1){
        WatLigON_Min=WatLigON_Min-10;
      }
    }
    break;
  case 5:
    if (WatLigOF_Min>=WatLigOF_Max-10 && (uping==1) || WatLigOF_Min<=0&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        WatLigOF_Min=WatLigOF_Min+10;
      }
      else if (downing==1){
        WatLigOF_Min=WatLigOF_Min-10;
      }
    }
    break;
  case 6://hour
    if (LigSpace>=23 && (uping==1) || LigSpace<=0&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        LigSpace=LigSpace+1;
      }
      else if (downing==1){
        LigSpace=LigSpace-1;
      }
    }
    break;
  case 7://hour
    if (LigSpinTime>=23 && (uping==1) || LigSpinTime<=0&&(downing==1)){
      lcd.blink();
    }
    else{
      if (uping==1){
        LigSpinTime=LigSpinTime+1;
      }
      else if (downing==1){
        LigSpinTime=LigSpinTime-1;
      }
    }
    break;
  } 
}
void LCD_Setpage() { 
  switch(SetMenuSW){
  case 0 :
    SetFed_Disp();
    break;
  case 1:
    SetWat_Disp();
    break;
  case 2:
    SetWat2_Disp();
    break;
  case 3:
    SetLig_Disp();
    break;
  }
  lcd_blink_en=lcd_blink_en+1; //游標閃爍智能
  if (lcd_blink_en%2==0){
    switch(SetMode){
    case 0:
      lcd.setCursor(10, 0);
      break;
    case 1:
      lcd.setCursor(10, 1);
      break;
    case 2:
      lcd.setCursor(13, 0);
      break;
    case 4:
      lcd.setCursor(13, 0);
      break;
    case 3:
      lcd.setCursor(13, 1);
      break;
    case 5:
      lcd.setCursor(13, 1);
      break;
    case 6:
      lcd.setCursor(9, 0);
      break;
    case 7:
      lcd.setCursor(9, 1);
      break;
    }  
    lcd.blink();
  }
  else{
    lcd.noBlink();
  }
}
void SetFed_Disp(){
  lcd.print("FeedSpace:");
  lcd.print(FeedSpace);
  lcd.setCursor(12, 0);
  lcd.print("Hour");
  lcd.setCursor(0, 1);
  lcd.print("SpinTime :");
  lcd.print(FedSpinTime);
  lcd.setCursor(13, 1);
  lcd.print("Sec");
}
void SetWat_Disp(){
  lcd.print("WatLigON_Max:");
  lcd.print(WatLigON_Max);
  lcd.setCursor(0, 1);
  lcd.print("WatLigOF_Max");
  lcd.setCursor(12, 1);
  lcd.print(":");
  lcd.print(WatLigOF_Max);
}
void SetWat2_Disp(){
  lcd.print("WatLigON_Min:");
  lcd.print(WatLigON_Min);
  lcd.setCursor(0, 1);
  lcd.print("WatLigOF_Min");
  lcd.setCursor(12, 1);
  lcd.print(":");
  lcd.print(WatLigOF_Min);
}
void SetLig_Disp(){
  lcd.print("LigSpace:");
  lcd.print(LigSpace);
  lcd.setCursor(12, 0);
  lcd.print("Hour");
  lcd.setCursor(0, 1);
  lcd.print("SpinTime:");
  lcd.print(LigSpinTime);
  lcd.setCursor(12, 1);
  lcd.print("Hour");
}
void LCD_lin2() {
  if (menuChg==3){
    menuChg=0;
  }
  else{
    menuChg=menuChg+1;
  }//Change page
}
void NorFed_Disp(){
  lcd.print("Fed:");
  if (Fed_en==1){
    lcd.print(" ON");
  }
  else{
    lcd.print("OFF");
  }
}
void NorWat_Disp(){
  lcd.print("Wat:");
  if (Wat_en==1){
    lcd.print(" ON");
  }
  else{
    lcd.print("OFF");
  }
  lcd.setCursor(9, 1);
}
void NorLig_Disp(){
  lcd.print("Lig:");
  if (Lig_en==1){
    lcd.print(" ON");
  }
  else{
    lcd.print("OFF");
  }
  lcd.setCursor(9, 1);
}
void NorWatLin_Disp(){
  lcd.print("WatLin:");
}
void Conter_main() {
  // counter:
  if (sec==59) {
    lcd.clear();
    sec=0;
    if (minu==59){
      minu=0;
      if(hour==23){
        hour=0;
        day=day+1;/*
           
         delay (15000);
         sec=15;*/
      }
      else{
        hour=hour+1;
      }
    }
    else{
      minu=minu+1;
    }
  }
  else{
    sec=sec+1;
  }
}
void Debounce_main() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
  if (digitalRead(Set)==1) {
    Seting= ~Seting;
    lcd.clear();
  }
  if (digitalRead(up)||digitalRead(down) ==1) {
    lcd.clear();
  }
  Nexting= digitalRead(Next);
  uping= digitalRead(up);
  downing= digitalRead(down);
}
void WaterSensor(){
  WatlinNow=analogRead(0); 
}
      /*   Output Enable    */
void Water_main(){
  if (Lig_en==0){//WatLigOFF
    if (WatlinNow<=WatLigOF_Min){
      Wat_en=1;
    }
    if (WatlinNow>=WatLigOF_Max){
      Wat_en=0;
    }
    if (Wat_en==1){//Sent Water
      digitalWrite(WatSent,1); 
    }
    else{
      digitalWrite(WatSent,0);
    }
  } 
  else{//WatLigON
    if (WatlinNow<=WatLigON_Min){
      Wat_en=1;
    }
    if (WatlinNow>=WatLigON_Max){
      Wat_en=0;
    }
    if (Wat_en==1){//Sent Water
      digitalWrite(WatSent,1); 
    }
    else{
      digitalWrite(WatSent,0);
    }
  } 
  if (Wat_en==1){
    WatLsTime_day=WatTime_day;
    WatLsTime_hour=WatTime_hour;
    WatTime_day=0;
    WatTime_hour=0;
    WatTime_minu=0;
    WatTime_sec=0;
  }
  else{
   // int WatTimer,WatLsTime,WatTime_hour,WatTime_minu,WatTime_sec;
    if (WatTime_sec==59) {
    WatTime_sec=0;
    if (minu==59){
      WatTime_minu=0;
      if(WatTime_hour==23){
        WatTime_hour=0;
        WatTime_day=WatTime_day+1;
      }
      else{
        WatTime_hour=WatTime_hour+1;
      }
    }
    else{
      WatTime_minu=WatTime_minu+1;
    }
  }
  else{
    WatTime_sec=WatTime_sec+1;
  }
  }
}
int test_fed;
void  Feed_main(){
  if (buttonState==1){
    digitalWrite(motorPin,1); //Feeding
  }
  else{
    if (test_fed==1){
      test_fed=0;
      // 設定 LCD 的行列數目 (2 x 16)
      lcd.begin(16, 2);
    }
    FeedTimer=FeedTimer+1;
    FedRecipro=FeedSpace*60*60-FeedTimer;
    if(FeedTimer>=FeedSpace*60*60){
      Fed_en=1;
      FeedTimer=0;
    }
    if(Fed_en==1){
      if (SpiningTimer>=FedSpinTime){
         SpiningTimer=0;
         Fed_en=0;
      }
      else{
        digitalWrite(motorPin,1); //Feeding
        SpiningTimer=SpiningTimer+1;
        test_fed=1;
      }    
    }
    else{digitalWrite(motorPin,0);}//Stop Feed
  }
}
void Light(){
  LigTimer=LigTimer+1;
  if(Lig_en==1){
    digitalWrite(LigPin,1); //Liging
    if(LigRecipro==0){
      Lig_en=0;
      LigTimer=0;
      LigRecipro=3600;
    }
    else{LigRecipro=LigSpinTime*60*60-LigTimer; }//倒數
  }
  else{
    digitalWrite(LigPin,0);//Stop Lig
    if(LigRecipro==0){    
      Lig_en=1;
      LigTimer=0;
      LigRecipro=3600;
    }
    else{LigRecipro=LigSpace*60*60-LigTimer; //倒數
    }
  }
}
arrow
arrow
    文章標籤
    Code
    全站熱搜

    兩隻小豬 發表在 痞客邦 留言(0) 人氣()