#include <SoftwareSerial.h>
#include <Wire.h>
#include "Timer.h"
#include <LiquidCrystal.h>
SoftwareSerial I2CBT(8,9); //Tx & Rx
const byte Set = 10, Next= 11, up = 12, down = 13;
//----------------------------------------------------LCD
byte Seting,Nexting,uping,downing = 0;// variable for reading the pushbutton status
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;
//----------------------------------------------------Other
byte serialA;
int insize;
int count;
int I2CBT_WriteFlag;
byte cmmd[50];
int WaterLevel;
String WaterTemp;
int day,hour,minu,sec=0;//conter
int Fed_en,Wat_en,Lig_en=0; //Output EN
int FeedSpace,FedSpinTime,WatLigON_Max;//Output
int WatLigOF_Max,WatLigON_Min,WatLigOF_Min,LigSpace,LigSpinTime;
int WaterSensor; //Water
int WatTimer,WatTime_day,WatTime_hour,WatTime_minu,WatTime_sec;
int WatLsTime_day,WatLsTime_hour;
int FeedTimer,SpiningTimer,FedRecipro;//Feed
int LigTimer,LigRecipro,LigSpiningTimer; //Light
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
Timer t;
void setup() {
pinMode(Set, INPUT);
pinMode(Next, INPUT);
pinMode(up, INPUT);
pinMode(down, INPUT);
Serial.begin(9600);
I2CBT.begin(115200);
delay(1000);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
lcd.print("Connecting");
I2CBT.write("A");//A = Send Require
t.every(2000, LCD_lin2); //call LCD function
t.every(100, LCD_main); //call LCD function
t.every(100, BlueTooth);
t.every(500, BTRead);
t.every(100, Debounce_main); //call LCD function
}
void loop() {
t.update();
}
int ReadEN=0;
void BlueTooth(){
if (I2CBT.available()) {
ReadEN=1;
}
}
int delay1sac;
String inputString = ""; //存放讀取進來的字元字串
boolean stringComplete = false; //字串是否完成旗號
void BTRead(){
if (ReadEN==1){
if (I2CBT_WriteFlag==1){
if (I2CBT.available()){//假如有任何資料進來
char inChar = I2CBT.read(); //一次讀取一個字元
inputString += inChar; //一個字元一個字元加起來
if (inChar == '\n') { //假如字元等於結束字元’\n’判定字串已接收結束
stringComplete = true; //設定字串結束旗號
}
}
else{
if (delay1sac==4){
Serial.println("");
Serial.print("inputString = ");
Serial.println(inputString);
Serial.print("stringComplete = ");
Serial.println(stringComplete);
inputString = "";
stringComplete = false;
I2CBT.write("A");//A = Send Require
delay1sac=0;
I2CBT_WriteFlag=0;
}
else{
delay1sac++;
}
}
}
else if (I2CBT_WriteFlag==2){
if (I2CBT.available()){//假如有任何資料進來
char inChar = I2CBT.read(); //一次讀取一個字元
inputString += inChar; //一個字元一個字元加起來
if (inChar == '\n') { //假如字元等於結束字元’\n’判定字串已接收結束
stringComplete = true; //設定字串結束旗號
}
}
else{
if (delay1sac==4){
Serial.println("");
Serial.print("inputString = ");
Serial.println(inputString);
Serial.print("stringComplete = ");
Serial.println(stringComplete);
inputString = "";
stringComplete = false;
I2CBT.write("B");//B = Send Require
delay1sac=0;
I2CBT_WriteFlag=0;
}
else{
delay1sac++;
}
}
}
else{
char TheBlueToothData;
TheBlueToothData=char(I2CBT.read());
Serial.println("");
Serial.print("TheBlueToothData = ");
Serial.println(TheBlueToothData);
switch(Seting) {
case 0: //normal mode
if (TheBlueToothData=='A'){
insize=I2CBT.available(); //讀取藍牙訊息
Serial.print("input size = ");
Serial.println(insize);
if (insize>=9 && insize<=50 ){
count=0;
for (int i=0; i<insize; i++){
count++;
Serial.print(cmmd[count]=(I2CBT.read()));
Serial.print(" ");
}
}
}
else{
Serial.println("cmmd:");
// 讀取所有資料,並顯示在 LCD
for(int j=0;j<=count;j++){
Serial.print(char(cmmd[j]));
Serial.print(" ");
}
//---------------------------------------------------------------------------------------
//cmmd address+1
//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位數]
day=cmmd[1]*255+cmmd[2];
hour=cmmd[3];
minu=cmmd[4];
sec=cmmd[5];
if (sec==0){lcd.clear();}
//第二筆:下次餵食時間 [2位數]max:43200
FedRecipro=cmmd[6]*255+cmmd[7];
//第三筆:下次開燈(抽水馬達)的時間 [2位數]max:43200
LigRecipro=cmmd[8]*255+cmmd[9];
//第四筆:上次補水的時間 [1位數][1位數][1位數][1位數]
WatTime_day=cmmd[10];
WatTime_hour=cmmd[11];
WatTime_minu=cmmd[12];
WatTime_sec=cmmd[13];
WatLsTime_day=cmmd[14];
WatLsTime_hour=cmmd[15];
//第五筆:水位 [2位數]
WaterLevel=cmmd[16]*255+cmmd[17];
//第六筆:水溫 [1位數] [,] [1位數]
WaterTemp=String(cmmd[19])+'.'+String(cmmd[20]);
//第七筆:輸出智能 Fed_en,Wat_en,Lig_en =>421編碼共用
Fed_en=(int)(cmmd[21]/4);
Wat_en=cmmd[21]%4/2;
Lig_en=cmmd[21]%2;
//第八筆:餵食設定 FeedSpace=8,FedSpinTime=15
FeedSpace=cmmd[22];
FedSpinTime=cmmd[23];
//第九筆:補水設定 WatLigOF_Min=250,WatLigOF_Max=550,WatLigON_Min=0,WatLigON_Max=500
WatLigOF_Min=cmmd[24];
WatLigOF_Max=cmmd[25];
WatLigON_Min=cmmd[26];
WatLigON_Max=cmmd[27];
//第十筆:抽水馬達設定 LigRecipro=3600,LigSpace=4,LigSpinTime=4
LigSpace=cmmd[28];
LigSpinTime=cmmd[29];
//
Serial.println("I2CBT.write(A)");
Initalize();
I2CBT.write("A");//A = Send Require
}
break;
case 255: //setting mode
if (TheBlueToothData=='B'){
I2CBT.write("B");//A = Send Require
byte Data[10];
//---------------------------------------------------------------------------------------
//Data 編碼2位數極限65025
//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
Data[0]=FeedSpace;
Data[1]=FedSpinTime;
//第二筆:補水設定 WatLigOF_Min=250,WatLigOF_Max=550,WatLigON_Min=0,WatLigON_Max=500
Data[2]=WatLigOF_Min;
Data[3]=WatLigOF_Max;
Data[4]=WatLigON_Min;
Data[5]=WatLigON_Max;
//第三筆:抽水馬達設定 LigSpace=4,LigSpinTime=4
Data[6]=LigSpace;
Data[7]=LigSpinTime;
//
for(int j=0;j<=10;j++){
Serial.print(Data[j]);
Serial.print(" ");
I2CBT.write(Data[j]);
}
}
break;
}
}
}
}
void Initalize(){
count=0;
insize=0;
}
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(WaterLevel);
lcd.print(" Tm:");
lcd.print(WaterTemp);
}
}
}
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;
}
}
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("WatL:");
}
void Debounce_main() {
// read the state of the pushbutton value:
if (digitalRead(Set)==1) {
Seting= ~Seting;
if (Seting==0){
I2CBT_WriteFlag=1;
}
else{
I2CBT_WriteFlag=2;
}
lcd.clear();
}
if (digitalRead(up)||digitalRead(down) ==1) {
lcd.clear();
}
Nexting= digitalRead(Next);
uping= digitalRead(up);
downing= digitalRead(down);
}
文章標籤
全站熱搜
留言列表