การทำงานของฟังก์ชัน pulseIn() ใน Arduino
ฟังก์ชัน pulseIn() ใน Arduino ใช้สำหรับวัดระยะเวลาที่สัญญาณที่เข้ามาอยู่ในสถานะหนึ่ง (HIGH หรือ LOW) ซึ่งเหมาะสำหรับการวัดสัญญาณพัลส์หรือสัญญาณที่เปลี่ยนแปลงตามเวลา ณ ที่นี้จะเป็นการยกตัวอย่างกับเซ็นเซอร์ที่ได้รับความนิยมในการวัดหาค่าระยะทาง เช่น สัญญาณจากเซ็นเซอร์ HC-SR04
Syntax ของฟังก์ชัน pulseIn()
pulseIn(pin, value);
pulseIn(pin, value, timeout);
- pin: ขาดิจิตอลที่ต้องการอ่านสัญญาณพัลส์
- value: ระบุสถานะที่ต้องการวัด เช่น
HIGH
หรือLOW
- timeout: (ไม่บังคับ) เวลา (หน่วยไมโครวินาที) ที่จะรอการเริ่มต้นพัลส์ หากไม่มีพัลส์เกิดขึ้นภายในเวลานี้ ฟังก์ชันจะคืนค่า 0
การทำงานของฟังก์ชัน pulseIn()
- จับสัญญาณแรก: เมื่อเรียกใช้ pulseIn() จะรอให้สถานะของขาที่กำหนดเปลี่ยนเป็นสถานะที่ต้องการ (เช่น จาก LOW เป็น HIGH) ซึ่งถือเป็นการเริ่มต้นพัลส์
- วัดความยาวของพัลส์: ฟังก์ชันจะเริ่มนับเวลาทันทีที่พบการเปลี่ยนสถานะจาก LOW เป็น HIGH (หรือจาก HIGH เป็น LOW ขึ้นอยู่กับค่าที่ตั้งไว้) และจะหยุดนับเมื่อสัญญาณกลับไปเป็นสถานะเดิม
- ส่งผลลัพธ์: ฟังก์ชันจะคืนค่าระยะเวลาที่สัญญาณอยู่ในสถานะที่ระบุ (HIGH หรือ LOW) โดยมีหน่วยเป็นไมโครวินาที
ตัวอย่างการทำงานของ pulseIn()
const int trigPin = 9;
const int echoPin = 10;
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
long duration;
float distance;
// ส่งพัลส์สัญญาณออกจากขา Trigger
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// ใช้ pulseIn() เพื่อวัดระยะเวลาที่ Echo เป็น HIGH
duration = pulseIn(echoPin, HIGH);
// คำนวณระยะทาง
distance = (duration * 0.0343) / 2;
// แสดงผลระยะทาง
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
delay(1000);
}
ในตัวอย่างนี้:
- เมื่อเซ็นเซอร์ HC-SR04 ส่งคลื่นเสียงออกไปและรอสัญญาณสะท้อนกลับ
pulseIn()
จะใช้ในการวัดระยะเวลาที่สัญญาณ Echo เป็น HIGH (ระยะเวลาที่คลื่นเสียงเดินทางไปและกลับ) - ฟังก์ชันนี้จะคืนค่าระยะเวลาเป็นไมโครวินาที ซึ่งจะถูกใช้คำนวณระยะทาง
ฟังก์ชัน pulseIn() ทำงานอย่างไร
- เริ่มต้นจับสถานะสัญญาณ:
pulseIn()
จะเริ่มจับสัญญาณที่เข้ามาในขาดิจิตอลที่กำหนดและรอจนกว่าสัญญาณจะเปลี่ยนเป็นสถานะที่ต้องการ เช่น จาก LOW เป็น HIGH - เริ่มนับเวลา: เมื่อพบการเปลี่ยนสถานะ ฟังก์ชันจะเริ่มนับเวลาทันที และจะหยุดนับเมื่อสถานะสัญญาณกลับมาเป็นสถานะตรงข้าม เช่น เมื่อ HIGH เปลี่ยนเป็น LOW
- คืนค่าระยะเวลา: เมื่อสิ้นสุดการนับ ฟังก์ชันจะคืนค่าระยะเวลาที่สัญญาณอยู่ในสถานะที่ต้องการ โดยระยะเวลานั้นมีหน่วยเป็นไมโครวินาที
ตัวอย่างการใช้ pulseIn() ร่วมกับ timeout
บางครั้งเราอาจต้องการกำหนดเวลาในการรอพัลส์ เช่น ถ้าพัลส์ไม่มีการเปลี่ยนแปลงภายในเวลาที่กำหนด ฟังก์ชันจะหยุดทำงานและคืนค่า 0 แทน:
long duration = pulseIn(echoPin, HIGH, 1000000); // รอพัลส์ 1 วินาที
ถ้าไม่มีพัลส์เกิดขึ้นภายใน 1 วินาที ฟังก์ชันจะคืนค่า 0
ข้อดีและข้อจำกัด
ข้อดี:
- ง่ายต่อการใช้งานโดยไม่ต้องเขียนฟังก์ชันตรวจจับสัญญาณเอง
- ใช้งานได้หลากหลาย เช่น การวัดระยะทาง การตรวจจับพัลส์ หรือการนับเวลาสัญญาณ
ข้อจำกัด:
- ในขณะที่
pulseIn()
ทำงาน โปรแกรมจะหยุดรอการตรวจจับพัลส์ ทำให้การทำงานอื่นใน loop ช้าลง หากเขียนโปรแกรมที่มีความซับซ้อน มีการอ่านค่าเซ็นเซอร์หลายๆตัว หรือปัจจัยอื่นๆที่เกี่ยวข้องกับเวลาในการทำงานให้พิจารณาตรงจุดนี้ด้วย - ถ้าไม่มีพัลส์หรือพัลส์ไม่เปลี่ยนสถานะ ฟังก์ชันอาจทำให้โปรแกรมหยุดทำงานได้ชั่วคราว (แต่สามารถใช้ timeout เพื่อป้องกันกรณีนี้ได้)
ฟังก์ชัน pulseIn()
เหมาะกับการใช้งานที่ต้องการการวัดสัญญาณแบบพัลส์อย่างละเอียด แต่ควรใช้อย่างระมัดระวังในกรณีที่ต้องการประสิทธิภาพของการทำงานหลายอย่างพร้อมกัน