วันจันทร์ที่ 15 พฤษภาคม พ.ศ. 2560

ESP8266 กับการเขียนแบบ Multitask


ในบางครั้งเรามีความจำเป็นต้องการทำงานหลายๆงานในคราวเดียวกัน
ในการควบคุม ต่างๆบน 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
ให้เขียนดังนี้


#include <Arduino.h>
#include <Scheduler.h>
 
         /* ใส่ Task ที่ต้องการตรงบริเวณนี้ */
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 เข้ามาก็ได้

6 ความคิดเห็น:

  1. เยี่ยมมาก ขอบคุณที่แชร์ความรู้

    ตอบลบ
  2. ไม่ระบุชื่อ30 มกราคม 2565 เวลา 16:01

    Best Baccarat Sites for Beginners - Free Baccarat Tips
    The best free Baccarat games of all time. We 제왕 카지노 list งานออนไลน์ the best online casino games including roulette, blackjack, poker, 바카라 blackjack, poker,

    ตอบลบ
  3. ความคิดเห็นนี้ถูกผู้เขียนลบ

    ตอบลบ