--- title: 農業科技7-暗渠排水 tags: 農業科技 --- wifi的 String改char 未加SD卡的程式碼 --- ```` #include <Wire.h> #include "motoWiFiEsp.h" #include <SoftwareSerial.h> //看門狗測試,如果秒數超過會重開機 #include <avr/wdt.h> //lcd需要的涵數 #include <motoLiquidCrystal_I2C.h> //LiquidCrystal_I2C lcd(0x3F,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display LiquidCrystal_I2C mylcd(0x27,16,2); //使用WiFiClient會用到 #include <motoMQTTClient.h> long H_Threshold; String message; #include "motoDHT.h" //DHT 01 D9 #define DHTPIN1 9 // what pin we're connected to #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 DHT dht(DHTPIN1, DHTTYPE); //SoftwareSerial esp8266_Serial(3,2); #define esp8266_Serial Serial3 //mega2560 VS ESP8266 TX3(14 黃 8266_RX)、RX3(15 綠 8266_TX) VS TX、RX WiFiEspClient esp_client; int connect_status = WL_IDLE_STATUS; String ipAddressToString(const IPAddress& ipAddress ) { return String(ipAddress[0]) + String(".")+ String(ipAddress[1]) + String(".")+ String(ipAddress[2]) + String(".")+ String(ipAddress[3]); } String clientDataReceive( ) { String szMyData=""; int j=0; int arr_count = 0; while(1) { if (esp_client.available()) { char c = esp_client.read(); if (arr_count >= 179 && arr_count <= 184) { szMyData += c; } arr_count++; }else{ delay(10); j++; } if(j>100) break; } Serial.println(szMyData); return szMyData; } //網址 String host = "iot.oceanbox.com.tw"; String code = "9d90b4f4815e5e196770a3e9aed4b6f5"; String user = "jzs2home"; char wifiacc[] = "Xperia 10_4026"; char wifipas[] = "t5275520"; //String PHP_PATH = "/oceanduino/ledGet.php"; String PHP_PATH = "/oceanduino/ledGet202001.php"; void messageReceived(String topic, String payload, char * bytes, unsigned int length) { } //wifi判斷用 int wifi_here =0; //判斷水位用 int Liquid_level=0; //雨量預測 int rainying = 0; //預防馬達一直開著 int motor = 0; void setup() { //數位輸出13支腳,LED pinMode(13, OUTPUT); Serial.begin(9600); //上網晶片序列 esp8266_Serial.begin(9600); //濕度感測 pinMode(A0, INPUT); //switch開關1 pinMode(10, OUTPUT); //水位傳感器 pinMode(5,INPUT); H_Threshold = 100; message = ""; //esp8266_Serial.listen(); WiFi.init(&esp8266_Serial); if(WiFi.status()==WL_NO_SHIELD) { Serial.println(F("Esp8266 module no present")); //關掉,不燃8266移除會一直TIMEOUT //while(true); } //如果沒連上網路,就會一直連線,直到wifi_here = 3。 //回傳WL_CONNECTED表已連上WiFi AP while(connect_status != WL_CONNECTED && wifi_here < 3) { //while(connect_status != WL_CONNECTED) { Serial.println(F("Connect to router...")); //連結WIFI網路,並將結果存在connect_status變數中 connect_status = WiFi.begin(wifiacc,wifipas); //連線一次,+1 (連第三次後 wifi_here = 3 wifi_here++; Serial.print("wifi_here"); Serial.println(wifi_here); } //小於三代表連線成功------------------------------------ Serial.println(WiFi.localIP()); //溫濕度 Serial.println("DHT22 01"); dht.begin(); //lcd mylcd.init(); mylcd.backlight(); //----------------------------------------------------------看門狗 wdt_enable(WDTO_8S); //當機8秒後重開機 // Valid delays: // WDTO_15MS // WDTO_30MS // WDTO_60MS // WDTO_120MS // WDTO_250MS // WDTO_500MS // WDTO_1S // WDTO_2S // WDTO_4S // WDTO_8S //------------------------------------------------------------- } //delay_time_count每次加1,如果delay_time = 設定的秒數,將數據上網 int delay_time = 3; int delay_time_count = 0; //預設io 0 的模式 String io_mode0 = "0"; //switch singback------------------------------------------- //swtich跳回計數1~4 int switch_count1 = 0; //swtich signback1 跳回值 int signback = 0; int signback_zero = 0; //switch singback------------------------------------------- //自動重抓wifi,變數 int wifiget = 0; int led_show_loop = 0; //土壤濕度最大值 int value_sm_max = 620; void loop() { led_show_loop += 1; //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(8,0); mylcd.print(" "); //自動重抓wifi,變數加1 wifiget += 1; //變數宣告 int value_a0 = 1023 - analogRead(A0); //int value_a0 = analogRead(A0); Serial.print("土壤濕度:"); Serial.println(value_a0); Liquid_level=digitalRead(5); Serial.print("水位訊號:"); Serial.println(Liquid_level); //如果網路控制1沒有打開,就自動判斷 Serial.print("io_mode0 :"); Serial.println(String(io_mode0)); //溫濕度1 // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h1 = dht.readHumidity(); //讀取攝氏溫度 float t1 = dht.readTemperature(); //讀取華氏溫度 float f1 = dht.readTemperature(true); // check if returns are valid, if they are NaN (not a number) then something went wrong! if (isnan(t1) || isnan(h1)) { Serial.println("Failed to read from DHT"); } else { //濕度 Serial.print("Humidity: "); Serial.print(h1); Serial.print(" %\t"); //溫度 Serial.print("Temperature: "); Serial.print(t1); Serial.println(" *C"); } //網路沒手動打開時且雨量預測未達滿足點----------------------- if (String(io_mode0) == "0" && String(rainying) == "0") { //開關控制-土壤濕度,有插在土上才作動 //if (value_a0 > 20 && value_a0 < 450) { if (value_a0 > 10 && value_a0 < value_sm_max) { //判斷水位有水狀態才能打開 if (Liquid_level == 1) { motor += 1; //加入防止馬達一直運作,跑了多少次迴圈自動關掉--------------- if (motor < 30) { digitalWrite(10, HIGH); }else{ digitalWrite(10, LOW); } //加入防止馬達一直運作--------------- //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(0,1); mylcd.print("SWITCH: "); mylcd.setCursor(8,1); //mylcd.print("ON "); mylcd.print(motor); //加入防止馬達一直運作--------------- }else { digitalWrite(10,LOW); //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(0,1); mylcd.print("SWITCH: "); mylcd.setCursor(8,1); mylcd.print("OFF"); } }else { //預防馬達一直開著,如果土壤濕度不需要打水,馬達計數歸零 motor = 0; digitalWrite(10,LOW); //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(0,1); mylcd.print("SWITCH:"); mylcd.setCursor(8,1); mylcd.print("OFF"); } //開關控制-土壤濕度----------------------- } //網路沒手動打開時----------------------- //小於三代表連線成功 if (wifi_here < 3) { //delay_time_count每次加1,如果delay_time = 設定的秒數,將數據上網 //送參數 delay_time_count++; Serial.print("delay_time_count:"); Serial.println(delay_time_count); if (delay_time_count == delay_time) { //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(8,0); mylcd.print(" "); mylcd.setCursor(8,0); mylcd.print("UP data"); Serial.print("Connecting to"); //如果沒有連到這個網址 if (!esp_client.connect("iot.oceanbox.com.tw",80)) { Serial.println("connection failed"); //自動重抓wifi,如果連線後又中斷wifi,變數修正 wifi_here++; wifiget = 0; delay(3000); //return; //relink Serial.println("connection relink"); } //工作站 int workstation = 1; //送參數 //加入signback_zero //Serial.println("GET "+ PHP_PATH + "?sing1=" + value_a0 + "&sing2=" + Liquid_level + "&code=" + code + "&user=" + user + "&workstation=" + workstation + "&signback_zero=" + signback_zero + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); esp_client.print("GET "+ PHP_PATH + "?sing1=" + value_a0 + "&sing2=" + Liquid_level + "&sing3=" + h1 + "&sing4=" + t1 + "&code=" + code + "&user=" + user + "&workstation=" + workstation + "&signback_zero=" + signback_zero + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); //switch singback------------------------------------------- //帶signback_zero參數,送出後會將switch有關掉的寫回資料庫,寫入後,下面把signback_zero設為0 signback_zero = 0; //switch singback------------------------------------------- String web_get = clientDataReceive(); Serial.println(web_get); //web_get[0] //web_get[1] //web_get[2] //web_get[3] Serial.println("sotped esp_client"); //數據送出,計數歸零 delay_time_count = 0; //雨量預測 if (String(web_get[4]) == "0") { rainying = 0; } if (String(web_get[4]) == "1") { rainying = 1; digitalWrite(10, LOW); } Serial.print("web_get[4]-rainying:"); Serial.println(rainying); mylcd.setCursor(13,1); mylcd.print("R:"); mylcd.setCursor(15,1); mylcd.print(rainying); //開關一判斷 //如果狀態不同 if (String(io_mode0) != String(web_get[0])) { if (String(web_get[0]) == "1") { //開關一 //digitalWrite(10,HIGH); motor += 1; //加入防止馬達一直運作,跑了多少次迴圈自動關掉-------------- if (motor < 30) { digitalWrite(10, HIGH); }else{ digitalWrite(10, LOW); } //加入防止馬達一直運作--------------- Serial.println("switch 1 open"); //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(0,1); mylcd.print("SWITCH: "); mylcd.setCursor(8,1); //加入防止馬達一直運作--------------- //mylcd.print("ON "); mylcd.print(motor); //加入防止馬達一直運作--------------- delay(1000); } if (String(web_get[0]) == "0") { //預防馬達一直開著,如果土壤濕度不需要打水,馬達計數歸零 motor = 0; //開關一 D10 digitalWrite(10,LOW); Serial.println("switch 1 close"); //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(0,1); mylcd.print("SWITCH:"); mylcd.setCursor(8,1); mylcd.print("OFF"); } io_mode0 =String(web_get[0]); } //switch singback------------------------------------------- if (String(web_get[5]) == "1") { //5秒 signback = 5; } if (String(web_get[5]) == "2") { //10秒 signback = 10; } if (String(web_get[5]) == "3") { //30秒 signback = 30; } if (String(web_get[5]) == "4") { //60秒 signback = 60; } if (String(web_get[5]) == "5") { //300秒 signback = 300; } if (String(web_get[5]) == "6") { //600秒 signback = 600; } if (String(web_get[5]) == "7") { //1800秒 signback = 1800; } if (String(web_get[5]) == "8") { //3600秒 signback = 3600; } if (String(web_get[5]) == "9") { //7200秒 signback = 7200; } //如果開關1為開且跳回功能有開,跳回計數+loog的秒數-------------------------------- if (String(web_get[0]) == "1" && String(web_get[5]) != "0"){ //累加loog的秒數 switch_count1 += delay_time; Serial.println("switch_count1 and signback"); Serial.println(switch_count1); Serial.println(signback); //如果累積的秒數 > 開關跳回的秒數,則switch1關閉 if (switch_count1 > signback){ //開關一 D10 digitalWrite(10,LOW); switch_count1 = 0; signback = 0; signback_zero = 1; //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(0,1); mylcd.print("SWITCH:"); mylcd.setCursor(8,1); mylcd.print("OFF"); } } //如果開關1為開且跳回功能有開,跳回計數+loog的秒數-------------------------------- //switch singback------------------------------------------- //開關一判斷----------------------------------- //switch開關1~4 Serial.println(web_get[0]); Serial.println(web_get[1]); Serial.println(web_get[2]); Serial.println(web_get[3]); //分析頻率 Serial.println(web_get[4]); //switch開關跳回 Serial.println(web_get[5]); esp_client.stop(); Serial.println("closing connection"); Serial.println(web_get[4]); } } digitalWrite(13,LOW); delay(300); digitalWrite(13,HIGH); delay(300); digitalWrite(13,LOW); //同步顯示在LCD與LED //設定LCD要列印在第0個位置,第0列。 if (led_show_loop == 1) { mylcd.setCursor(0,0); mylcd.print("SM:"); mylcd.setCursor(3,0); mylcd.print(" "); mylcd.setCursor(3,0); mylcd.print(value_a0); } if (led_show_loop == 2) { //設定LCD要列印在第0個位置,第0列。 mylcd.setCursor(0, 0); mylcd.print("h1:"); mylcd.setCursor(3, 0); //mylcd.print(humd); mylcd.print(h1); mylcd.setCursor(8, 0); mylcd.print("t1:"); mylcd.setCursor(11, 0); mylcd.print(t1); led_show_loop = 0; delay(1000); } //等於三代表連線失敗 //如果沒有wifi---------------------------------- if (wifi_here == 3) { Serial.print("wifiget:"); Serial.println(wifiget); //自動重抓wifi,600 loop 600次約10分,重抓一次wifi-------------------------------------------- if (wifiget > 600) { wifiget = 0; wifi_here = 1; while (connect_status != WL_CONNECTED && wifi_here < 2) { Serial.println(F("Connect to router...")); connect_status = WiFi.begin(wifiacc,wifipas); wifi_here++; Serial.print("wifi_here"); Serial.println(wifi_here); } } //自動重抓wifi------------------------------------------------ } //如果沒有wifi---------------------------------- //Serial.print("wifi_here1:"); //Serial.println(wifi_here); delay(1000); //恢復馬達控制,跑到多少次迴圈後自動恢復正常 if (motor > 300) { motor = 0; if (value_sm_max > 450) { value_sm_max = value_sm_max-5; } } Serial.println(motor); //恢復馬達控制 //看門狗測試,如果秒數超過會重開機 wdt_reset(); // reset watch dog timer } ```` 加SD卡的程式碼 //30分鐘寫入一次,跑10次約1分鐘,30分鐘要跑300次 if (sd_write_loop >= 300) { sd_write_time += 1; //sd // make a string for assembling the data to log: String dataString = "N:"; dataString += value_n; dataString += ",P:"; dataString += value_p; dataString += ",K:"; dataString += value_k; dataString += " UNIT:mg/kg"; dataString += ",H1:"; //dataString += humd; dataString += h1; dataString += ",T1:"; //dataString += temp; dataString += t1; dataString += ",SM:"; dataString += value_a0; dataString += ",PH:"; dataString += value_ph; dataString += ",EC:"; dataString += value_ec; dataString += ",Liquid_level:"; dataString += Liquid_level; dataString += "--------"; dataString += sd_write_time; File dataFile = SD.open("record.txt", FILE_WRITE); //delay(1000); // if the file is available, write to it: if (dataFile) { dataFile.println(dataString); dataFile.close(); // print to the serial port too: Serial.println(dataString); delay(500); } --- 完整加入後的程式碼 ```` #include <Wire.h> #include "motoWiFiEsp.h" #include <SoftwareSerial.h> //看門狗測試,如果秒數超過會重開機 #include <avr/wdt.h> //lcd需要的涵數 #include <motoLiquidCrystal_I2C.h> #include <SD.h> const int chipSelect = 53; //設定暫存 char buffer [16]; char time [16]; //LiquidCrystal_I2C lcd(0x3F,20,4); // set the LCD address to 0x27 for a 20 chars and 4 line display LiquidCrystal_I2C mylcd(0x27,16,2); //使用WiFiClient會用到 #include <motoMQTTClient.h> long H_Threshold; String message; #include "motoDHT.h" //DHT 01 D9 #define DHTPIN1 9 // what pin we're connected to #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 DHT dht(DHTPIN1, DHTTYPE); //SoftwareSerial esp8266_Serial(3,2); #define esp8266_Serial Serial3 //mega2560 VS ESP8266 TX3(14 黃 8266_RX)、RX3(15 綠 8266_TX) VS TX、RX WiFiEspClient esp_client; int connect_status = WL_IDLE_STATUS; String ipAddressToString(const IPAddress& ipAddress ) { return String(ipAddress[0]) + String(".")+ String(ipAddress[1]) + String(".")+ String(ipAddress[2]) + String(".")+ String(ipAddress[3]); } String clientDataReceive( ) { String szMyData=""; int j=0; int arr_count = 0; while(1) { if (esp_client.available()) { char c = esp_client.read(); if (arr_count >= 179 && arr_count <= 184) { szMyData += c; } arr_count++; }else{ delay(10); j++; } if(j>100) break; } Serial.println(szMyData); return szMyData; } //網址 String host = "iot.oceanbox.com.tw"; String code = "9d90b4f4815e5e196770a3e9aed4b6f5"; String user = "jzs2home"; char wifiacc[] = "Xperia 10_4026"; char wifipas[] = "t5275520"; //String PHP_PATH = "/oceanduino/ledGet.php"; String PHP_PATH = "/oceanduino/ledGet202001.php"; void messageReceived(String topic, String payload, char * bytes, unsigned int length) { } //wifi判斷用 int wifi_here =0; //判斷水位用 int Liquid_level=0; //雨量預測 int rainying = 0; //預防馬達一直開著 int motor = 0; void setup() { //SETUP區---------------------------- //sd------------------------------------------------------------------ //while (!Serial) { //; // wait for serial port to connect. Needed for Leonardo only //} Serial.print("Initializing SD card..."); // make sure that the default chip select pin is set to // output, even if you don't use it: pinMode(53, OUTPUT); //10 for UNO, 53 for Mega2560 // see if the card is present and can be initialized: if (!SD.begin(chipSelect)) { Serial.println("Card failed, or not present"); // don't do anything more: return; } Serial.println("card initialized."); // open the file. note that only one file can be open at a time, // so you have to close this one before opening another. if (SD.exists("record.txt")) { Serial.println("record.txt exists."); } else { Serial.println("record.txt doesn't exist."); } // open a new file and immediately close it: Serial.println("Creating record.txt..."); File dataFile = SD.open("record.txt", FILE_WRITE); //數位輸出13支腳,LED pinMode(13, OUTPUT); Serial.begin(9600); //上網晶片序列 esp8266_Serial.begin(9600); //濕度感測 pinMode(A0, INPUT); //switch開關1 pinMode(10, OUTPUT); //水位傳感器 pinMode(5,INPUT); H_Threshold = 100; message = ""; //esp8266_Serial.listen(); WiFi.init(&esp8266_Serial); if(WiFi.status()==WL_NO_SHIELD) { Serial.println(F("Esp8266 module no present")); //關掉,不燃8266移除會一直TIMEOUT //while(true); } //如果沒連上網路,就會一直連線,直到wifi_here = 3。 //回傳WL_CONNECTED表已連上WiFi AP while(connect_status != WL_CONNECTED && wifi_here < 3) { //while(connect_status != WL_CONNECTED) { Serial.println(F("Connect to router...")); //連結WIFI網路,並將結果存在connect_status變數中 connect_status = WiFi.begin(wifiacc,wifipas); //連線一次,+1 (連第三次後 wifi_here = 3 wifi_here++; Serial.print("wifi_here"); Serial.println(wifi_here); } //小於三代表連線成功------------------------------------ Serial.println(WiFi.localIP()); //溫濕度 Serial.println("DHT22 01"); dht.begin(); //lcd mylcd.init(); mylcd.backlight(); //----------------------------------------------------------看門狗 wdt_enable(WDTO_8S); //當機8秒後重開機 // Valid delays: // WDTO_15MS // WDTO_30MS // WDTO_60MS // WDTO_120MS // WDTO_250MS // WDTO_500MS // WDTO_1S // WDTO_2S // WDTO_4S // WDTO_8S //------------------------------------------------------------- } //delay_time_count每次加1,如果delay_time = 設定的秒數,將數據上網 int delay_time = 3; int delay_time_count = 0; //預設io 0 的模式 String io_mode0 = "0"; //switch singback------------------------------------------- //swtich跳回計數1~4 int switch_count1 = 0; //swtich signback1 跳回值 int signback = 0; int signback_zero = 0; //switch singback------------------------------------------- //自動重抓wifi,變數 int wifiget = 0; int led_show_loop = 0; //土壤濕度最大值 int value_sm_max = 620; //LOOP外 //跑10次約1分鐘,30分鐘要跑300次 int sd_write_loop = 0; int sd_write_time = 0; void loop() { led_show_loop += 1; //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(8,0); mylcd.print(" "); //自動重抓wifi,變數加1 wifiget += 1; //變數宣告 int value_a0 = 1023 - analogRead(A0); //int value_a0 = analogRead(A0); Serial.print("土壤濕度:"); Serial.println(value_a0); Liquid_level=digitalRead(5); Serial.print("水位訊號:"); Serial.println(Liquid_level); //如果網路控制1沒有打開,就自動判斷 Serial.print("io_mode0 :"); Serial.println(String(io_mode0)); //溫濕度1 // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h1 = dht.readHumidity(); //讀取攝氏溫度 float t1 = dht.readTemperature(); //讀取華氏溫度 float f1 = dht.readTemperature(true); // check if returns are valid, if they are NaN (not a number) then something went wrong! if (isnan(t1) || isnan(h1)) { Serial.println("Failed to read from DHT"); } else { //濕度 Serial.print("Humidity: "); Serial.print(h1); Serial.print(" %\t"); //溫度 Serial.print("Temperature: "); Serial.print(t1); Serial.println(" *C"); } //網路沒手動打開時且雨量預測未達滿足點----------------------- if (String(io_mode0) == "0" && String(rainying) == "0") { //開關控制-土壤濕度,有插在土上才作動 //if (value_a0 > 20 && value_a0 < 450) { if (value_a0 > 10 && value_a0 < value_sm_max) { //判斷水位有水狀態才能打開 if (Liquid_level == 1) { motor += 1; //加入防止馬達一直運作,跑了多少次迴圈自動關掉--------------- if (motor < 30) { digitalWrite(10, HIGH); }else{ digitalWrite(10, LOW); } //加入防止馬達一直運作--------------- //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(0,1); mylcd.print("SWITCH: "); mylcd.setCursor(8,1); //mylcd.print("ON "); mylcd.print(motor); //加入防止馬達一直運作--------------- }else { digitalWrite(10,LOW); //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(0,1); mylcd.print("SWITCH: "); mylcd.setCursor(8,1); mylcd.print("OFF"); } }else { //預防馬達一直開著,如果土壤濕度不需要打水,馬達計數歸零 motor = 0; digitalWrite(10,LOW); //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(0,1); mylcd.print("SWITCH:"); mylcd.setCursor(8,1); mylcd.print("OFF"); } //開關控制-土壤濕度----------------------- } //網路沒手動打開時----------------------- //小於三代表連線成功 if (wifi_here < 3) { //delay_time_count每次加1,如果delay_time = 設定的秒數,將數據上網 //送參數 delay_time_count++; Serial.print("delay_time_count:"); Serial.println(delay_time_count); if (delay_time_count == delay_time) { //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(8,0); mylcd.print(" "); mylcd.setCursor(8,0); mylcd.print("UP data"); Serial.print("Connecting to"); //如果沒有連到這個網址 if (!esp_client.connect("iot.oceanbox.com.tw",80)) { Serial.println("connection failed"); //自動重抓wifi,如果連線後又中斷wifi,變數修正 wifi_here++; wifiget = 0; delay(3000); //return; //relink Serial.println("connection relink"); } //工作站 int workstation = 1; //送參數 //加入signback_zero //Serial.println("GET "+ PHP_PATH + "?sing1=" + value_a0 + "&sing2=" + Liquid_level + "&code=" + code + "&user=" + user + "&workstation=" + workstation + "&signback_zero=" + signback_zero + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); esp_client.print("GET "+ PHP_PATH + "?sing1=" + value_a0 + "&sing2=" + Liquid_level + "&sing3=" + h1 + "&sing4=" + t1 + "&code=" + code + "&user=" + user + "&workstation=" + workstation + "&signback_zero=" + signback_zero + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"); //switch singback------------------------------------------- //帶signback_zero參數,送出後會將switch有關掉的寫回資料庫,寫入後,下面把signback_zero設為0 signback_zero = 0; //switch singback------------------------------------------- String web_get = clientDataReceive(); Serial.println(web_get); //web_get[0] //web_get[1] //web_get[2] //web_get[3] Serial.println("sotped esp_client"); //數據送出,計數歸零 delay_time_count = 0; //雨量預測 if (String(web_get[4]) == "0") { rainying = 0; } if (String(web_get[4]) == "1") { rainying = 1; digitalWrite(10, LOW); } Serial.print("web_get[4]-rainying:"); Serial.println(rainying); mylcd.setCursor(13,1); mylcd.print("R:"); mylcd.setCursor(15,1); mylcd.print(rainying); //開關一判斷 //如果狀態不同 if (String(io_mode0) != String(web_get[0])) { if (String(web_get[0]) == "1") { //開關一 //digitalWrite(10,HIGH); motor += 1; //加入防止馬達一直運作,跑了多少次迴圈自動關掉-------------- if (motor < 30) { digitalWrite(10, HIGH); }else{ digitalWrite(10, LOW); } //加入防止馬達一直運作--------------- Serial.println("switch 1 open"); //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(0,1); mylcd.print("SWITCH: "); mylcd.setCursor(8,1); //加入防止馬達一直運作--------------- //mylcd.print("ON "); mylcd.print(motor); //加入防止馬達一直運作--------------- delay(1000); } if (String(web_get[0]) == "0") { //預防馬達一直開著,如果土壤濕度不需要打水,馬達計數歸零 motor = 0; //開關一 D10 digitalWrite(10,LOW); Serial.println("switch 1 close"); //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(0,1); mylcd.print("SWITCH:"); mylcd.setCursor(8,1); mylcd.print("OFF"); } io_mode0 =String(web_get[0]); } //switch singback------------------------------------------- if (String(web_get[5]) == "1") { //5秒 signback = 5; } if (String(web_get[5]) == "2") { //10秒 signback = 10; } if (String(web_get[5]) == "3") { //30秒 signback = 30; } if (String(web_get[5]) == "4") { //60秒 signback = 60; } if (String(web_get[5]) == "5") { //300秒 signback = 300; } if (String(web_get[5]) == "6") { //600秒 signback = 600; } if (String(web_get[5]) == "7") { //1800秒 signback = 1800; } if (String(web_get[5]) == "8") { //3600秒 signback = 3600; } if (String(web_get[5]) == "9") { //7200秒 signback = 7200; } //如果開關1為開且跳回功能有開,跳回計數+loog的秒數-------------------------------- if (String(web_get[0]) == "1" && String(web_get[5]) != "0"){ //累加loog的秒數 switch_count1 += delay_time; Serial.println("switch_count1 and signback"); Serial.println(switch_count1); Serial.println(signback); //如果累積的秒數 > 開關跳回的秒數,則switch1關閉 if (switch_count1 > signback){ //開關一 D10 digitalWrite(10,LOW); switch_count1 = 0; signback = 0; signback_zero = 1; //設定LCD要列印在第0個位置,第一列。 mylcd.setCursor(0,1); mylcd.print("SWITCH:"); mylcd.setCursor(8,1); mylcd.print("OFF"); } } //如果開關1為開且跳回功能有開,跳回計數+loog的秒數-------------------------------- //switch singback------------------------------------------- //開關一判斷----------------------------------- //switch開關1~4 Serial.println(web_get[0]); Serial.println(web_get[1]); Serial.println(web_get[2]); Serial.println(web_get[3]); //分析頻率 Serial.println(web_get[4]); //switch開關跳回 Serial.println(web_get[5]); esp_client.stop(); Serial.println("closing connection"); Serial.println(web_get[4]); } } digitalWrite(13,LOW); delay(300); digitalWrite(13,HIGH); delay(300); digitalWrite(13,LOW); //同步顯示在LCD與LED //設定LCD要列印在第0個位置,第0列。 if (led_show_loop == 1) { mylcd.setCursor(0,0); mylcd.print("SM:"); mylcd.setCursor(3,0); mylcd.print(" "); mylcd.setCursor(3,0); mylcd.print(value_a0); } if (led_show_loop == 2) { //設定LCD要列印在第0個位置,第0列。 mylcd.setCursor(0, 0); mylcd.print("h1:"); mylcd.setCursor(3, 0); //mylcd.print(humd); mylcd.print(h1); mylcd.setCursor(8, 0); mylcd.print("t1:"); mylcd.setCursor(11, 0); mylcd.print(t1); led_show_loop = 0; delay(1000); } //等於三代表連線失敗 //如果沒有wifi---------------------------------- if (wifi_here == 3) { Serial.print("wifiget:"); Serial.println(wifiget); //自動重抓wifi,600 loop 600次約10分,重抓一次wifi-------------------------------------------- if (wifiget > 600) { wifiget = 0; wifi_here = 1; while (connect_status != WL_CONNECTED && wifi_here < 2) { Serial.println(F("Connect to router...")); connect_status = WiFi.begin(wifiacc,wifipas); wifi_here++; Serial.print("wifi_here"); Serial.println(wifi_here); } } //自動重抓wifi------------------------------------------------ } //如果沒有wifi---------------------------------- //Serial.print("wifi_here1:"); //Serial.println(wifi_here); delay(1000); //恢復馬達控制,跑到多少次迴圈後自動恢復正常 if (motor > 300) { motor = 0; if (value_sm_max > 450) { value_sm_max = value_sm_max-5; } } Serial.println(motor); //恢復馬達控制 //看門狗測試,如果秒數超過會重開機 wdt_reset(); // reset watch dog timer //變數宣告 sd_write_loop += 1; //30分鐘寫入一次,跑10次約1分鐘,30分鐘要跑300次 if (sd_write_loop >= 300) { sd_write_time += 1; //sd // make a string for assembling the data to log: String dataString = "H1:"; //dataString += humd; dataString += h1; dataString += ",T1:"; //dataString += temp; dataString += t1; dataString += ",SM:"; dataString += value_a0; dataString += ",Liquid_level:"; dataString += Liquid_level; dataString += "--------"; dataString += sd_write_time; File dataFile = SD.open("record.txt", FILE_WRITE); //delay(1000); // if the file is available, write to it: if (dataFile) { dataFile.println(dataString); dataFile.close(); // print to the serial port too: Serial.println(dataString); delay(500); } // if the file isn't open, pop up an error: else { Serial.println("error opening record.txt"); } sd_write_loop = 0; } } ```` ![](https://i.imgur.com/AsmoZ2m.png) ![](https://i.imgur.com/7SyU52S.png) ![](https://i.imgur.com/MxRUQSl.png) ![](https://i.imgur.com/zYpCnbO.png) ![](https://i.imgur.com/0oghPlu.jpg) ![](https://i.imgur.com/vfUCJRH.png) ![](https://i.imgur.com/D7Qpcja.png) ![](https://i.imgur.com/RkVb39f.png) ![](https://i.imgur.com/O4zGI8l.jpg) ![](https://i.imgur.com/gKLho3r.jpg) ![](https://i.imgur.com/zwwuc3z.jpg) ![](https://i.imgur.com/3BzbFEI.jpg) ![](https://i.imgur.com/8qOwOoB.jpg) ![](https://i.imgur.com/LBKjqRG.jpg) ![](https://i.imgur.com/f2WHqeZ.jpg) ![](https://i.imgur.com/Bjwg2cy.jpg) ![](https://i.imgur.com/LBOfspC.jpg) ![](https://i.imgur.com/LBr01Wj.jpg) ![Uploading file..._gprmq77y5]() ![](https://i.imgur.com/ZC6BoX2.jpg) ![](https://i.imgur.com/9Hkvv2T.jpg) ![](https://i.imgur.com/eLF6kgy.jpg) ![](https://i.imgur.com/nxZZa3U.png) ![](https://i.imgur.com/IvhUk1H.png) --- https://web.oceanbox.com.tw/member-edit.php https://web.oceanbox.com.tw/iot_list-9d90b4f4815e5e196770a3e9aed4b6f5-jzs2home-1.html