Introduction
บางทีเราก็ต้องการนาฬิกานับถอยหลังที่วนลูปนับเวลาเดิมซ้ำๆ หลายๆ รอบน่ะ
ตัวอย่างเช่น ถ้าเรากำลังออกกำลังกายในยิม แล้วอยาก dedicate เวลาให้แต่ละท่าทำละ 1 นาที พอนาฬิกานับถอยหลังจบ มันต้องส่งเสียงปลุก แล้วตัวจับเวลาก็ต้องรีเซ็ตกลับไปที่เวลาที่เราตั้งไว้ พร้อมเริ่มนับใหม่ได้ด้วยการกดปุ่มเดียว
เราอยากให้นาฬิกาตัวนี้ตั้งค่าได้ง่ายๆ ด้วย
การทำงานของนาฬิกาสำหรับฟิตเนส
เป้าหมายคือให้ทำแต่ละท่าออกกำลังกายในเวลาที่กำหนด ซึ่งนาฬิกามีฟังก์ชันเดียวเลยคือ COUNTDOWN
เป้าหมายรองๆ ลงมาคือ:
- ต้องตั้งค่าได้ง่ายมากๆ จะได้โฟกัสกับท่าออกกำลังกายได้เต็มที่
- ต้องหยุดและเริ่มใหม่ได้ง่ายมากๆ
- ต้องให้เวลาเราเตรียมท่าเริ่มต้นก่อนเริ่มนับจริงได้
1 - เมื่อเปิดนาฬิกา มันจะตั้งไว้ที่ 00:00
2 - ทุกครั้งที่กด Reset มันจะกลับมาที่สถานะนี้
3 - กดปุ่ม +1 นาฬิกาจะเพิ่มเวลา 1 นาทีเข้าไปในตัวนับถอยหลังที่แสดงอยู่
4 - กดปุ่ม +5 จะเพิ่มเวลา 5 นาที
5 - กดปุ่ม +10 จะเพิ่มเวลา 10 นาที
6 - ต้องจำไว้ตอนเขียนโปรแกรมนะ ว่าเวลาสูงสุดคือ 99 นาที
7 - กดปุ่ม Start
- ถ้ายังไม่ได้ตั้งเวลา จะได้ยินเสียงเตือน error
- ถ้าตั้งเวลาแล้ว มันจะทำงานตามนี้
- มันจะนับถอยหลังจาก 5 ลงไป 0 พร้อมเสียงบี๊บแบบ Formula One ทุกวินาที และเสียงดังขึ้นเมื่อถึง 0
- จากนั้นจะเริ่มนับถอยหลังจริงตามเวลาที่แสดงบนจอ
- เมื่อนับถอยหลังจบ จะมีเสียงปลุก
- นาฬิกาจะรีเซ็ตกลับไปที่เวลาที่ตั้งไว้
8 - เมื่อกด Start ในสถานะต่างๆ:
- NOT_SET : จะมีเสียง error
- READY : จะเริ่มนับถอยหลัง
- COUNTING : จะหยุดนับถอยหลัง
- PAUSE : จะเริ่มนับถอยหลังต่อ
9 - เมื่อกดปุ่ม +1, +5 และ +10 ในสถานะต่างๆ:
- NOT_SET : ตั้งค่านับถอยหลังเป็นค่าที่กด
- READY : เพิ่มค่าลงไปในเวลานับถอยหลัง
- COUNTING : ไม่มีผล
- PAUSE : ไม่มีผล
10- เมื่อกดปุ่ม Reset ในสถานะต่างๆ:
- NOT_SET : โปรแกรมถูกรีเซ็ต
- READY : โปรแกรมถูกรีเซ็ต
- COUNTING : การนับจบลง โดยไม่มีเสียงปลุกสุดท้าย และรีเซ็ตกลับไปที่เวลาที่ตั้งไว้
- PAUSE : การนับจบลง โดยไม่มีเสียงปลุกสุดท้าย และรีเซ็ตกลับไปที่เวลาที่ตั้งไว้
First prototype
ใน prototype ตัวแรกนี้เรามีสามฟังก์ชันการทำงาน เราเอามาต่อรวมกันไว้ที่นี่หมดเลย แต่เราจะทดสอบแต่ละส่วนด้วยโปรแกรมแยกกันนะ ฟังก์ชันแรกคือเรื่องการแสดงผล เวลานับถอยหลังและข้อมูลอื่นๆ บนจอ 7 segments 4 หลัก ฟังก์ชันที่สองคือเรื่องปุ่มกด ที่จะใช้ควบคุม prototype และฟังก์ชันที่สามคือเรื่องเสียง ที่ prototype จะเล่นออกมา


High-Intensity Training (HIIT) Chronometer
โปรเจคนี้คือตัวจับเวลาช่วง (Interval Timer) แบบโหดๆ ที่เห็นชัดเจนในทุกสภาพแสง เอาไว้จัดการลำดับการออกกำลังกายและช่วงพักฟื้นแบบอัตโนมัติ
- Dual-Phase Timer Logic: ผู้ใช้สามารถตั้งค่าช่วง "Work" และ "Rest" ผ่านปุ่มกดได้เลย Arduino จะจัดการเปลี่ยนสถานะให้ พร้อมส่งเสียงบี๊บดัง 80dB ตอนเริ่มและจบแต่ละเซ็ต
- High-Brightness Visualization: ใช้จอแสดงผล 7-Segment 4 หลัก ขนาดใหญ่ Firmware มีโหมด "Final 10-Second Countdown" ที่ให้ไฟกระพริบเร็วๆ เพื่อกระตุ้นนักกีฬา
- One-Touch "Start/Pause" Hub: มีปุ่มใหญ่แบบตู้เกมตีได้เลย (Slap button) สำหรับเริ่มและหยุดจับเวลา ออกแบบมาให้จับถนัดมือแม้จะเหงื่อออกหรือใส่ถุงมือ
ทดสอบการทำงานของจอแสดงผล
แผนภาพต่อไปนี้จะแสดงการต่อทรานซิสเตอร์ทั้งสี่ตัวกับตัวต้านทาน (Resistor) ของมัน และขาใน Arduino ที่ต้องต่อเข้าไป โปรแกรมชื่อ "Display4Digits_Test.ino" ต้องถูกอัพโหลดลงบอร์ดเพื่อทดสอบว่าจอแสดงผลต่อถูกต้องแล้ว
โปรแกรมนี้จะทำการเปิด-ปิดทุก Segment ในทุก Digit แบบต่างๆ 3 รูปแบบ และสุดท้ายจะแสดงตัวเลข 0 ถึง 9 บนแต่ละหลัก
ถ้าทดสอบแล้วเวิร์ค ก็ไปต่อในส่วนถัดไปได้เลยจ้า
ต้องระวังไว้นิดนึงว่า จอแสดงผลมีหลายรุ่นมาก แต่ละรุ่นก็มีการจัดเรียงขา (Pin Configuration) และรายละเอียดเฉพาะตัวต่างกันไป ต้องปรับค่าขาในโปรแกรมทดสอบให้ตรงกับจอที่ใช้ ถึงจะรันได้ตามที่คาดหวังนะ
ทดสอบการทำงานของปุ่มกด
ทีนี้เราจะมาทดสอบกันว่าปุ่มทั้งสี่ปุ่มบนต้นแบบ (Prototype) ทำงานได้ดีมั้ย
ไหนๆ ก็มีจอแสดงผลทำงานอยู่แล้ว เราก็ใช้มันแสดงผลการทดสอบของเราสิ
เราตั้งชื่อปุ่มว่า "+1 button", "+5 button", "+10 button", "reset" และ "start"
เมื่อกดปุ่ม +1 จอจะแสดง "1111" และแสดง "5555" เมื่อกดปุ่ม +5 ตามตรรกะแล้ว ถ้ากดปุ่ม +10 จอจะแสดง "0000" ส่วนปุ่ม reset จะแสดง "3333" และปุ่ม start จะแสดง "8888"
- +1 = 1111
- +5 = 5555
- +10 = 0000
- Reset = 3333
- Start = 8888
โค้ดตัวอย่างสำหรับการทดสอบนี้สามารถดูได้ในโปรเจคหลักเลยนะ
ทดสอบการทำงานของเสียง
เราต้องการเสียงอย่างน้อยสี่แบบที่แตกต่างกัน
- End Count Sound สำหรับตอนที่การนับถอยหลังจบลง
- Error Sound เมื่อเกิดข้อผิดพลาดหรือการทำงานที่ผิดปกติ
- Go Sound ในช่วงนับถอยหลังสั้นๆ "Be Ready" เป็นเสียงสุดท้ายที่ตรงกับเวลา Zero พอดี
- เสียง F1 ในตอนนับถอยหลังรอบที่แล้ว ทุกๆ วินาที
หลังจากที่เราลองกดปุ่มกันจนหนำใจแล้ว คราวนี้เราจะมาเซ็ตเสียงให้กับปุ่มแต่ละปุ่มกัน ตามนี้เลย:
- ปุ่ม +1: เสียงนับถอยหลังจบ (End Count Sound)
- ปุ่ม +5: เสียงเตือนเมื่อมีอะไรผิดพลาด (Error Sound)
- ปุ่ม +10: เสียงสตาร์ท (Go Sound)
- ปุ่ม Reset: เสียงรถ F1 นั่นแหละ (F1 Sound)
โค้ดสำหรับทดสอบส่วนนี้ก็ลองไปดูกันได้ อย่าลืมเซฟเก็บไว้ล่ะ
การประกอบ Shield
การประกอบโมดูลสำหรับปุ่มกดและจอแสดงผล
Shield พร้อมชิ้นส่วนทั้งหมดที่ประกอบเสร็จแล้ว
โชว์ของทั้งหมด ก่อนจะเอาไปประกอบเข้าด้วยกันเป็นชิ้นเดียว