#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);
}
文章標籤
全站熱搜
留言列表