/* NOBのArduino日記! プランター自動水やり機制御プログラム(20230729更新)
* rev :2.01
* 変更内容:ホース小径化に伴い吐出量減→対策として吐出回数倍増化
*/
#include "PlantWatering.h"
PlantWateringClass pwc;
int InComingData[255];
unsigned long StartTime, loopTime = 1000;
bool Skip = false, Skip2 = true; //条件判定
unsigned long On_No; //散水時間(単位:Sec)
int WatTimParDay = 0; //一日当たりの散水回数合計
int OldMon = -1, OldDay = -1, OldHor = -1, OldMin = -1;//最終測定時間
void setup() {
Serial.begin(115200);
pwc.RTC_time_initialize(false);
}
void loop() {
//■main
if (loopTime <= millis() - StartTime) {
StartTime = millis();
//■手動スイッチが押されていれば強制的に水を出す
if(SkipCheck(false) && pwc.Switch_Read()){
pwc.SolenoidWrite(true);
SkipWrite(true);
}
//■規定時刻に土が乾いていれば水を出す
if(SkipCheck(false) && Time_Read()){
if(true/*Sensor_Read()*/){
pwc.SolenoidWrite(true);
SkipWrite(true);
}
}
//■最後までSkipされていなければ水を止める、Skipトグルが「true」だったら「false」に戻す
if(SkipCheck(false)){
pwc.SolenoidWrite(false);
}else{
SkipWrite(false);
}
//■information出力
#if !DEBUG
String str = " WatTimParDay:" + String(WatTimParDay) + " onNo:0x"+ String(On_No, HEX) + "\r\n";
pwc.information_Print(str);
#endif
}
#if DEBUG
//■Debug[h,Yea, Mon, Day, Wee, Hor, Min, Sec,]: h2023,7,29, 06, 00,
if (pwc.Receive(InComingData)) {
pwc.ymd.Yea = InComingData[0];
pwc.ymd.Mon = InComingData[1];
pwc.ymd.Day = InComingData[2];
//pwc.ymd.Wee = InComingData[3]; //省略
pwc.ymd.Hor = InComingData[3];
pwc.ymd.Min = InComingData[4];
//pwc.ymd.Sec = InComingData[5]; //省略
Time_Read();
String str = " WatTimParDay:" + String(WatTimParDay) + " On_No:0x"+ String(On_No, HEX) + "\r\n";
pwc.information_Print(str);
}
#endif
}
/*
* リアルタイムクロックの値を判定
*/
bool Time_Read(){
//No初期化
#if !DEBUG
pwc.RTC_refresh();
#endif
Skip2 = true;
On_No = 0;
if(pwc.ymd.Hor == 0 && pwc.ymd.Min == 0 && (OldMin != pwc.ymd.Min || OldHor != pwc.ymd.Hor || OldDay != pwc.ymd.Day || OldMon != pwc.ymd.Mon )){
OldMin = pwc.ymd.Min;
OldHor = pwc.ymd.Hor;
OldDay = pwc.ymd.Day;
OldMon = pwc.ymd.Mon;
#if false//DEBUG
Serial.print(", WTPD:" + String(WatTimParDay));
#endif
WatTimParDay = 0;
};
//規定時刻でtrueを返す処理
switch (pwc.ymd.Mon) {
case pwc.ymd.June: //6月
if(0 <= pwc.ymd.Day && pwc.ymd.Day < 7){
// h2023,6,1, 06, 00,
check( 6, 0, 0x060A0600);
check(18, 0, 0x060A1800);
} else if(7 <= pwc.ymd.Day && pwc.ymd.Day < 14){
check( 6, 0, 0x060B0600);
check(12, 0, 0x120B0600);
check(18, 0, 0x180B0600);
} else if(14 <= pwc.ymd.Day && pwc.ymd.Day < 21){
check( 6, 0, 0x060C0600);
check(10, 0, 0x060C1000);
check(14, 0, 0x060C1400);
check(18, 0, 0x060C1800);
} else if(21 <= pwc.ymd.Day){
check( 6, 0, 0x060D0600);
check( 9, 0, 0x060D0900);
check(12, 0, 0x060D1200);
check(15, 0, 0x060D1500);
check(18, 0, 0x060D1800);
}
break;
case pwc.ymd.July: //7月
if(0 <= pwc.ymd.Day && pwc.ymd.Day < 7){
check( 6, 0, 0x070A0600);
check( 9, 0, 0x070A0900);
check(12, 0, 0x070A1200);
check(15, 0, 0x070A1500);
check(18, 0, 0x070A1800);
} else if(7 <= pwc.ymd.Day && pwc.ymd.Day < 14){
check( 6, 0, 0x070B0600);
check( 8, 0, 0x070B0800);
check(10, 0, 0x070B1000);
check(11, 0, 0x070B1100);
check(12, 0, 0x070B1200);
check(13, 0, 0x070B1300);
check(14, 0, 0x070B1400);
check(16, 0, 0x070B1600);
check(18, 0, 0x070B1800);
} else if(14 <= pwc.ymd.Day && pwc.ymd.Day < 21){
check( 6, 0, 0x070C0600);
check( 7, 0, 0x070C0700);
check( 8, 0, 0x070C0800);
check( 9, 0, 0x070C0900);
check(10, 0, 0x070C1000);
check(10, 30, 0x070C1030);
check(11, 0, 0x070C1100);
check(11, 30, 0x070C1130);
check(12, 0, 0x070C1200);
check(12, 30, 0x070C1230);
check(13, 0, 0x070C1300);
check(13, 30, 0x070C1330);
check(14, 0, 0x070C1400);
check(15, 0, 0x070C1500);
check(16, 30, 0x070C1630);
check(18, 0, 0x070C1800);
} else if(21 <= pwc.ymd.Day){
check( 6, 0, 0x070D0600);
check( 7, 0, 0x070D0700);
check( 8, 0, 0x070D0800);
check( 9, 0, 0x070D0900);
check( 9, 30, 0x070D0930);
check(10, 0, 0x070D1000);
check(10, 30, 0x070D1030);
check(11, 0, 0x070D1100);
check(11, 15, 0x070D1115);
check(11, 30, 0x070D1130);
check(11, 45, 0x070D1145);
check(12, 0, 0x070D1200);
check(12, 15, 0x070D1215);
check(12, 30, 0x070D1230);
check(12, 45, 0x070D1245);
check(13, 0, 0x070D1300);
check(13, 15, 0x070D1315);
check(13, 30, 0x070D1330);
check(13, 45, 0x070D1345);
check(14, 0, 0x070D1400);
check(15, 0, 0x070D1500);
check(16, 0, 0x070D1600);
check(17, 0, 0x070D1700);
check(18, 0, 0x070D1800);
}
break;
case pwc.ymd.August: //8月
check( 6, 0, 0x08ff0600);
check( 7, 0, 0x08ff0700);
check( 8, 0, 0x08ff0800);
check( 9, 0, 0x08ff0900);
check( 9, 30, 0x08ff0930);
check(10, 0, 0x08ff1000);
check(10, 30, 0x08ff1030);
check(11, 0, 0x08ff1100);
check(11, 15, 0x08ff1115);
check(11, 30, 0x08ff1130);
check(11, 45, 0x08ff1145);
check(12, 0, 0x08ff1200);
check(12, 15, 0x08ff1215);
check(12, 30, 0x08ff1230);
check(12, 45, 0x08ff1245);
check(13, 0, 0x08ff1300);
check(13, 15, 0x08ff1315);
check(13, 30, 0x08ff1330);
check(13, 45, 0x08ff1345);
check(14, 0, 0x08ff1400);
check(15, 0, 0x08ff1500);
check(16, 0, 0x08ff1600);
check(17, 0, 0x08ff1700);
check(18, 0, 0x08ff1800);
break;
case pwc.ymd.September: //9月
check( 6, 0, 0x09ff0600);
check( 7, 0, 0x09ff0700);
check( 8, 0, 0x09ff0800);
check( 9, 0, 0x09ff0900);
check( 9, 30, 0x09ff0930);
check(10, 0, 0x09ff1000);
check(10, 30, 0x09ff1030);
check(11, 0, 0x09ff1100);
check(11, 15, 0x09ff1115);
check(11, 30, 0x09ff1130);
check(11, 45, 0x09ff1145);
check(12, 0, 0x09ff1200);
check(12, 15, 0x09ff1215);
check(12, 30, 0x09ff1230);
check(12, 45, 0x09ff1245);
check(13, 0, 0x09ff1300);
check(13, 15, 0x09ff1315);
check(13, 30, 0x09ff1330);
check(13, 45, 0x09ff1345);
check(14, 0, 0x09ff1400);
check(15, 0, 0x09ff1500);
check(16, 0, 0x09ff1600);
check(17, 0, 0x09ff1700);
check(18, 0, 0x09ff1800);
break;
default: //1~5月「Jan,Feb,Mar,Apr,May」、10~12月「Oct,Nov,Dec」)
check( 6, 0, 0x09ff1500);
check(18, 0, 0x09ff1600);
break;
}
return (0 < On_No); //OnTimeが0を超えたら「true」を返す
}
inline void SkipWrite( bool argV ){ Skip = argV; }
inline bool SkipCheck( bool argV ){
if(Skip == argV){
return true;
}else{
return false;
};
}
/* 20230730 TBD 次回ここから修正する!!!!★★★!!!
* 引数の時刻である場合はTrueを返す関数
* 例: check(6, 0, 0x060A0600)
*/
inline void check(int hor, int min, unsigned long on_no){
if(Skip2){
if(pwc.ymd.Hor == hor && pwc.ymd.Min == min){
On_No = on_no;
#if false//DEBUG
Serial.print(
" now:" + (String)pwc.ymd.Mon +
":" + (String)pwc.ymd.Day +
":" + (String)pwc.ymd.Hor +
":" + (String)pwc.ymd.Min +
", Old:" + (String)OldMon +
":" + (String)OldDay +
":" + (String)OldHor +
":" + (String)OldMin +
"\r\n"
);
#endif
if(pwc.ymd.Min != OldMin || pwc.ymd.Hor != OldHor || pwc.ymd.Day != OldDay || pwc.ymd.Mon != OldMon){
Skip2 = false;
WatTimParDay++;
#if false//DEBUG
Serial.print(
" now:" + (String)pwc.ymd.Mon +
":" + (String)pwc.ymd.Day +
":" + (String)pwc.ymd.Hor +
":" + (String)pwc.ymd.Min +
", chack:" + (String)hor +
":" + (String)min +
", Old:" + (String)OldMon +
":" + (String)OldDay +
":" + (String)OldHor +
":" + (String)OldMin +
", Skip2:" + (String)Skip2 +
", WatTimParDay:" + (String)WatTimParDay +
", On_No:0x" + String(On_No,HEX) +
"\r\n"
);
#endif
}
}
OldMin = pwc.ymd.Min;
OldHor = pwc.ymd.Hor;
OldDay = pwc.ymd.Day;
OldMon = pwc.ymd.Mon;
}
}