title: "Push-Up Counter: ยกระดับการวิดพื้นด้วยระบบนับจำนวนอัตโนมัติ"
ในช่วงเวลาที่เราต้องใช้เวลาอยู่ที่บ้านมากขึ้น การออกกำลังกายกลายเป็นกิจกรรมสำคัญเพื่อรักษาฟิตเนสของร่างกาย แต่ปัญหาที่หลายคนเจอเหมือนกันคือ "การลืมนับจำนวนครั้ง" หรือการเสียสมาธิระหว่างทำเซตหนักๆ นี่คือแรงบันดาลใจในการสร้าง Push-Up Counter เครื่องช่วยนับจำนวนครั้งการวิดพื้นอัจฉริยะที่ใช้เซนเซอร์อัลตราโซนิกในการตรวจจับความเคลื่อนไหว พร้อมการแสดงผลแบบ Real-time และระบบแจ้งเตือนเมื่อทำครบเป้าหมาย
แนวคิดและหลักการทำงาน
โปรเจคนี้ถูกออกแบบมาให้เป็นอุปกรณ์วางบนพื้นภายใต้ตำแหน่งหน้าอกหรือหน้าผากของผู้ใช้งาน โดยใช้หลักการวัดระยะทางด้วยคลื่นเสียงเพื่อตรวจสอบว่าผู้ใช้งานย่อตัวลงมาใกล้พื้นมากพอที่จะนับเป็น 1 ครั้ง (Push-up rep) หรือไม่ โดยมีฟีเจอร์หลักดังนี้:
- Visual Feedback: ใช้ RGB LED แสดงสถานะระยะห่าง เพื่อช่วยเช็คฟอร์มการวิดพื้น
- LCD Display: แสดงจำนวนครั้งที่ทำได้จริงบนหน้าจอ 16x2
- Audio Notification: ส่งเสียงสัญญาณเตือนทุกๆ 10 ครั้ง เพื่อสร้างแรงจูงใจ
- Anti-Double Counting: ระบบ Logic ที่ป้องกันการนับซ้ำหากค้างตัวอยู่ในระยะต่ำนานเกินไป
รายละเอียดอุปกรณ์และบทบาทในเชิงวิศวกรรม
- Arduino Board: รับหน้าที่เป็นหน่วยประมวลผลกลาง คอยอ่านค่าจากเซนเซอร์และสั่งการ Output ต่างๆ
- Ultrasonic Sensor (HC-SR04): หัวใจหลักของระบบ ทำงานโดยการส่งคลื่นเสียงความถี่สูงออกไปและวัดระยะเวลาที่คลื่นสะท้อนกลับมา เพื่อคำนวณเป็นระยะห่าง (Distance) หน่วยเป็นเซนติเมตร
- LCD 16x2 (I2C หรือ Parallel): ใช้แสดงผลข้อความ "Push Ups:" และตัวเลขสะสม
- RGB LED: ทำหน้าที่เป็นตัวบอกระยะ (Indicator)
- สีแดง: ระยะห่างมากกว่า 20 ซม. (ยังอยู่ในท่าเตรียม)
- สีม่วง (Magenta): ระยะห่างระหว่าง 10 - 20 ซม. (กำลังย่อตัวลงมา)
- สีน้ำเงิน: ระยะห่างน้อยกว่า 10 ซม. (เข้าสู่จุดนับคะแนน)
- Passive Buzzer: อุปกรณ์สร้างเสียงแจ้งเตือนเมื่อทำครบทุกๆ 10 ครั้ง
- Push Button: ปุ่มสำหรับ Reset ค่าการนับกลับไปเป็นศูนย์เพื่อเริ่มเซตใหม่
วิเคราะห์เจาะลึก Source Code
หัวใจของโปรเจคนี้อยู่ที่การจัดการ Logic ในส่วนของ loop() ซึ่งมีการจัดการที่น่าสนใจดังนี้:
1. การคำนวณระยะทางที่แม่นยำ
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
ในโค้ดนี้ใช้สูตรการคำนวณระยะทางจากความเร็วเสียงที่ 340 เมตร/วินาที (หรือ 0.034 ซม./ไมโครวินาที) และหารด้วย 2 เพราะเป็นการเดินทางแบบไป-กลับ
2. ระบบไฟสถานะแบบผสมสี
ผู้พัฒนาใช้การควบคุมขา Digital สองขา (RED และ BLUE) เพื่อสร้างสีผสม:
- เมื่อ
distance <= 20ขา BLUE จะ HIGH เสมอ - ถ้า
distance > 20ขา RED จะ HIGH ทำให้เห็นเป็นสีแดง - ถ้าอยู่ระหว่าง 10-20 ซม. ทั้ง RED และ BLUE จะ HIGH ผลลัพธ์คือ สีม่วง (Magenta)
- ถ้าต่ำกว่า 10 ซม. RED จะถูกสั่ง LOW เหลือเพียงสีน้ำเงิน ซึ่งเป็นจุดยืนยันว่า "นับคะแนน"
3. การแก้ปัญหาการนับซ้ำ (State Handling)
นี่คือส่วนที่สำคัญที่สุดในเชิงวิศวกรรมซอฟต์แวร์:
while (distance <= 10) {
// วนลูปตรวจสอบระยะซ้ำๆ ตราบเท่าที่ผู้ใช้งานยังไม่ดันตัวขึ้น
// ... code วัดระยะซ้ำ ...
delay(100);
}
การใช้ while loop ครอบไว้หลังจากนับแต้มเพิ่ม (i++) จะทำให้โปรแกรม "หยุดรอ" ตราบใดที่ตัวผู้ใช้งานยังอยู่ใกล้เซนเซอร์ (น้อยกว่า 10 ซม.) โปรแกรมจะไม่นับแต้มต่อไปจนกว่าจะมีการดันตัวขึ้นไปพ้นระยะที่กำหนด วิธีนี้ช่วยตัดปัญหาการนับเลขรัวๆ ในการลงไปค้างเพียงครั้งเดียว
4. ระบบแจ้งเตือน Milestone
if (i == (10 * y) && x == (1 * y)) {
tone(b, 146.8); // เล่นเสียงทำนองแจ้งเตือน
// ...
x++; y++;
}
มีการใช้ตัวแปร y เป็นตัวคูณเพื่อตรวจสอบว่าจำนวนครั้งลงท้ายด้วย 10 หรือไม่ (10, 20, 30...) และสั่งให้ Buzzer เล่นทำนองสั้นๆ เพื่อให้ผู้ใช้งานทราบผลโดยไม่ต้องก้มลงมามองหน้าจอ
วิธีการใช้งาน
- เชื่อมต่อวงจรตาม Pin ที่ระบุใน Code (เช่น LCD ต่อขา 6, 7, 2, 3, 4, 5)
- วางอุปกรณ์ไว้บนพื้นในตำแหน่งที่ตรงกับหน้าผากหรือหน้าอกขณะย่อตัวลงสุด
- กดปุ่ม Reset เพื่อเริ่มนับจาก 0
- เริ่มทำการวิดพื้น โดยสังเกตไฟ LED:
- สีแดง: เตรียมพร้อม
- สีม่วง: ลงมาครึ่งทาง
- สีน้ำเงิน: นับคะแนน! (จะได้ยินเสียง Buzzer ทุกๆ 10 ครั้ง)
โปรเจคนี้เป็นตัวอย่างที่ดีเยี่ยมสำหรับการประยุกต์ใช้เซนเซอร์พื้นฐานในการแก้ปัญหาจริง (Real-world problem) และด้วยโครงสร้างโค้ดที่เข้าใจง่าย เหมาะอย่างยิ่งสำหรับผู้ที่เริ่มต้นศึกษา Arduino เพื่อพัฒนาไปสู่โปรเจค IoT ที่ซับซ้อนยิ่งขึ้นในอนาคต
หากคุณมีข้อสงสัยหรือต้องการปรับปรุงฟีเจอร์ เช่น การเก็บสถิติผ่านแอปพลิเคชันหรือการเพิ่มความแม่นยำด้วย Filter ทางคณิตศาสตร์ สามารถแลกเปลี่ยนความเห็นกันได้ครับ!