ตัวนี้จะให้ทำงาน ใน task ทำไงครับ

 BLYNK_WRITE(Widget_Btn_SW1)
{
      int valueSW1 = param.asInt();
      if(valueSW1 == 1)
      {    
        pool_size1 = node1.writeSingleRegister(0x00,0x0100);
      }
       else
      {                    
       pool_size1 = node1.writeSingleRegister(0x00,0x0200);
      }
}

ใช้บอร์ดอะไรยังไงครับ

Esp32 ครับ
ใช้ rs485 เซนเซอร์ หลายตัว และ ดีเรย์ 16 ตัว จะให้ คำสังเปิดปิดรีเรย์ อยู่ coro 0และเซนเซอร์ออยู่ coro 1 เคยใช้โค้ดรวมกันแล้ว มันหน่วงเวลา กว่าจะปิดเปิดรีเรย์ ได้ รอนานครับ พอจะมีวิธีไหมครับ

ลองไปปรับใช้ดูครับ

#include <ModbusMaster.h>

// สร้าง object สำหรับการใช้ Modbus
ModbusMaster node1;

int pool_size1 = 0;
int valueSW1 = 0; // จำลองค่าของ param.asInt()

void setup() {
  Serial.begin(115200);

  // เริ่มต้นใช้งาน Modbus
  node1.begin(1, Serial2);  // ใช้ Serial2 สำหรับ Modbus
  
  // สร้าง task 2 task (สำหรับรีเลย์และเซนเซอร์)
  xTaskCreatePinnedToCore(
    relayTask,  // Task สำหรับการควบคุมรีเลย์
    "Relay Control Task",
    10000,
    NULL,
    1,
    NULL,
    0  // รันบน Core 0
  );

  xTaskCreatePinnedToCore(
    sensorTask,  // Task สำหรับการอ่านเซนเซอร์
    "Sensor Task",
    10000,
    NULL,
    1,
    NULL,
    1  // รันบน Core 1
  );
}

void loop() {
  // ไม่ต้องใช้อะไรใน loop เพราะใช้ task จัดการแทน
}

// Task สำหรับการควบคุมรีเลย์ (coro 0)
void relayTask(void *pvParameters) {
  while(1) {
    valueSW1 = param.asInt(); // จำลองการรับค่าจาก param.asInt()
    
    if (valueSW1 == 1) {    
      pool_size1 = node1.writeSingleRegister(0x00, 0x0100);
      Serial.println("Relay ON");
    } else {                    
      pool_size1 = node1.writeSingleRegister(0x00, 0x0200);
      Serial.println("Relay OFF");
    }

    // หน่วงเวลาเพื่อไม่ให้ task นี้รันบ่อยเกินไป
    vTaskDelay(1000 / portTICK_PERIOD_MS);  // หน่วงเวลา 1 วินาที
  }
}

// Task สำหรับการอ่านเซนเซอร์ (coro 1)
void sensorTask(void *pvParameters) {
  while(1) {
    // อ่านค่าจากเซ็นเซอร์ที่นี่
    // ตัวอย่าง: float sensorValue = analogRead(A0);
    
    Serial.println("Reading sensor...");
    
    // หน่วงเวลาเพื่อไม่ให้ task นี้รันบ่อยเกินไป
    vTaskDelay(2000 / portTICK_PERIOD_MS);  // หน่วงเวลา 2 วินาที
  }
}

ขอบคุณครับ อาจารย์

//============Libraries Need for project============//
#include <BlynkSimpleEsp32.h>           
#define BLYNK_DEBUG
#define BLYNK_PRINT Serial
int blynkIsDownCount = 0;
#include <Simpletimer.h>
BlynkTimer timer;
SimpleTimer timer1;
//============Libraries Need for project============//

//=====Wi-Fi & Blynk Credential=====//
char server[] = "elec.cmtc.ac.th";
int port = 8080;
char ssid[] = "Koonme";                                                                   //ชื่อ SSID ที่เราต้องการเชื่อมต่อ        
char pass[] = "171928AOM";                                                               //รหัสผ่าน WI-FI
char auth[] = "f0RLa-7X19q0qT58ts2zkNhUlpRYmnWY";                                         //Auth token from blynk app 
                                           
//============ Wi-Fi & Blynk Credentials============//

//=========Pool size for Modbus Write command=======//
int8_t pool_size1;

#define Widget_Btn_SW1 V1
int value1 = 0;
#define Widget_Btn_SW2 V2
int value2 = 0;
#define Widget_Btn_SW3 V3
int value3 = 0;
#define Widget_Btn_SW4 V4
int value4 = 0;
#define Widget_Btn_SW5 V5
int value5 = 0;
#define Widget_Btn_SW6 V6
int value6 = 0;
#define Widget_Btn_SW7 V7
int value7 = 0;
#define Widget_Btn_SW8 V8
int value8 = 0;
//=========Pool size for Modbus Write command=======

TaskHandle_t Task1;
TaskHandle_t Task2;
TaskHandle_t Task3;
TaskHandle_t Task4;
TaskHandle_t Task5;
TaskHandle_t Task6;
TaskHandle_t Task7;
TaskHandle_t Task8;
//=====================================pump========//


//====Modbus Libraries====//
#include "ETT_ModbusRTU.h"
#include <ModbusMaster.h>
#define MAX485_DE      18   //DE
#define MAX485_RE_NEG  19   //RE
#define RX2 16              //RO
#define TX2 17              //DI
//====Modbus Libraries====//

//==instantiate ModbusMaster object==//
ModbusMaster node1;       //Modbus RTU 8CH Relay Slave ID1
//==instantiate ModbusMaster object==//


//======pre&post transmission1=======//
void preTransmission1()
{
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}
void postTransmission1()
{
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}



//==============================Setup Function============================//
void setup()
{
  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
  Serial.begin(115200);
  Serial2.begin(9600, SERIAL_8N1, RX2, TX2);                              //RX2=16,RO ,TX2=17, DI

  Serial.println("Starting...");
  WiFi.begin(ssid,pass);
  while (WiFi.status() != WL_CONNECTED)
   {
    delay(250);
    Serial.print(".");
   }
  Serial.println("WiFi Connected");
  Serial.println("IP Address: ");
  Serial.println(WiFi.localIP());
  
  //=====Modbus slave ID=====// 
  node1.begin(1, Serial2);                                               //Modbus RTU 8CH Relay1
  node1.preTransmission(preTransmission1);
  node1.postTransmission(postTransmission1);
  
//create a task that will be executed in the Task1code() function, with priority 1 and executed on core 0
  xTaskCreatePinnedToCore(
    relayTask1,   /* Task function. */
    "Relay Control Task",     /* name of task. */
    10000,       /* Stack size of task */
    NULL,        /* parameter of the task */
    1,           /* priority of the task ตัวเลขน้อยสำคัญน้อย*/
    &Task1,      /* Task handle to keep track of created task */
    0);          /* pin task to core 0 */
  delay(500);
  
xTaskCreatePinnedToCore(
    relayTask2,   /* Task function. */
    "Relay Control Task",     /* name of task. */
    10000,       /* Stack size of task */
    NULL,        /* parameter of the task */
    1,           /* priority of the task ตัวเลขน้อยสำคัญน้อย*/
    &Task2,      /* Task handle to keep track of created task */
    0);          /* pin task to core 0 */
  delay(500);

xTaskCreatePinnedToCore(
    relayTask3,   /* Task function. */
    "Relay Control Task",     /* name of task. */
    1000,       /* Stack size of task */
    NULL,        /* parameter of the task */
    1,           /* priority of the task ตัวเลขน้อยสำคัญน้อย*/
    &Task3,      /* Task handle to keep track of created task */
    0);          /* pin task to core 0 */
  delay(500);

  xTaskCreatePinnedToCore(
    relayTask4,   /* Task function. */
    "Relay Control Task",     /* name of task. */
    1000,       /* Stack size of task */
    NULL,        /* parameter of the task */
    1,           /* priority of the task ตัวเลขน้อยสำคัญน้อย*/
    &Task4,      /* Task handle to keep track of created task */
    0);          /* pin task to core 0 */
  delay(500);

  xTaskCreatePinnedToCore(
    relayTask5,   /* Task function. */
    "Relay Control Task",     /* name of task. */
    1000,       /* Stack size of task */
    NULL,        /* parameter of the task */
    1,           /* priority of the task ตัวเลขน้อยสำคัญน้อย*/
    &Task5,      /* Task handle to keep track of created task */
    0);          /* pin task to core 0 */
  delay(500);

  xTaskCreatePinnedToCore(
    relayTask6,   /* Task function. */
    "Relay Control Task",     /* name of task. */
    1000,       /* Stack size of task */
    NULL,        /* parameter of the task */
    1,           /* priority of the task ตัวเลขน้อยสำคัญน้อย*/
    &Task6,      /* Task handle to keep track of created task */
    0);          /* pin task to core 0 */
  delay(500);

  xTaskCreatePinnedToCore(
    relayTask7,   /* Task function. */
    "Relay Control Task",     /* name of task. */
    1000,       /* Stack size of task */
    NULL,        /* parameter of the task */
    1,           /* priority of the task ตัวเลขน้อยสำคัญน้อย*/
    &Task7,      /* Task handle to keep track of created task */
    0);          /* pin task to core 0 */
  delay(500);
  
  xTaskCreatePinnedToCore(
    relayTask8,   /* Task function. */
    "Relay Control Task",     /* name of task. */
    1000,       /* Stack size of task */
    NULL,        /* parameter of the task */
    1,           /* priority of the task ตัวเลขน้อยสำคัญน้อย*/
    &Task8,      /* Task handle to keep track of created task */
    0);          /* pin task to core 0 */
  delay(500);



  Serial.println();
  Blynk.begin(auth, ssid, pass, "elec.cmtc.ac.th", 8080); 
  timer.setInterval(30000L, reconnecting); 
}
//==============================Setup Function============================//
void relayTask1(void * pvParameter) 
{
  while(1) 
   {
      if(value1 == 1)
       {    
        pool_size1 = node1.writeSingleRegister(0x00,0x0100);
        Serial.print("ไฟในโรงเรือน on...");
       }
         else
       {                    
       pool_size1 = node1.writeSingleRegister(0x00,0x0200);
       Serial.print("ไฟในโรงเรือน off...");
       }
        {
         Serial.print("Running on core: ");
         Serial.println(xPortGetCoreID()); 
        }
    vTaskDelay(1000 / portTICK_PERIOD_MS);
   }
}


void relayTask2(void * pvParameter) 
{
  while(1) 
   {
      if(value2 == 1)
       {    
        pool_size1 = node1.writeSingleRegister(0x01,0x0100);
        Serial.print("พัดลมระบายอากาศ on...");
       }
         else
       {                    
       pool_size1 = node1.writeSingleRegister(0x01,0x0200);
       Serial.print("พัดลมระบายอากาศ off...");
       }
        {
         Serial.print("Running on core: ");
         Serial.println(xPortGetCoreID()); 
        }
    vTaskDelay(1000 / portTICK_PERIOD_MS);
   }
}


void relayTask3(void * pvParameter) 
{
  while(1) 
   {
      if(value3 == 1)
       {    
        pool_size1 = node1.writeSingleRegister(0x02,0x0100);
        Serial.print("ปั๊มพ่นหมอก on...");
       }
         else
       {                    
       pool_size1 = node1.writeSingleRegister(0x02,0x0200);
       Serial.print("ปั๊มพ่นหมอก off...");
       }
        {
         Serial.print("Running on core: ");
         Serial.println(xPortGetCoreID()); 
        }
    vTaskDelay(1000 / portTICK_PERIOD_MS);
   }
}


void relayTask4(void * pvParameter) 
{
  while(1) 
   {
      if(value4 == 1)
       {    
        pool_size1 = node1.writeSingleRegister(0x03,0x0100);
        Serial.print("ปั๊มค่าความเป็นกรด on...");
       }
         else
       {                    
       pool_size1 = node1.writeSingleRegister(0x03,0x0200);
       Serial.print("ปั๊มค่าความเป็นกรด off...");
       }
        {
         Serial.print("Running on core: ");
         Serial.println(xPortGetCoreID()); 
        }
    vTaskDelay(1000 / portTICK_PERIOD_MS);
   }
}


void relayTask5(void * pvParameter) 
{
  while(1) 
   {
      if(value5 == 1)
       {    
        pool_size1 = node1.writeSingleRegister(0x04,0x0100);
        Serial.print("ปั๊มค่าความเป็นด่าง on...");
       }
         else
       {                    
       pool_size1 = node1.writeSingleRegister(0x04,0x0200);
       Serial.print("ปั๊มค่าความเป็นด่าง off...");
       }
        {
         Serial.print("Running on core: ");
         Serial.println(xPortGetCoreID()); 
        }
    vTaskDelay(1000 / portTICK_PERIOD_MS);
   }
}


void relayTask6(void * pvParameter) 
{
  while(1) 
   {
      if(value6 == 1)
       {    
        pool_size1 = node1.writeSingleRegister(0x05,0x0100);
        Serial.print("ปั๊มปุ๋ย A on...");
       }
         else
       {                    
       pool_size1 = node1.writeSingleRegister(0x05,0x0200);
       Serial.print("ปั๊มปุ๋ย A off...");
       }
        {
         Serial.print("Running on core: ");
         Serial.println(xPortGetCoreID()); 
        }
    vTaskDelay(1000 / portTICK_PERIOD_MS);
   }
}


void relayTask7(void * pvParameter) 
{
  while(1) 
   {
      if(value7 == 1)
       {    
        pool_size1 = node1.writeSingleRegister(0x06,0x0100);
        Serial.print("ปั๊มปุ๋ย B on...");
       }
         else
       {                    
       pool_size1 = node1.writeSingleRegister(0x06,0x0200);
       Serial.print("ปั๊มปุ๋ย B off...");
       }
        {
         Serial.print("Running on core: ");
         Serial.println(xPortGetCoreID()); 
        }
    vTaskDelay(1000 / portTICK_PERIOD_MS);
   }
}


void relayTask8(void * pvParameter) 
{
  while(1) 
   {
      if(value8 == 1)
       {    
        pool_size1 = node1.writeSingleRegister(0x07,0x0100);
        Serial.print("ปั๊มกวน AB on...");
       }
         else
       {                    
       pool_size1 = node1.writeSingleRegister(0x07,0x0200);
       Serial.print("ปั๊มกวน AB off...");
       }
        {
         Serial.print("Running on core: ");
         Serial.println(xPortGetCoreID()); 
        }
    vTaskDelay(1000 / portTICK_PERIOD_MS);
   }
}


BLYNK_WRITE(Widget_Btn_SW1)
{
  value1 = param.asInt();
}
BLYNK_WRITE(Widget_Btn_SW2)
{
  value2 = param.asInt();
}
BLYNK_WRITE(Widget_Btn_SW3)
{
  value3 = param.asInt();
}
BLYNK_WRITE(Widget_Btn_SW4)
{
  value4 = param.asInt();
}
BLYNK_WRITE(Widget_Btn_SW5)
{
  value5 = param.asInt();
}
BLYNK_WRITE(Widget_Btn_SW6)
{
  value6 = param.asInt();
}
BLYNK_WRITE(Widget_Btn_SW7)
{
  value7 = param.asInt();
}
BLYNK_WRITE(Widget_Btn_SW8)
{
  value8 = param.asInt();
}


//=====Blynk connected=====//
BLYNK_CONNECTED()
{
    Serial.println("....");//per debug
    Blynk.syncAll();

  if (Blynk.connected())
   {
     Serial.println("Blynk Connected");
   }
}
//=====Blynk connected=====//

//=====Reconnect to blynk=====//
void reconnecting()
{
  if (!Blynk.connected())
  {
    blynkIsDownCount++;
    BLYNK_LOG("blynk server is down! %d  times", blynkIsDownCount);
    Blynk.connect(5000);
    Blynk.syncAll();
  }
}
//=====Reconnect to blynk=====//

//=======Loop function=======//
void loop() 
{
   if (Blynk.connected())
    {
      Blynk.run();
    } 
      timer.run();
}
//=======Loop function=======//

โค้ดชุดนี้ เขียนtask ได้ประมาณ 2-3 task แต่พอเพิ่ม task เยอะๆ บอด esp32 รีบูตเอง ครับ เกิดจากอะไรครับ

ที่ว่าเพิ่มมาแล้วรีบูตนี้คือโค้ตเหมือน task อื่นๆ รึป่าว

ครับ ถ้าลบ relayTask ออกเหลือ 1 ตัวแล้วอัปโหลด โปรแกรมสามาเชื่อมต่อและกดคำสั่งในแอป blynk ได้ครับ

ลองลด Stack size เหลือ 4000(ทุก task) ก็พอแล้วเพิ่ม task เข้าไปใหม่