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 เข้าไปใหม่