วันจันทร์ที่ 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 เข้ามาก็ได้

วันศุกร์ที่ 12 พฤษภาคม พ.ศ. 2560

OverClock เพิ่มความเร็วให้ ESP8266 กันดีกว่า

ปกติแล้ว ตาม สเปค ESP82660 จะทำงานที่ 80MHz
ในขณะที่ Arduino UNO R3 จะทำงานที่ 16MHz เท่านั้น

แต่ๆ 80MHz ยังไม่จุใจพอ
ความจริงแล้วเราสามารถปรับให้ ความเร็วเพิ่มไปอีกเท่าตัวเป็น 160MHz กันได้


วิธีเขียนโคดไม่ยากครับเพียงเพิ่มคำสั่งเหล่านี้ลงใน Arduino IDE เวลา sketch


extern "C" { 

#include "user_interface.h" 
}

void setup(){

   //system_update_cpu_freq(80);
   system_update_cpu_freq(160);
}


void loop() {

   //.......
}
เพียงเท่านี้ ก็จะสามารถเพิ่มความเร็ว ESP8266 ได้จุใจกันเลย