xTimerCreate สำหรับ FreeRTOS ในบอร์ด ESP32

การสร้าง Timer ด้วยฟังก์ชัน xTimerCreate สำหรับ FreeRTOS ในบอร์ด ESP32

การประกาศ:

dhtPublishTimer = xTimerCreate(
    "dhtTimer",                                   // ชื่อ Timer
    pdMS_TO_TICKS(1000),                          // ระยะเวลา (1000ms = 1 วินาที)
    pdTRUE,                                       // Auto reload
    (void *)0,                                    // Timer ID
    reinterpret_cast<TimerCallbackFunction_t>(publishDhtData)  // Callback function
);

แต่ละพารามิเตอร์มีความหมายดังนี้:

  1. "dhtTimer"
    • เป็นชื่อของ Timer
    • ใช้สำหรับการ debug และระบุตัวตนของ Timer
  2. pdMS_TO_TICKS(1000)
    • แปลงเวลาจากมิลลิวินาที (ms) เป็น ticks
    • 1000ms = 1 วินาที
    • pdMS_TO_TICKS() เป็นฟังก์ชันที่แปลงหน่วยเวลาให้เข้ากับ timer tick ของระบบ
  3. pdTRUE
    • กำหนดว่าเป็น Auto-reload timer
    • pdTRUE: Timer จะทำงานซ้ำอัตโนมัติ
    • pdFALSE: Timer จะทำงานครั้งเดียวแล้วหยุด
  4. (void *)0
    • Timer ID
    • ใช้ระบุตัวตนของ Timer
    • ค่า 0 หมายถึงไม่ได้กำหนด ID
  5. reinterpret_cast<TimerCallbackFunction_t>(publishDhtData)
    • ฟังก์ชันที่จะถูกเรียกเมื่อ Timer ครบกำหนด
    • publishDhtData คือฟังก์ชันที่จะทำงาน
    • ใช้ reinterpret_cast เพื่อแปลง function pointer ให้ตรงกับ type ที่ต้องการ

ตัวอย่างการใช้งานที่สมบูรณ์:

#include <Arduino.h>
#include "freertos/FreeRTOS.h"
#include "freertos/timers.h"
#include <DHT.h>

// ประกาศตัวแปร Timer
TimerHandle_t dhtPublishTimer;

// ฟังก์ชัน callback สำหรับ Timer
void publishDhtData(TimerHandle_t xTimer) {
    // อ่านค่าจาก DHT sensor
    float temperature = dht.readTemperature();
    float humidity = dht.readHumidity();

    // ส่งข้อมูล
    Serial.printf("Temp: %.2f°C, Humidity: %.2f%%\n", temperature, humidity);
}

void setup() {
    Serial.begin(115200);

    // สร้าง Timer
    dhtPublishTimer = xTimerCreate(
        "dhtTimer",                                    
        pdMS_TO_TICKS(1000),                          
        pdTRUE,                                       
        (void *)0,                                    
        reinterpret_cast<TimerCallbackFunction_t>(publishDhtData)  
    );

    // เริ่มการทำงานของ Timer
    if (dhtPublishTimer != NULL) {
        if (xTimerStart(dhtPublishTimer, 0) != pdPASS) {
            Serial.println("Timer start error");
        }
    }
}

void loop() {
    // โค้ดอื่นๆ ที่ต้องทำใน loop
    vTaskDelay(pdMS_TO_TICKS(10));  // ให้เวลากับ task อื่นๆ
}

การควบคุม Timer:

// หยุด Timer ชั่วคราว
xTimerStop(dhtPublishTimer, 0);

// เริ่ม Timer ใหม่
xTimerStart(dhtPublishTimer, 0);

// เปลี่ยนระยะเวลาของ Timer
xTimerChangePeriod(dhtPublishTimer, pdMS_TO_TICKS(2000), 0);  // เปลี่ยนเป็น 2 วินาที

// ลบ Timer
xTimerDelete(dhtPublishTimer, 0);

ข้อควรระวัง:

  1. Timer callback ควรทำงานเร็วและไม่ block การทำงาน
  2. หลีกเลี่ยงการใช้ delay ใน callback function
  3. ถ้าต้องการทำงานที่ใช้เวลานาน ควรส่งข้อมูลไปทำใน task อื่น
  4. ตรวจสอบการสร้าง Timer ว่าสำเร็จหรือไม่ก่อนใช้งาน

Timer นี้เหมาะสำหรับ:

  • อ่านค่าจาก sensor ตามระยะเวลา
  • ส่งข้อมูลแบบ periodic
  • ทำงานที่ต้องการความแม่นยำด้านเวลา
  • ทำงานในระบบ real-time

Leave a Comment