#include <SoftwareSerial.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "Timer.h"
SoftwareSerial I2CBT(8,9); //Tx & Rx
#define ONE_WIRE_BUS 6
Timer t;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
//-----------------------------------------------------/
const int analogInPin = A0; 
const int buttonPin = 7;     // the number of the pushbutton pin
const int motorPin =  10;      
const int WatSent  =  11;
const int LigPin   =  12;
//-----------------------------------------------------/
byte buttonState=0;
int day,hour,minu,sec=0;//conter
int WaterSensor=0; //Water
int WatTimer,WatTime_day,WatTime_hour,WatTime_minu,WatTime_sec;
int FeedTimer,SpiningTimer,FedRecipro;//Feed
int LigTimer,LigSpiningTimer; //Light

int Fed_en,Wat_en,Lig_en=0; //Output EN
int FeedSpace=8,FedSpinTime=15,WatLigON_Max=500;//Output
int WatLsTime_day,WatLsTime_hour;
int WatLigOF_Max=550,WatLigON_Min=0,WatLigOF_Min=250,LigSpace=4,LigSpinTime=4;
int LigRecipro=3600; //Light
//-----------------------------------------------------/
int insize; 
int count;
byte cmmd[10]; 
void setup() {
  pinMode(motorPin, OUTPUT); 
  pinMode(WatSent, OUTPUT);     
  pinMode(LigPin, OUTPUT);      
  Serial.begin(9600); 
  I2CBT.begin(115200);
  t.every(100, BlueTooth);
  t.every(1000, Conter_main);
  t.every(1000, WaterSensor_main);
  t.every(1000, Water_main);
  t.every(1000, Feed_main);
  t.every(1000, Light);
  t.every(100, Debounce_main); 
}

void loop() {
  t.update();
}
void BlueTooth(){
  if (I2CBT.available()) {
    char TheBlueToothData;
    TheBlueToothData=char(I2CBT.read());
    Serial.println("");
    Serial.print("TheBlueToothData = ");
    Serial.println(TheBlueToothData);
    if (TheBlueToothData=='A'){
      I2CBT.write("A");//A = Send Require
      byte Data[35];
      //---------------------------------------------------------------------------------------
      //Data 編碼2位數極限65025 
      //1.現在時間 day3 hour2 minu2 sec2
      //2.下次餵食時間
      //3.下次開燈(抽水馬達)的時間
      //4.上次補水的時間
      //5.水位
      //6.水溫
      //7.輸出智能 Fed_en,Wat_en,Lig_en
      //8.餵食設定 FeedSpace=8,FedSpinTime=15
      //9.補水設定 WatLigOF_Min=250,WatLigOF_Max=550,WatLigON_Min=0,WatLigON_Max=500
      //10.抽水馬達設定 LigRecipro=3600,LigSpace=4,LigSpinTime=4
      //---------------------------------------------------------------------------------------
      //第一筆:現在時間 [2位數][1位數][1位數][1位數]
      Data[0]=(int)(day/255);
      Data[1]=day%255;
      Data[2]=hour;
      Data[3]=minu;
      Data[4]=sec;
      //第二筆:下次餵食時間 [2位數]max:43200 
      Data[5]=(int)(FedRecipro/255);
      Data[6]=FedRecipro%255;
      //第三筆:下次開燈(抽水馬達)的時間 [2位數]max:43200 
      Data[7]=(int)(LigRecipro/255);
      Data[8]=LigRecipro%255;
      //第四筆:上次補水的時間 [1位數][1位數][1位數][1位數]    [1位數][1位數]
      //int ,; 
      Data[9]=WatTime_day;
      Data[10]=WatTime_hour;
      Data[11]=WatTime_minu;
      Data[12]=WatTime_sec;
      Data[13]=WatLsTime_day;
      Data[14]=WatLsTime_hour;
      //第五筆:水位 [2位數]
      Data[15]=(int)(WaterSensor/255);
      Data[16]=WaterSensor%255;
      //第六筆:水溫 [1位數] [,] [1位數]
      Data[17]='T';
      Data[18]=(int)sensors.getTempCByIndex(0);
      Data[19]=(int)(sensors.getTempCByIndex(0)*10)%10;
      //第七筆:輸出智能 Fed_en,Wat_en,Lig_en =>421編碼共用
      Data[20]= 4*Fed_en+2*Wat_en+Lig_en;
      //第八筆:餵食設定 FeedSpace=8,FedSpinTime=15
      Data[21]=FeedSpace;
      Data[22]=FedSpinTime;
      //第九筆:補水設定 WatLigOF_Min=250,WatLigOF_Max=550,WatLigON_Min=0,WatLigON_Max=500
      Data[23]=WatLigOF_Min;
      Data[24]=WatLigOF_Max;
      Data[25]=WatLigON_Min;
      Data[26]=WatLigON_Max;
      //第十筆:抽水馬達設定 LigSpace=4,LigSpinTime=4
      Data[27]=LigSpace;
      Data[28]=LigSpinTime;
      //
      for(int j=0;j<=35;j++){
        Serial.print(Data[j]);
        Serial.print(" ");
        I2CBT.write(Data[j]);
      }
      Serial.println(" ");
    }
    else if (TheBlueToothData=='B'){
      insize=I2CBT.available(); //讀取藍牙訊息
      Serial.print("input size = ");
      Serial.println(insize);
      for (int i=0; i<insize; i++){
        count++;
        Serial.print(cmmd[count]=(I2CBT.read()));
        Serial.print(" ");
      }
      Serial.print("Counter= ");
      Serial.println(count);
      Serial.println("cmmd:");
      // 讀取所有資料,並顯示在 LCD
      for(int j=0;j<=count;j++){
        Serial.print(char(cmmd[j]));
        Serial.print(" ");
      }
      //---------------------------------------------------------------------------------------
      //cmmd address+1
      //1.餵食設定 FeedSpace=8,FedSpinTime=15
      //2.補水設定 WatLigOF_Min=250,WatLigOF_Max=550,WatLigON_Min=0,WatLigON_Max=500
      //3.抽水馬達設定 LigRecipro=3600,LigSpace=4,LigSpinTime=4
      //---------------------------------------------------------------------------------------
      //第一筆:餵食設定 FeedSpace=8,FedSpinTime=15
      FeedSpace=cmmd[1];
      FedSpinTime=cmmd[2];
      //第二筆:補水設定 WatLigOF_Min=250,WatLigOF_Max=550,WatLigON_Min=0,WatLigON_Max=500
      WatLigOF_Min=cmmd[3];
      WatLigOF_Max=cmmd[4];
      WatLigON_Min=cmmd[5];
      WatLigON_Max=cmmd[6];
      //第三筆:抽水馬達設定 LigRecipro=3600,LigSpace=4,LigSpinTime=4
      LigSpace=cmmd[7];
      LigSpinTime=cmmd[8];
      //
      Initalize();
      I2CBT.write("B");//B = Send Requier
      }
   }
}
void Initalize(){
  count=0;
  insize=0;
}
void Conter_main() {
  // counter:
  if (sec==59) {
    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 WaterSensor_main(){
  WaterSensor = analogRead(analogInPin); //3位
  sensors.requestTemperatures();
}
      /*   Output Enable    */
void Water_main(){
  if (Lig_en==0){//WatLigOFF
    if (WaterSensor<=WatLigOF_Min){
      Wat_en=1;
    }
    if (WaterSensor>=WatLigOF_Max){
      Wat_en=0;
    }
    if (Wat_en==1){//Sent Water
      digitalWrite(WatSent,1); 
    }
    else{
      digitalWrite(WatSent,0);
    }
  } 
  else{//WatLigON
    if (WaterSensor<=WatLigON_Min){
      Wat_en=1;
    }
    if (WaterSensor>=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;
    }
    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; //倒數
    }
  }
}
void Debounce_main() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);
}
arrow
arrow
    文章標籤
    Code
    全站熱搜

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