เชื่อมต่อ blynk ซักพักจะหลุด

ผมใช้บอร์ด Lamloei Node32 Lite แล้วก็ใช้ blynk มีต่อ LDR, DHT22, Switch, LED ใช้ไปซักพักจะมี log
[E][WiFiClient.cpp:433] available(): fail on fd 56, errno: 11, “No more processes” ขึ้นมาหลังจากนั้นจะเชื่อมต่อกับ Blynk Server ไม่ได้อีกเลยต้องรีบูท

เขียนโค้ตแบบไหนครับขอดูหน่อย

ผมเอาโค้ดมาจากโปรเจ็คนี้ https://medium.com/@visitwnk/ใส่ใจ-8-การพัฒนาโปรแกรมควบคุมใส่ใจด้วย-esp32-ตอนที่-1-ad6407ba96b แต่ตัดแปลงบางส่วนครับ

// *** (1) LIBRARY INCLUDE ***

//ไลบรารี่เกี่ยวกับ WIFI
#include <Arduino.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>

//ไลบรารี่ของ BLYNK
#include <BlynkSimpleEsp32.h>

//ไลบรารี่ของเซ็นเซอร์ dht22
#include <SimpleDHT.h>

//ไลบรารี่ Firebase สำหรับ ESP32
#include <time.h>

// PubSubClient
#include <PubSubClient.h>

// ArduinoJson
#include <ArduinoJson.h>

// *** (2) SYSTEM CONFIGURATION ***//WIFI CONFIG
char ssid[] = "xxx";
char pass[] = "xxxx";

//BLYNK TOKEN
char auth[] = "xxxxx";
char server[] = "blynk.iot-cm.com";
unsigned int port = 8080;

//LINE TOKEN
#define TokenLine "xxxx"

// MQTT config

const char* mqtt_server = "m16.cloudmqtt.com";
const int mqtt_port = xxxx;
const char* mqtt_user = "xxx";
const char* mqtt_password = "xxx";

WiFiClient espClient;
PubSubClient client(espClient);

// Json 

DynamicJsonDocument doc(256);

//FIREBASE CONFIG
//#define FIREBASE_HOST "smartfarmingxx.firebaseio.com"
//#define FIREBASE_AUTH "xxx"

/* ---------------------------------------------------------------*/

// *** WATERING CONFIG ***

//ค่าเปอร์เซ็นต์ความชื้นในดินที่ต้องการให้เร่ิมรดน้ำต้นไม้
#define PercentWatering 40

//ตั้งระยะเวลาการรดน้ำต้นไม้แต่ละครั้ง
//15000 = 15 วินาที
#define TimeWatering 15000

//ตั้งระยะห่างของเวลาที่ต้องการเช็คความชื้นในดิน
//60000 = 6 นาที
#define TimeSoilCheck 360000

/* ---------------------------------------------------------------*/
// *** TIMER CONFIG ***
//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER ทุกๆ 2 นาที
//120 Secounds = 120000 Milliseconds
#define sendSensorTime 120000

//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER ทุกๆ 3 นาที
//180 Secound = 180000 Milliseconds
#define sendSensor2Time 180000

//ตั้งเวลาให้เช็คว่า Blynk เชื่อมต่ออยู่หรือไม่ทุกๆ 10 วินาที
#define checkConnectionTime 10000

//ส่งข้อมูลเข้า firebase ทุกๆ 5 นาที
//#define sendFirebaseTime 300000

//ส่งข้อมูลเข้า MQTT ทุกๆ 5 นาที
#define sendMQTTTime 300000

// *** (3) ประกาศ function *** //

void callback(char* topic, byte* payload, unsigned int length);
void sendSensor() ;
void sendSensor2();
void sendMQTT();
void CheckConnection();
void NotifyLine(String t);
String NowString();
void Getdht22(int *dht);
int WifiPercentSignal();
int LdrPercentValue();
//void Task1(void *p);
void Task2(void *p);
void Task3(void *p);
void Task4(void *p);
void Task6(void *p);

// *** (4) GPIO PIN SETUP ***

//กำหนดให้เซ็นเซอร์ dht22 ใช้ขา GPIO ที่ 32
#define DHTPin 32

//กำหนดให้เซ็นเซอร์วัดความชื้นในดิน ใช้ขา GPIO ที่ 34
//#define SoilSensorPin 34

//กำหนดให้เซ็นเซอร์วัดความเข้มของแสง ใช้ขา GPIO ที่ 34
// Node32lite
//#define LdrSensorPin 34
// Lolin D32
#define LdrSensorPin 34

//กำหนดให้สวิตซ์ปุ่มกด ใช้ขา GPIO ที่ 25
#define SwitchPin 25

//กำหนดให้หลอดไฟ LED แสดงสถานะการส่งข้อมูล blynk server ใช้ขา GPIO ที่ 26
#define LEDSensorPin 26

//กำหนดให้ขาอ้างอิงการสั่งรดน้ำต้นไม้ ใช้ขา GPIO ที่ 27
#define WateringPin 27

//กำหนดให้หลอดไฟ LED บนบอร์ดแสดงสถานะ WIFI ใช้ขา GPIO ที่ 2
#define LEDWiFiPin 2

//กำหนดขาอ้างอิงการรดน้ำต้นไม้ ใช้ขา GPIO ที่ 14
#define LEDWateringPin 17

//กำหนดหให้ขาควบคุม Relay ใช้ขา GPIO ที่ 5
#define RelayPin 16

// *** (5) BLYNK PARAMETER SETUP ***//ตั้งค่าตัวแปรระบบของ BLYNK
//#define BLYNK_TIMEOUT_MS  750
//#define BLYNK_HEARTBEAT   17
#define BLYNK_PRINT Serial

//การกำหนดขา Vitual Pin ที่สร้างขึ้นให้กับ Widget ต่างๆ ใน Blynk Mobile APP
#define Widget_Humidity V1
#define Widget_Temperature V2
#define Widget_SoilRawValue V3
#define Widget_SoilLevel V4
#define Widget_LightRawValue V5
#define Widget_LightLevel V6
#define Widget_WateringButton V7
#define Widget_SendSensorStatus V8
#define Widget_WateringStatus V9
#define Widget_WifiSignal V10
#define Widget_WifiRawValue V11
#define Widget_Terminal V12
WidgetLED LEDSensor(Widget_SendSensorStatus);
WidgetLED LEDWatering(Widget_WateringStatus);
WidgetTerminal terminal(Widget_Terminal);


// *** (6) NTP SERVER SETUP ***
char ntp_server1[20] = "time.navy.mi.th";
char ntp_server2[20] = "clock.nectec.or.th";
char ntp_server3[20] = "th.pool.ntp.org";

// *** (7) GENAREL SETUP ***//ระบุรุ่นเซ็นเซอร์วัดความชื้นสัมพัทธ์และอุณมหภูมิเป็นรุ่น dht22
SimpleDHT22 dht22;

//เรียกใช้การตั้งเวลาของ Blynk
BlynkTimer timer;

//กำหนดตัวแปรเริ่มต้น
int WifiSignal;
bool isFirstConnect = true;
byte oldtemperature;
byte oldhumidity;
int CurrentSoilValue;
int MapReadSoilValue;
int CurrentWiFiSignal;
int MapReadLightValue;
int CurrentLightValue;
int dhtdata[2];
bool PumpStat = false;

// The ESP32 has an internal blue LED at D2 (GPIO 02)
// กำหนด LED_BUILTIN GPIO 02
//int LED_BUILTIN = 2;

// *** (8) BLYNK CONNECTED FUNCTION ***

BLYNK_CONNECTED() {
	//ให้หลอดไฟ LED บนบอร์ดสีน้ำเงินติดเพื่อเป็นการแสดงสถานะว่าการเชื่อมต่อเสร็จสมบูรณ์
	digitalWrite(LEDWiFiPin, HIGH);
  
  	//ถ้าเป็นการเชื่อมต่อ Blynk Server ครั้งแรกหลังบอร์ดรีบูต
  	if(isFirstConnect) {   
		//ให้ซิงค์ข้อมูลทั้งหมดล่าสุดจาก Blynk Server
		Blynk.syncAll();   
		//ให้ซิงค์สถานะของขา Virtual V7
		Blynk.syncVirtual(Widget_WateringButton);   
		isFirstConnect = false; 
  	}
}

// *** (9) BLYNK BUTTON FUNCTION ***

BLYNK_WRITE(Widget_WateringButton) { 
  	//ค่าที่ได้จาก Widget_WateringButton (V7) จะเป็น 0 และ 1 ถ้ามีการปดปุ่ม
	if (param.asInt() == 1) {   
		//ป้องกันไม่ให้กดซ้ำ
			if (digitalRead(WateringPin) != LOW && PumpStat == false) {      
				//เรียกใช้ฟังก์ชันรดน้ำ
				digitalWrite(WateringPin, LOW);   
			} //if
	} //if
	else {
		digitalWrite(WateringPin, HIGH);  
	}
}


// *** (10) FUNCTION SETUP() ***
void setup() {
	//เรียกใช้งาน Serial Monitor
	Serial.begin(115200);
	
	/* -------------------------------------------------------------- */
	//กำหนดโหมดใช้งานให้กำขา GPIO
	pinMode(LEDWiFiPin, OUTPUT);
	pinMode(LEDSensorPin, OUTPUT);
	pinMode(LEDWateringPin, OUTPUT);
	pinMode(WateringPin, OUTPUT);
	pinMode(RelayPin, OUTPUT);
	pinMode(SwitchPin, INPUT_PULLUP);
	
	/* -------------------------------------------------------------- */
	//ตั้งสถานะเริ่มต้นให้กับขา GPIO เพื่อป้องกันการทำงานเองตอนที่บอร์ด ESP32 รีบูต
	digitalWrite(LEDWiFiPin, LOW);
	digitalWrite(LEDSensorPin, LOW);
	digitalWrite(LEDWateringPin, LOW);
	digitalWrite(LEDWateringPin, LOW);
	digitalWrite(RelayPin, HIGH);
	Serial.println("Setting IO Done.");

	/* -------------------------------------------------------------- */
	// สร้างมัลติทาสก์ขึ้นมาใช้งานอย่างอิสระจำนวน 5 ทาสก์
	//TASK1: ลูปเช็คค่าความชื้นดิน ถ้าต่ำกว่าที่กำหนดให้เริ่มการรดน้ำต้นไม้
	//xTaskCreate(&Task1, "Task1",  2000, NULL, 9, NULL);
	
	//TASK2: ลูปอ่านค่าการกดปุ่มสวิตซ์ ถ้ามีการกดปุ่มสวิตซ์ให้เริ่มการรดน้ำต้นไม้
	xTaskCreate(&Task2, "Task2", 1000, NULL, 9, NULL);
	
	//TASK3: ลูปให้หลอดไฟ LED กระพริบ ถ้ามีการรดน้ำต้นไม้
	xTaskCreate(&Task3, "Task3", 3000, NULL, 8, NULL);
	
	//TASK4: ลูปเช็คการเชื่อมต่อ WiFi และให้เชื่อมต่อใหม่เองแบบอัตโนมัติ
	xTaskCreate(&Task4, "Task4", 3000, NULL, 10, NULL);
	
	//TASK5: รดน้ำต้นไม้ตามเวลาที่กำหนด
	//xTaskCreate(&Task5, "Task5", 3000, NULL, 9, NULL);

	//TASK6: ลูปเช็คการเชื่อมต่อ MQTT
	xTaskCreate(&Task6, "Task6", 3000, NULL, 10, NULL);

	/* -------------------------------------------------------------- */
	//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER
	timer.setInterval(sendSensorTime, sendSensor);
	
	//ตั้งเวลาส่งข้อมูลให้ BLYNK SERVER
	timer.setInterval(sendSensor2Time, sendSensor2);
	
	//ตั้งเวลาให้เช็คว่า Blynk เชื่อมต่ออยู่หรือไม่
	timer.setInterval(checkConnectionTime, CheckConnection);
	
	//ตั้งเวลาส่งข้อมูลเข้า Google Firebase
	//timer.setInterval(sendFirebaseTime, sendFirebase);

	//ตั้งเวลาส่งข้อมูลเข้า MQTT
	timer.setInterval(sendMQTTTime, sendMQTT);
	
	/* -------------------------------------------------------------- */
	//ทำการเชื่อมต่อ Google Firebase
	//Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
	
	/* -------------------------------------------------------------- */
	
	//ทำการเชื่อมต่อ WiFi
	//Blynk.connectWiFi(ssid, pass);
	Blynk.connectWiFi(ssid, pass);
	//Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080);   

	/* -------------------------------------------------------------- */
	//แสดงข้อความใน Serial Monitor
	Serial.println();
	Serial.println("Welcom to smartfram IoT");
	Serial.print("WiFi Connected: ");
	Serial.println(WiFi.localIP());
	Serial.print("WiFi signal RSSI: ");
	Serial.print(WiFi.RSSI());
	Serial.println("dBm");
	
	/* -------------------------------------------------------------- */
	//ดึงเวลาจากอินเตอร์เน็ตจาก NTP Time Server
	configTime(7 * 3600, 0, ntp_server1, ntp_server2, ntp_server3);
	
	//แสดงข้อความใน Serial Monitor
	Serial.println("Waiting for time.");while (!time(nullptr)) {Serial.print(".");
	vTaskDelay(100 / portTICK_PERIOD_MS);}
	
	//แสดงข้อความใน Serial Monitor
	Serial.println();
	Serial.println("Current time: " + NowString());

	// mqtt connect
	client.setServer(mqtt_server, mqtt_port);
  	client.setCallback(callback);
	
	/* -------------------------------------------------------------- */
	//ทำการเชื่อมต่อ BLYNK SERVER
	Blynk.config(auth, server, port);
	Blynk.connect();
	/* -------------------------------------------------------------- */
}

// *** (11) FUNCTION LOOP() ***
void loop() {
	Blynk.run();
	timer.run();
	client.loop();
}

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  String msg = "";
  int i=0;
  while (i<length) msg += (char)payload[i++];
  if (msg == "GET") {
		Getdht22(dhtdata);
		//อัพเดทข้อมูลให้ MQTT ในรูปแบบ JSON
		StaticJsonDocument<200> jsonBuffer;
		JsonObject root = jsonBuffer.to<JsonObject>();
		root["temperature"] = dhtdata[1];
		root["humidity"] = dhtdata[0];
		root["time"] = NowString();
		root["ldr"] = LdrPercentValue();
		//root["soil"] = SoilPercentValue();
		root["wifi"] = WifiPercentSignal();
		
		// ส่งข้อมูลใหม่เป็นเก็บใน Firebase /
		char StrData[85] = "";
		serializeJson(root, StrData);
		//SmartFarmString name = Firebase.push("SmartFarm", root);
		client.publish("/Farm/LED", (StrData));
		Serial.println(StrData);
    return;
  }
  //deserializeJson(doc, msg);
  //int led1 = doc["LED1"];
  //int led2 = doc["LED2"];
  
  //digitalWrite(LED_PIN1, (led1 == 1 ? HIGH : LOW));
  //digitalWrite(LED_PIN2, (led2 == 1 ? HIGH : LOW));
  Serial.println(msg);
}

// *** (12) FUNCTION SENDSENSOR() ***

void sendSensor() {
	//ให้หลอดไฟ LED ติด
	digitalWrite(LEDWiFiPin, HIGH);
	
	//ให้หลอดไฟ LED บน BLYNK MOBILE APP ติด
	LEDSensor.on();
	
	//แสดงข้อความใน Serial Monitor
	Serial.print(NowString());
	Serial.println(", Send data to blynk server");
	
	/* -------------------------------------------------------------- */
	
	//อ่านข้อมูลเซ็นเซอร์ dht22
	Getdht22(dhtdata);
	Blynk.virtualWrite(Widget_Humidity, dhtdata[0]);
	Blynk.virtualWrite(Widget_Temperature, dhtdata[1]);
	//Blynk.virtualWrite(Widget_SoilRawValue, analogRead(SoilSensorPin));
	//Blynk.virtualWrite(Widget_SoilLevel, SoilPercentValue());
	
	/* -------------------------------------------------------------- */
	//แสดงข้อความใน Serial Monitor
	Serial.print(NowString());
	Serial.println(", Send dht22 / Soil sensors to blynk server.");
	
	/* -------------------------------------------------------------- */
	
	//ให้หลอด LED ที่แสดงสถานะดับ
	digitalWrite(LEDWiFiPin, LOW);
	
	//ให้หลอดไฟ LED บน BLYNK MOBILE APP ดับ
	LEDSensor.off();
}


// *** (13) FUNCTION SENDSENSOR2() ***
void sendSensor2() {
	//ให้หลอดไฟ LED ติด
	digitalWrite(LEDWiFiPin, HIGH);
	
	//ให้หลอดไฟ LED บน BLYNK MOBILE APP ติด
	LEDSensor.on();
	
	//แสดงข้อความใน Serial Monitor
	Serial.print(NowString());
	Serial.println(", Send data to blynk server");
	
	/* -------------------------------------------------------------- */
	//แสดงข้อความใน Serial Monitor
	Serial.print(NowString());
	Serial.print(", Wifi Signal: ");
	Serial.print(WifiPercentSignal());
	Serial.println("%");
	
	/* -------------------------------------------------------------- */
	//อัพเดทข้อมูลไปยัง Blynk server
	Blynk.virtualWrite(Widget_LightRawValue, analogRead(LdrSensorPin));
	Blynk.virtualWrite(Widget_LightLevel, LdrPercentValue());
	Blynk.virtualWrite(Widget_WifiSignal, WifiPercentSignal());
	Blynk.virtualWrite(Widget_WifiRawValue, WiFi.RSSI());
	
	/* -------------------------------------------------------------- */
	//แสดงข้อความใน Serial Monitor
	Serial.print(NowString());
	Serial.println(", Send LDR sensors / WIFI to blynk server.");
	
	/* -------------------------------------------------------------- */
	//ให้หลอด LED ที่แสดงสถานะดับ
	digitalWrite(LEDWiFiPin, LOW);
	
	//ให้หลอด LED บน app Blynk ดับ
	LEDSensor.off();
}

// *** (14) FUNCTION SENDFIREBASE() ***
/*
void sendFirebase() {
  
	//อัพเดทข้อมูลไปยัง BLYNK SERVER
	Getdht22(dhtdata);
	//อัพเดทข้อมูลให้ Firebase ในรูปแบบ JSON
	StaticJsonBuffer<200> jsonBuffer;
	JsonObject& root = jsonBuffer.createObject();
	root["temperature"] = dhtdata[1];
	root["humidity"] = dhtdata[0];
	root["time"] = NowString();
	root["ldr"] = LdrPercentValue();
	root["soil"] = SoilPercentValue();
	root["wifi"] = WifiPercentSignal();
	
	// ส่งข้อมูลใหม่เป็นเก็บใน Firebase /
	
	SmartFarmString name = Firebase.push("SmartFarm", root);
	
	// ถ้ามี error
	if(Firebase.failed()) {
		//แสดงข้อความบนคอนโซล
		Serial.print(NowString());
		Serial.print(", Firebase pushing /SmartFarm failed:");
		Serial.println(Firebase.error());
		return;
	}
		//แสดงข้อความบนคอนโซล
		Serial.print(NowString());
		Serial.println(", Firebase connected.");
		Serial.print(NowString());
		Serial.print(", Firebase pushed: /SmartFarm/");
		Serial.println(name);
}
*/

void sendMQTT() {
  
	//อัพเดทข้อมูลไปยัง BLYNK SERVER
	Getdht22(dhtdata);
	//อัพเดทข้อมูลให้ MQTT ในรูปแบบ JSON
	StaticJsonDocument<200> jsonBuffer;
	JsonObject root = jsonBuffer.to<JsonObject>();
	root["temperature"] = dhtdata[1];
	root["humidity"] = dhtdata[0];
	root["time"] = NowString();
	root["ldr"] = LdrPercentValue();
	//root["soil"] = SoilPercentValue();
	root["wifi"] = WifiPercentSignal();
	
	// ส่งข้อมูลใหม่เป็นเก็บใน Firebase /
	char StrData[85] = "";
	serializeJson(root, StrData);
	//SmartFarmString name = Firebase.push("SmartFarm", root);
	client.publish("/Farm/LED", ("Test"));
	// ถ้ามี error
	/*
	if(Firebase.failed()) {
		//แสดงข้อความบนคอนโซล
		Serial.print(NowString());
		Serial.print(", Firebase pushing /SmartFarm failed:");
		Serial.println(Firebase.error());
		return;
	}*/
		//แสดงข้อความบนคอนโซล
		Serial.println(StrData);
		Serial.print(NowString());
		Serial.println(", MQTT connected.");
		Serial.print(NowString());
		Serial.println(", MQTT pushed: /Farm/LED");
		//Serial.println(name);
}

// *** (15) CHECK CONNECTION ***
//เช็คการเชือมต่อของ blynk
void CheckConnection(){  
	//ถ้าไม่สามารถ connect ไปยัง blynk server ได้
	if(!Blynk.connected()){    
		//แสดงข้อความบนคอนโซล
		Serial.println("Not connected to Blynk server.");
		Serial.println("Connecting to Blynk server...");    
		Blynk.connect();  
		// try to connect to server  
	}
}

// *** (16) SEND LINENOTIFY ***

void NotifyLine(String t) {
	WiFiClientSecure client;  
	if(!client.connect("notify-api.line.me", 443)) {
		Serial.println("Connection failed");    
		return;
	}
	String req = "";
	req += "POST /api/notify HTTP/1.1\r\n";
	req += "Host: notify-api.line.me\r\n";
	req += "Authorization: Bearer " + String(TokenLine) + "\r\n";
	req += "Cache-Control: no-cache\r\n";
	req += "User-Agent: ESP32\r\n";
	req += "Content-Type: application/x-www-form-urlencoded\r\n";
	req += "Content-Length: " + String(String("message=" + t).length()) + "\r\n";
	req += "\r\n";
	req += "message=" + t;Serial.println(req);
	client.print(req);vTaskDelay(20 / portTICK_PERIOD_MS);
	Serial.println("-------------"); 
	while(client.connected()) {  
		String line = client.readStringUntil('\n');  
		if(line == "\r") {    
		break;
		}
	}
}


// *** (17) CURRENT DATETIME ***
String NowString() {
	int getcount = 1;
	time_t now = time(nullptr);
	struct tm* newtime = localtime(&now);
	String myyear = String(newtime->tm_year + 1900);  
	
	//ถ้าปียังเป็นปี 1970 ให้ดึงค่าเวลาใหม่ พยายามสูงสุด 4 ครั้ง
	while(myyear == "1970" && getcount <= 4) {    
		time_t now = time(nullptr);
		struct tm* newtime = localtime(&now);
		myyear = String(newtime->tm_year + 1900);   
		vTaskDelay(100 / portTICK_PERIOD_MS);    
		getcount++;
	}
	String tmpTime = "";
	String tmpNow = "";
	tmpNow += String(newtime->tm_year + 1900);
	tmpNow += "-";
	if(newtime->tm_mon < 10) tmpNow += "0";
	tmpNow += String(newtime->tm_mon + 1);
	tmpNow += "-";
	if(newtime->tm_mday < 10) tmpNow += "0";
	tmpNow += String(newtime->tm_mday);
	tmpNow += " ";

	if(newtime->tm_hour < 10) tmpNow += "0";
	tmpNow += String(newtime->tm_hour);
	tmpNow += ":";
	if(newtime->tm_min < 10) tmpNow += "0";
	tmpNow += String(newtime->tm_min);
	tmpNow += ":";
	if(newtime->tm_sec < 10) tmpNow += "0";
	tmpNow += String(newtime->tm_sec);
	return tmpNow;
}

// *** (18) FUNCTION Getdht22 ***

void Getdht22(int *dht) {
	//กำหนดค่าตัวแปรอุณหภูมิ
	byte temperature = 0;
	
	//กำหนดค่าความชื้นสัมสัทธ์
	byte humidity = 0;int count = 1;
	
	//อ่านค่าจากเซ็นเซอร์ dht22
	dht22.read(DHTPin, &temperature, &humidity, NULL);
	
	//ถ้าค่าอุณหภูมิ = 0 ให้อ่านค่าจากเซ็นเซอร์ใหม่ 4 ครั้ง
	while(temperature == 0 && count <= 4) {  
		//แสดงข้อความใน Serial Monitor
		Serial.print(NowString());
		Serial.println(", dht22 get failed ");
		Serial.print(count);  
		
		//อ่านค่าจากเซ็นเซอร์ dht22
		dht22.read(DHTPin, &temperature, &humidity, NULL);  
		vTaskDelay(1500/ portTICK_PERIOD_MS);  
		
		//ส่งข้อความให้ line notify แจ้งเตือน
		if(count == 4) NotifyLine("dht22 get failed 4 times.");  
		
		count++;
	}
	//นำข้อมูล temperature & humidity ครั้งที่ผ่านมาแสดง
	if(temperature == 0) temperature = oldtemperature;
	if(humidity == 0) humidity = oldhumidity;
	
	//แสดงข้อความใน Serial Monitor
	Serial.print(NowString());
	Serial.print(", Humidity: ");
	Serial.print(humidity);
	Serial.print("% | ");
	Serial.print("Temperature: ");
	Serial.print(temperature);
	Serial.println("C");
	
	//เก็บสำรองข้อมูล temperature & humidity
	oldtemperature = temperature;
	oldhumidity = humidity;
	
	dht[0] = humidity;
	dht[1] = temperature;
}

// *** (19) FUNCTION WifiPercentSignal ***
int WifiPercentSignal() {
	//หาค่าสัญญาณ RSSI ของ WIFI แล้ว MAP ให้อยู่ในรูปของเปอร์เซ็นต์
	CurrentWiFiSignal = WiFi.RSSI();
	
	if(CurrentWiFiSignal > -40) CurrentWiFiSignal = -40;
	if(CurrentWiFiSignal < -90) CurrentWiFiSignal = -90;
	
	WifiSignal = map(CurrentWiFiSignal, -90, -40, 0, 100);
	
	return WifiSignal;
}

// *** (20) FUNCTION SoilPercentValue ***
/*
int SoilPercentValue() {
	//อ่านค่าจากเซ็นเซอร์อนาล๊อก Soil Sensor
	CurrentSoilValue = analogRead(SoilSensorPin);
	
	//กำหนดค่าต่ำสุดและสูงสุดของเซ็นเซอร์ที่อ่านได้
	if(CurrentSoilValue > 4000) CurrentSoilValue = 4000;
	if(CurrentSoilValue < 800) CurrentSoilValue = 800;
	
	//แม๊พค่าให้อยู่ในรูปของเปอร์เซ็นต์
	MapReadSoilValue = map(CurrentSoilValue, 800, 4000, 100, 0);
	
	//แสดงข้อความใน Serial Monitor
	Serial.print(NowString());
	Serial.print(", Soil sensor value: ");
	Serial.println(MapReadSoilValue);
	
	return MapReadSoilValue;
}
*/
// *** (21) FUNCTION LdrPercentValue ***

int LdrPercentValue() {
	//อ่านค่าจากเซ็นเซอร์อนาล๊อก LDR
	CurrentLightValue = analogRead(LdrSensorPin);
	
	if(CurrentLightValue > 4000) CurrentLightValue = 4000;
	if(CurrentLightValue < 100) CurrentLightValue = 100;
	
	//แม๊พค่าให้อยู่ในรูปของเปอร์เซ็นต์
	MapReadLightValue = map(CurrentLightValue, 4000, 100, 0, 100);
	
	//แสดงข้อความใน Serial Monitor
	Serial.print(NowString());
	Serial.print(", Light sensor value: ");
	Serial.println(MapReadLightValue);
	
	return MapReadLightValue;
}

// *** (22) MULTITASK : TASK1 ***
/*
*  MULTITASK
*  TASK1: ลูปเช็คค่าความชื้นดิน ถ้าน้อยกว่าเปอร์เซ็นต์ที่ตั้งไว้ ให้รดน้ำตามเวลาที่กำหนด
*/
/*
void Task1(void *p) {  
	while(1) {    
		//ค่า PercentWatering เป็นค่าความชื้นของดิน
		//PercentWatering ต้องไม่เท่ากับ 0
		if(SoilPercentValue() < PercentWatering and SoilPercentValue() != 0) {      
		
		//เรียกใช้ฟังก์ชันรดน้ำ
		digitalWrite(WateringPin, 0);    
		} //if    
		
		//เข้าโหมดรอตามเวลาที่กำหนด
		//ตัวอย่าง default = 60000 = 1 นาที
		vTaskDelay(TimeSoilCheck / portTICK_PERIOD_MS);  
	} //while
}
*/

/*
void Task1(void *p) {  
  	while(1) {    
		digitalWrite(LEDWateringPin, 0);
		vTaskDelay(500 / portTICK_PERIOD_MS);
		digitalWrite(LEDWateringPin, 1);
		vTaskDelay(500 / portTICK_PERIOD_MS);
	} //while
}
*/
// *** (23) MULTITASK : TASK2 ***
/*
*  MULTITASK
*  TASK2: ลูปเช็คสถานะของสวิตซ์ ถ้ามีการกดสวิตซ์จะเป็นการเปิดปั๊มรดน้ำ
*/

void Task2(void *p) {
	//กำหนดค่าตัวแปร state เท่ากับ 0 เป็นค่าเร่มต้น (สถานะปิด)
	//boolean state = 0;
	
	//กำหนดค่าตัวแปรเป็นตัวเลข 0 กับ 1
	//boolean oldState = 0;
	
	//กำหนดค่าตัวแปรเป็นตัวเลข 0 กับ 1
	boolean data; 
	while(1) {
		//อ่านค่า SwitchPin ในรูปแบบตัวเลข 0 และ 1 (0 คือการกดสวิตซ์)
		data = digitalRead(SwitchPin);  
		
		//ถ้ามีการกดสวิตซ์ ค่าที่อ่านได้เท่ากับ 0 และมีการกดเพียงครั้งเดียว
		//มีค่าที่อ่านได้ก่อนหน้าเท่ากับ 1
		if(data == 0 && PumpStat == false) {    
			//รอ 10 มิลลิวินาที เพื่อป้องกันการอ่านค่าผิดพลาด
			//ที่เกิดขั้นในระหว่างการเกิดผิวหน้าสัมผัสตอนกดสวิตซ์
			vTaskDelay(10 / portTICK_PERIOD_MS);      
		
			//อ่านค่าข้อมูลขาดิจิตอล SwitchPin อีกครั้งถ้าพบว่าค่ายังเท่ากับ 0
			//แสดงว่ามีการกดสวิตซ์จริง
			if(digitalRead(SwitchPin) == 0) {        
				//เรียกใช้ฟังก์ชันรดน้ำ
				digitalWrite(WateringPin, 0);   
				PumpStat = true;   
			} //if
			//เปิดปั๊มรดน้ำตามเวลาที่กำหนด 
		} //if 
		if(data == 1 && PumpStat == true){
			digitalWrite(WateringPin, 1);   
			PumpStat = false;  
		}
	vTaskDelay(100 / portTICK_PERIOD_MS); 
	
	//กำหนดตัวแปร oldState เท่ากับค่าที่อ่านได้
	//oldState = data; 
	} //while
}


// *** (24) MULTITASK : TASK3 ***
/*
*  MULTITASK
*  TASK3: ลูปเช็คค่าขา WateringPin ถ้าเปลี่ยนสถานะเป็น 0
*  แสดงว่าปั๊มทำงานให้หลอด LED กระพริบ
*/

void Task3(void *p) {  
	while(1) {
		//อ่านค่าสถานะของ WateringPin, 0 ปั้ม่ทำงาน , 1 ปั๊มไม่ทำงาน
		//ถ้าปั้มทำงาน
		if(digitalRead(WateringPin) == 0) {      
			//ให้หลอด LED ติด
			digitalWrite(LEDWateringPin, HIGH);      
			
			//ให้หลอด LED บน app Blynk ติด
			LEDWatering.on();      
			
			//รอ .5 วินาที
			vTaskDelay(500 / portTICK_PERIOD_MS);    
		} //if    
		
		//ให้หลอด LED ดับ
		digitalWrite(LEDWateringPin, LOW);    
		
		//ให้หลอด LED บน app Blynk ดับ
		LEDWatering.off();    
		
		//รอ .5 วินาที
		vTaskDelay(500 / portTICK_PERIOD_MS);  
	} //while
}


// *** (25) MULTITASK : TASK4 ***
/*
*  MULTITASK
*  TASK4: ลูปเช็คสัญญาณ wifi ถ้าติดต่อไม่ได้ให้ต่อใหม่
*/

void Task4(void *p) {  
	while(1) {    
		//เช็คว่าติดต่อ wifi ได้หรือไม่ ถ้าไม่ได้ ให้ reconnect ใหม่
		if(WiFi.status() != WL_CONNECTED) {      
			digitalWrite(LEDWiFiPin, LOW);
			Serial.println("WiFi Disconnected.");      
			WiFi.begin((char*)ssid, (char*)pass);    
		} 
		else {      
			digitalWrite(LEDWiFiPin, HIGH);
		}  
		vTaskDelay(5000 / portTICK_PERIOD_MS); 
	} //while
}

// *** (26) MULTITASK : TASK5 ***
/*
*  MULTITASK
*  TASK5: รดน้ำต้นไม้
*/

/*
void Task5(void *p) {  
	while(1) {   
		if(digitalRead(WateringPin) == 0) {     
		//เปิดปั๊มรดน้ำต้นไม้
		digitalWrite(RelayPin, LOW);     
		
		//อัพเดทสถานะของ LED Relay บน Blynk server
		LEDWatering.on();
		Blynk.virtualWrite(Widget_WateringButton, 1);     
		
		//แสดงข้อความบน blynk terminal
		terminal.print(NowString());
		terminal.println(", Start");     
		
		//แสดงข้อความบนคอนโซล
		Serial.print(NowString());
		Serial.println(", Plant watering...");     
		
		//ส่งข้อความให้ line notify แจ้งเตือน
		NotifyLine("Plant watering...");     
		
		//เปิดปั๊มรดน้ำตามเวลาที่กำหนด
		vTaskDelay(TimeWatering / portTICK_PERIOD_MS);     
		
		//ปิดปั๊มรดน้ำต้นไม้
		digitalWrite(RelayPin, HIGH);     
		
		//เปลี่ยนสถานะ WateringPin เท่ากับ 1 เพื่อหยุดรดน้ำต้นไม้
		digitalWrite(WateringPin, 1);     
		
		//อัพเดทสถานะของ LED Relay บน Blynk server
		LEDWatering.off();
		Blynk.virtualWrite(Widget_WateringButton, 0);     
		
		//แสดงข้อความบนคอนโซล
		Serial.print(NowString());
		Serial.println(", Stop watering.");     
		
		//ส่งข้อความให้ line notify แจ้งเตือน
		NotifyLine("Stop watering.");     
		terminal.print(NowString());
		terminal.println(", Stop");    
		}//if
	} //while
}

*/

void Task6(void *p) {  
	while(1) {    
		if (!client.connected()) {
			Serial.print("Attempting MQTT connection...");
			if (client.connect("ESP32Client", mqtt_user, mqtt_password)) {
				Serial.println("connected");
				client.subscribe("/Farm/LED");
		} else {
			Serial.print("failed, rc=");
			Serial.print(client.state());
			Serial.println(" try again in 5 seconds");
			vTaskDelay(5000 / portTICK_PERIOD_MS);   
			return;
		}
	}
	} //while
}

อันนี้ log จาก terminal
2019-09-02 14:06:45, Humidity: 55% | Temperature: 23C
2019-09-02 14:06:45, Send dht22 / Soil sensors to blynk server.
[E][WiFiClient.cpp:433] available(): fail on fd 56, errno: 11, “No more processes”
2019-09-02 14:06:45, Send data to blynk server
2019-09-02 14:06:45, Wifi Signal: 76%
2019-09-02 14:06:45, Light sensor value: 76
2019-09-02 14:06:45, Send LDR sensors / WIFI to blynk server.
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
2019-09-02 14:08:45, Send data to blynk server
2019-09-02 14:08:45, Humidity: 55% | Temperature: 23C
2019-09-02 14:08:45, Send dht22 / Soil sensors to blynk server.
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…
2019-09-02 14:10:45, Send data to blynk server
2019-09-02 14:10:45, Humidity: 55% | Temperature: 23C
2019-09-02 14:10:45, Send dht22 / Soil sensors to blynk server.
Not connected to Blynk server.
Connecting to Blynk server…
2019-09-02 14:10:54, Humidity: 55% | Temperature: 23C
2019-09-02 14:10:54, Light sensor value: 76
{“temperature”:23,“humidity”:55,“time”:“2019-09-02 14:10:54”,“ldr”:76,“wifi”:76}
2019-09-02 14:10:54, MQTT connected.
2019-09-02 14:10:54, MQTT pushed: /Farm/LED
Not connected to Blynk server.
Connecting to Blynk server…
Not connected to Blynk server.
Connecting to Blynk server…

มันวนรีเซตตัวเองรึป่าว ครับ แคปตรง Serial.print มาดูหน่อยครับ

ไม่วนครับแต่ ตั้งแต่ขึ้น [E][WiFiClient.cpp:433] available(): fail on fd 56, errno: 11, “No more processes” จะเชื่อมต่อไม่ได้

ตรงนี้ปกติใส่รึยังครับ

image

ใส่หมดแล้วครับ พอดีเอามาโพสเลยลบทิ้ง

เราใช้ server ของอะไรครับ อันนี้วิ่งไป blynk server หลักนะครับ

image

มันจะมี 2 ส่วนครับ

	//ทำการเชื่อมต่อ WiFi
	//Blynk.connectWiFi(ssid, pass);
	Blynk.connectWiFi(ssid, pass);
	//Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080); 

	//ทำการเชื่อมต่อ BLYNK SERVER
	Blynk.config(auth, server, port);
	Blynk.connect();

หน้าแอพ set ไปที่ blynk.iot-cm.com รึยังครับ แคปมาดูหน่อยครับ

ถ้า set หน้าแอพถูกลองแก้เป็น แบบนี้

//ทำการเชื่อมต่อ WiFi
Blynk.begin(auth, ssid, pass, "blynk.iot-cm.com", 8080); 
Blynk.connect();

แก้แล้วครับเดี๋ยวมาแจ้งผลครับ


เป็นเหมือนเดิมครับ

ตั้งค่าเรียบร้อยรึยังครับ port 9443

หน้านี้ครับ

แอพมัน ออนอยู่แปปหนึ่งแล้วดับใช่ไหมครับ ลองตัดฟังชันก์อื่นๆ ออกให้หมดก่อน เหลือแค่การเชื่อมไปที่ blynk แล้วเช็คดูว่าหลุดไหม

ใช่ครับส่งได้พักนึงแล้วหลุด ตอนนี้ผมจะลองตัดมาเทสทีละฟังชั่นครับ เดี๋ยวอัพเดทอีกทีครับ