ชื่อโปรเจกต์: Serial Timer
โปรเจกต์นี้พี่จะโชว์ให้ดูว่าการทำ Timer คุม Output มันทำยังไง จัดไปวัยรุ่น!
#include "SerialTimer.h"
//* Objects
Timer clock1(3);
Timer clock2(4);
Timer clock3(13);
ขั้นแรก ยัด Library เข้าไปก่อน แล้วค่อยประกาศ Object (ที่เป็น Output ของเรา) ตามนี้เลยน้อง
void timer_switch(int isPin, float Time, bool serial_on_off, int mode) //ฟังก์ชันสำหรับคุมหลาย Timer
{ //อยากได้กี่เคสก็จัดไปตามศรัทธา
unsigned long past = millis();
switch (mode)
{
case 0:
Serial.println("\
เริ่มจับเวลาแล้วนะจ๊ะ");
switch (isPin) // ตรงนี้เพิ่มเคสเข้าไปได้เลยตามต้องการ
{
case 1:
clock1.set_timer(Time, past);//ตั้งเวลาไป
break;
case 2:
clock2.set_timer(Time, past);
break;
case 3:
clock3.set_timer(Time, past);
break;
default:
Serial.println("Error ว่ะน้อง");
}
break;
case 1:
switch (isPin) // ตรงนี้ก็เหมือนกัน อยากได้กี่ Case ก็ใส่ไป อย่าให้ช็อตนะ
{
case 1:
clock1.switch_pin(serial_on_off);//เปลี่ยนสถานะ Pin
Serial.println(clock1.get_pin());//อ่านสถานะมาโชว์หน่อย
break;
case 2:
clock2.switch_pin(serial_on_off);
Serial.println(clock2.get_pin());
break;
case 3:
clock3.switch_pin(serial_on_off);
Serial.println(clock3.get_pin());
break;
default:
Serial.println("Error");
break;
}
break;
default:
Serial.println("Error");
}
ถ้าเกิดอยากได้ Output มากกว่า 3 ช่อง น้องก็แค่มาแก้ Code ตรงนี้ เพิ่ม Case เข้าไปเองนะ ไม่ยากเกินฝีมือหรอก
void setup()
{
Serial.begin(9600);
menu();
}
ที่สำคัญเลยคือ ต้อง Initialize Serial แล้วก็อย่าลืมเรียกฟังก์ชัน menu() มาใช้ด้วยล่ะ
void loop()
{
rx_menu(3); //เมนูหลัก
clock1.get_valor(); // เช็กดูว่าเวลาครบหรือยัง
clock2.get_valor();
clock3.get_valor();
}
ในส่วนของ Loop น้องก็แค่ประกาศฟังก์ชัน "rx_menu" กับ "get_valor" ของ Timer แต่ละตัวเพื่อให้ระบบมันทำงานได้ หล่อเท่เลยงานนี้

จะใช้ Module HC05 หรือ Bluetooth ตัวไหนก็ได้นะ แล้วไปโหลดแอป "Serial Bluetooth" มาไว้ส่งคำสั่ง คูลๆ เลยน้อง

รายละเอียดทางเทคนิคเจาะลึก (แบบฉบับรุ่นพี่)
การวิเคราะห์การรัน Code ระดับ Microsecond
ไอ้เจ้า Serial Timer เนี่ย มันคือเครื่องมือชั้นยอดเลยนะเอาไว้เช็กว่า Code แต่ละส่วนมันรันช้าหรือเร็วแค่ไหน จะได้เอาไปรีดประสิทธิภาพ Firmware ของเราให้แรงทะลุนรก
- การติดตามเวลาด้วย Hardware: พี่ใช้ฟังก์ชัน
micros()มาเก็บ Timestamp ทั้งก่อนรันและหลังรัน Code ที่เราสนใจ แล้วให้ Arduino คำนวณหาค่าต่างหรือ "Delta" (หน่วยเป็น Microsecond) มาพ่นออกทาง Serial Monitor ให้เราดู - การวิเคราะห์ Loop Frequency: (อันนี้สายโหด) ตัว Timer นี้สามารถหาค่าเฉลี่ย "Loop-Time" ได้จากการรันสัก 1,000 รอบ เพื่อเอามาดูว่าระบบควบคุมแบบ Real-time ของเรามันมีคอขวดตรงไหนหรือเปล่า
เอาไปใช้งานจริงยังไง?
- การทดสอบประสิทธิภาพ (Benchmarking): เหมาะมากถ้าจะเอาไปเทียบกันจะๆ ว่าอัลกอริทึมที่เราเขียน (อย่างพวก Bubble Sort กับ Quick Sort) พอไปรันบน Hardware จริงๆ แล้ว ตัวไหนมันจะแน่กว่ากัน วัดกันที่เวลาไปเลยน้อง!