ในการควบคุม ต่างๆบน ESP8266
แต่ในระหว่างงานหนึ่งๆ เราอาจจะมีการใช้คำสั่ง delay()
ซึ่งทำให้ งานที่เหลือ ต้องคอยหยุดชะงักไปด้วย
ซึ่งไม่เป็นการสะดวกอย่างยิ่ง
ตัวอย่างเช่น เรามี งาน 3 Task
Task แรก เราต้องการไฟกระพริบติดดับๆ เป็นระยะๆ ทุก 1 วินาที
uint8_t state;
void setup() {
state = HIGH;
pinMode(2, OUTPUT);
pinMode(2, state);
}
void loop() {
state = state == HIGH ? LOW : HIGH;
pinMode(2, state);
delay(1000);
}
Task ที่สอง เราต้องการให้มีการแสดงค่าทาง Serial ทุกๆ 5 วินาที
void loop() {
Serial.println("Print Loop Start");
delay(5000);
Serial.println("Print Loop End");
delay(5000);
}
และ Task ที่สาม อาจจะต้องการให้มีอ่านค่าเม็มโมรี่ที่เหลือ ทุกๆ 10วินาที
void loop() {
Serial.print("Free Heap: ");
Serial.print(ESP.getFreeHeap());
Serial.println(" bytes");
delay(10000);
}
ตามปกติในแต่ละ Task การใช้ delay(1000) delay(5000) และ delay(10000)
( 1 วินาที , 5 วินาที, 10 วินาที)
หากไปใช้ร่วมกันจะเกิดความสะดุดส่งผลกระทบต่อ Task ไปได้อื่นๆด้วย
เช่น ไฟอาจจะไม่กระพริบทุกๆวินาทีต่อเนื่องด้วยดี ตามต้องการ ขึ้นได้
แต่ใน ESP8266 เราสามารถหลีกเลี่ยงไม่ให้ งานทั้ง 3 นี้ต้องมาสะดุดกัน
เสมือนเราเขียนแต่ละ task แต่จับมาร่วมทำงานพร้อมกัน
ที่เรียกว่าการทำงานแบบ Multitasking
ติดตั้ง Library Esp8266Scheduler
ก่อนอื่นให้เปิดหน้าต่าง Library Manager ขึ้นมาแล้วเพิ่มไลบรารี่ ที่ชื่อว่า Esp8266Schedulerเข้าไปให้เรียบร้อยเสียก่อน
การเขียน CODE (ตัวอย่างใน example)
Task1 : ให้เขียน code ดังนี้
class BlinkTask : public Task {
protected:
void setup() {
state = HIGH;
pinMode(2, OUTPUT);
pinMode(2, state);
}
void loop() {
state = state == HIGH ? LOW : HIGH;
pinMode(2, state);
delay(1000);
}
private:
uint8_t state;
} blink_task;
Task 2: ให้เขียน code ดังนี้
class PrintTask : public Task {
protected:
void loop() {
Serial.println("Print Loop Start");
delay(5000);
Serial.println("Print Loop End");
delay(5000);
}
} print_task;
Task3 : ให้เขียน code ดังนี้
class MemTask : public Task {
public:
void loop() {
Serial.print("Free Heap: ");
Serial.print(ESP.getFreeHeap());
Serial.println(" bytes");
delay(10000);
}
} mem_task;
ส่วน Code หลัก ให้ ใส่ #include และ setup(), loop() หลัก ตามปกติการเขียนโคดแบบ Arduino
ให้เขียนดังนี้
/* ใส่ Task ที่ต้องการตรงบริเวณนี้ */
#include <Arduino.h>
#include <Scheduler.h>
void setup() {
Serial.begin(115200);
Serial.println("");
delay(1000);
Scheduler.start(&blink_task);
Scheduler.start(&print_task);
Scheduler.start(&mem_task);
Scheduler.begin();
}
void loop() {}
โดย Task ทั้ง 3 ให้ใส่ไว้ก่อน setup() หลัก ของการเขียนแบบ Arduino
หรือจะแยกเป็นไฟล์ต่างหาก แล้ว #include เข้ามาก็ได้