การตั้งรอบเวลา ตั้งเวลา ให้โค้ตทำงานด้วย SimpleTimer

เห็นคงเริ่มถามกันเยอะเลยมาตั้งกระทู้ตอบแบบ ขอสั่นๆ กันก่อนนะครับ อยากที่กล่างมาคือบางที เราเขียนโค้ตในโปรอกรมบน void loop() ยาวมากๆ ทำให้โค้ตบางส่วนของเราทำงานได้ช้า เหมือนกับว่าต้องรอ ให้ถึงส่วนที่สั่งตัวเองก่อน ถึงจะทำได้ หรือในโค้ตชุดนั้นต้องมีการใส่ delay เข้ามาหน่วงเวลาถึงจะใช้งานได้ ทำให้เข้าไปกวนการทำงานของโค้ตชุดิื่นๆ ให้ประสิทธิภาพในการทำงานลดลงอีกต่างหาก

เช่น กรณีการอ่านค่าจาก เซนเซอร์ มันต้องมีการอัพเดทอยู่เรี่อยๆ เรียลๆ เขียนตรงๆ อาจจะทำให้เราอ่านค่าได้ไม่ไว้พอ ทำให้บางงานที่ระเอียดอ่อน ในด้านเงื่อนไข คลาดเคลื่อนตามไปด้วย ดั้งนั้น ผมเลยแนะนำให้ใช้ SimpleTimer library เข้ามาแก้โจทย์ข้อนี้กันครับ

อันนี้โค้ตตัวอย่าง

#include <SimpleTimer.h>

SimpleTimer timer;

// ฟังก์ชันที่จะดำเนินการเป็นระยะ ๆ
void easyTime() {
    Serial.print("Uptime (s): ");
    Serial.println(millis() / 1000);
}

void setup() {
    Serial.begin(9600);
    timer.setInterval(1000, easyTime);
}

void loop() {
    timer.run();
}

ทีนี้ผมขออธิบายหน่อยว่า ผมได้สร้าง ฟังก์ชันชื่อ easyTime ขึ้นมา แต่ผมจะไม่เอาไปไว้ใน void loop() เนื่องจากต้องการให้มันทำงานขนานไปกับ void loop ด้วยเลย โดยใช้คำสั่ง

timer.setInterval(1000, easyTime);

1000 คือ ค่าเวลาที่เราต้องการให้มันทำคำสั่งนี้ ทุกๆ กี่ วินาที 1000 เท่ากับ 1 วินาที
easyTime คือ ชื่อฟังก์ชัน ใดๆ ก็ได้ที่เราต้องการให้มันทำงาน เป็นรอบๆ

ดาวน์โหลด library => SimpleTimer-master.zip (3.9 KB)

ถ้าอย่างนั้นก็สามารถสร้าง​ ได้หลายฟังก์ชั่น​ ที่ทำงานไปพร้อมกันได้เช่น​ การแสดงเวลา​ ชม.​ นาที​ วินาที​ และฟังก์ชั่นเชคสัญญาณ​​ WiFi.​ หรือมี​ ปุ่มกด​ 8​ ตัว​ ก็​ 8​ ฟังก์ชั่นได้เลยใช่มั็ยครับ​ ต้องลองๆ​ ขอบคุณมากครับ

ใช่ครับพี่ ถ้าต้องการงานที่ไม่ต้องรอ loop หลักก็เพิ่มบรรทัดต่อมาได้เลยครับ

image

อธิบายเพิ่มเติมอีกสักนิดหนึ่ง คือ การใช้ simpleTimer ดูเหมือนเป็นการทำงานแบบแยกคอร์ หรือ แทก ออกมา แต่จริงๆ แล้ว เป็นการแบ่ง ทรัพยากรจากคอร์เดียวออกมาทำงาน ต่างหาก ครับ เพราะโดยสเปค บอร์ดโดยทั่วไปจะมีแค่ Core เดียว

จะไม่เหมือนกับ esp32 ที่พี่ @PUYIOT พึ่งตั้งเมื่อไม่นานมานี้ อันนั้น เป็นการแยก Core จากกันโดยอิสระ เพราะ สเปค esp32 เป็น Core 2 มาในตัว ถ้าเราไม่เขียนให้ฟิกว่า ให้ทำงาน คอร์ไหน บอร์ดมันก็จะจัดสรรให้เอง

Arduino: 1.8.15 (Windows 10), Board: "NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Legacy (new can return nullptr), All SSL ciphers (most compatible), 4MB (FS:2MB OTA:~1019KB), 2, v2 Lower Memory, Disabled, None, Only Sketch, 115200"





















C:\Users\Admin\AppData\Local\Temp\arduino_modified_sketch_488216\sketch_aug05b.ino: In function 'void setup()':

sketch_aug05b:91:36: error: invalid conversion from 'void (*)(float, float, float, float, float, float)' to 'timer_callback {aka void (*)()}' [-fpermissive]

   timer.setInterval(5000L, sendData);

                                    ^

In file included from C:\Users\Admin\OneDrive\�͡���\Arduino\libraries\Blynk\src/Blynk/BlynkApi.h:37:0,

                 from C:\Users\Admin\OneDrive\�͡���\Arduino\libraries\Blynk\src/BlynkApiArduino.h:14,

                 from C:\Users\Admin\OneDrive\�͡���\Arduino\libraries\Blynk\src/BlynkSimpleEsp8266.h:24,

                 from C:\Users\Admin\AppData\Local\Temp\arduino_modified_sketch_488216\sketch_aug05b.ino:5:

C:\Users\Admin\OneDrive\�͡���\Arduino\libraries\Blynk\src/Blynk/BlynkTimer.h:62:9: error:   initializing argument 2 of 'int BlynkTimer::setInterval(long unsigned int, timer_callback)' [-fpermissive]

     int setInterval(unsigned long d, timer_callback f);

         ^

Multiple libraries were found for "SimpleTimer.h"

 Used: C:\Users\Admin\OneDrive\เอกสาร\Arduino\libraries\SimpleTimer-master

 Not used: C:\Program Files (x86)\Arduino\libraries\SimpleTimer-master

exit status 1

invalid conversion from 'void (*)(float, float, float, float, float, float)' to 'timer_callback {aka void (*)()}' [-fpermissive]



This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

ขึ้นแบบนี้ครับ

เอาโค้ตเต็มมาดูหน่อยครับ

ได้แล้วครับพี่ขอบคุณมากๆครับ