การสร้าง 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
);
แต่ละพารามิเตอร์มีความหมายดังนี้:
"dhtTimer"- เป็นชื่อของ Timer
- ใช้สำหรับการ debug และระบุตัวตนของ Timer
pdMS_TO_TICKS(1000)- แปลงเวลาจากมิลลิวินาที (ms) เป็น ticks
- 1000ms = 1 วินาที
pdMS_TO_TICKS()เป็นฟังก์ชันที่แปลงหน่วยเวลาให้เข้ากับ timer tick ของระบบ
pdTRUE- กำหนดว่าเป็น Auto-reload timer
pdTRUE: Timer จะทำงานซ้ำอัตโนมัติpdFALSE: Timer จะทำงานครั้งเดียวแล้วหยุด
(void *)0- Timer ID
- ใช้ระบุตัวตนของ Timer
- ค่า 0 หมายถึงไม่ได้กำหนด ID
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);
ข้อควรระวัง:
- Timer callback ควรทำงานเร็วและไม่ block การทำงาน
- หลีกเลี่ยงการใช้ delay ใน callback function
- ถ้าต้องการทำงานที่ใช้เวลานาน ควรส่งข้อมูลไปทำใน task อื่น
- ตรวจสอบการสร้าง Timer ว่าสำเร็จหรือไม่ก่อนใช้งาน
Timer นี้เหมาะสำหรับ:
- อ่านค่าจาก sensor ตามระยะเวลา
- ส่งข้อมูลแบบ periodic
- ทำงานที่ต้องการความแม่นยำด้านเวลา
- ทำงานในระบบ real-time