title: โปรเจกต์เครื่องเตือนภัยการสั่นสะเทือนด้วย Arduino และเซนเซอร์ Tilt Switch (Non-Mercury)
บทนำ: การกลับมาของระบบรักษาความปลอดภัยขนาดเล็ก
เมื่อหลายปีก่อน ผมเคยสร้างเครื่องเตือนภัยการเคลื่อนไหว (Movement Alarm) โดยใช้เซนเซอร์ตรวจจับแรงกระแทก (Shock Switch), หลอด LED, Piezo Sounder และควบคุมด้วยไมโครคอนโทรลเลอร์ PIC ในครั้งนี้ผมตัดสินใจนำโปรเจกต์นี้กลับมาปัดฝุ่นใหม่ด้วย Arduino พร้อมกับการปรับปรุงฟังก์ชันการทำงานให้ตอบโจทย์การใช้งานจริงมากขึ้น
หัวใจสำคัญของการออกแบบนี้อยู่ที่ "พฤติกรรม" (Behaviors) ของระบบที่ผมต้องการให้เป็นมืออาชีพ:
- ระบบหน่วงเวลาตอนเริ่มต้น (Set Delay): เพื่อให้ผู้ใช้มีเวลาวางเครื่องเตือนภัยไว้ในตำแหน่งที่ต้องการโดยไม่ส่งเสียงดังทันที
- การรีเซ็ตอัจฉริยะ: หากเซนเซอร์ตรวจพบการสั่นสะเทือนระหว่างช่วงหน่วงเวลา ระบบจะเริ่มนับเวลาใหม่ทันทีเพื่อให้แน่ใจว่าเครื่องนิ่งสนิทก่อนเริ่มทำงาน
- ช่วงเวลาผ่อนปรน (Disarm Delay): เมื่อเครื่องถูกกระตุ้น (Tripped) จะมีช่วงเวลาสั้นๆ ให้ผู้ใช้ที่ถูกต้องสามารถเข้ามาปิดเครื่องได้ก่อนที่ไซเรนจะแผดเสียง
- ฟังก์ชันบันทึกเหตุการณ์: หลังจากเสียงเตือนดังครบเวลาที่กำหนด หากมีการขยับเครื่องอีกครั้ง หลอด LED จะติดสว่างเป็นเวลา 5 วินาที เพื่อแจ้งให้เจ้าของทราบว่า "เครื่องเคยถูกกระตุ้นไปแล้ว" ในขณะที่คุณไม่อยู่
การปรับปรุงด้านความปลอดภัยและสิ่งแวดล้อม
ในเวอร์ชันดั้งเดิม ผมใช้ Shock Switch แบบปรอท (Mercury Switch) ซึ่งทำงานได้ดีแต่มีข้อเสียร้ายแรงคือสารพิษจากโลหะหนัก ในโปรเจกต์ใหม่นี้ผมจึงเลือกใช้ Non-mercury Tilt Switches จำนวน 2 ตัวแทน ซึ่งใช้ลูกบอลโลหะขนาดเล็กภายในในการตัดต่อวงจร ปลอดภัยต่อผู้ใช้และเป็นมิตรต่อสิ่งแวดล้อมมากกว่า
รายละเอียดการออกแบบวงจร (Circuit Description)
หัวใจของระบบนี้ประกอบด้วยอุปกรณ์หลักเพียงไม่กี่ชิ้น เพื่อเน้นความเรียบง่ายและเสถียรภาพ:
- Arduino UNO: สมองกลหลักในการประมวลผลลอจิก
- 5 Volt LEDs: ผมเลือกใช้ LED แบบที่มีตัวต้านทานในตัว (Built-in Resistors) เพื่อลดจำนวนอุปกรณ์บนบอร์ด (สีแดง 1 ดวง, สีเหลือง 1 ดวง)
- Non-mercury Tilt Switches: วางในมุมที่ต่างกันเพื่อเพิ่มความไวในการตรวจจับ
- Piezo Sounder: ลำโพงขนาดเล็กสำหรับส่งสัญญาณเตือน
สำหรับการประกอบ ผมเลือกใช้ Arduino Development Shield เนื่องจากมีพื้นที่บอร์ดไข่ปลา (DIL solder pads) ที่เอื้อต่อการจัดวางเลย์เอาต์ของ Tilt Switches และ LED ให้มีความมั่นคงแข็งแรง
การวิเคราะห์ซอฟต์แวร์และลอจิกการควบคุม (Software Logic)
ความซับซ้อนของโปรเจกต์นี้ไม่ได้อยู่ที่หน้าตา แต่เครื่องมือภายในที่ใช้คือ Timer Interrupt และ Debounce Matrix เพื่อจัดการกับสัญญาณรบกวนจากสวิตช์เชิงกล
1. ระบบจัดการสัญญาณรบกวน (ISR & Debouncing)
โค้ดใช้ Timer1 ตั้งค่าความถี่ที่ 100Hz (ทุกๆ 10ms) เพื่อเรียกใช้งาน Interrupt Service Routine (ISR) ในการตรวจสอบสถานะของสวิตช์
ISR(TIMER1_COMPA_vect) {
// อ่านค่าจากปุ่มและเก็บลงใน Matrix
// ใช้การ AND ค่าในอาเรย์เพื่อตรวจสอบว่าสวิตช์นิ่งจริงๆ หรือไม่ (Debouncing)
// หากมีการเปลี่ยนแปลง จะกำหนดให้ sensor_changed = true;
}
การใช้เทคนิคเก็บสถานะลงใน State[MAX_CHECKS] และใช้ลอจิก Bitwise AND ช่วยให้ระบบไม่ "ตื่นตูม" กับสัญญาณไฟฟ้าที่กระโดด (Bounce) เพียงชั่วคราว แต่จะยืนยันการสั่นสะเทือนก็ต่อเมื่อค่าคงที่เป็นเวลา 10 รอบการสแกนต่อเนื่อง (100ms)
2. ลำดับการทำงานของโปรแกรม (Main Loop)
- ช่วง Arming (หน่วงเวลาเริ่มต้น): ไฟสีเหลืองจะกระพริบ 4 ครั้ง และไฟสีแดง 1 ครั้ง หากมีการสั่นสะเทือนในช่วงนี้ ตัวนับเวลาจะ Reset ทันที
- ช่วง Monitoring: ระบบจะหยุดรอจนกว่า
sensor_changedจะกลายเป็นจริง - ช่วง Pre-Alarm: ไฟสีแดงจะกระพริบเพื่อเตือนว่าเครื่องถูกตรวจจับแล้ว ให้เวลา 9 วินาทีก่อนส่งเสียง
- ช่วง Alarm: สั่งงาน Piezo Sounder ที่ความถี่ 4000Hz ซึ่งเป็นความถี่เรโซแนนซ์ (Resonant Frequency) ของอุปกรณ์ เพื่อให้ได้ระดับเสียงที่ดังที่สุด
ประเด็นเรื่องความไว (Sensitivity) และข้อจำกัดทางวิศวกรรม
จากการทดสอบ พบว่า Tilt Switch แบบลูกบอลมีความไวสูงมากเมื่อวางบนพื้นผิวเรียบ เพียงแค่การแตะโต๊ะเบาๆ ก็สามารถกระตุ้นระบบได้ ผมได้พยายามแก้ไขด้วยซอฟต์แวร์ผ่านสองวิธีแต่พบข้อจำกัด:
- ลดความถี่ในการสแกน (Polling Frequency): ไม่สามารถแก้ปัญหาระดับฮาร์ดแวร์ได้หมด
- ขยายขนาด Debounce Matrix: วิธีนี้ทำให้ ISR ทำงานนานเกินไป ซึ่งขัดต่อหลักการเขียนโปรแกรมฝังตัวที่ดี (ISR ควรจะสั้นและเร็วที่สุด)
ทางออกทางวิศวกรรม: สำหรับสวิตช์ที่มีขาอ่อน (Flexible leads) เราสามารถดัดตัวถังเพื่อให้ลูกบอลต้องกลิ้ง "ขึ้นเนิน" ก่อนจะสัมผัสวงจรเพื่อลดความไว แต่สำหรับสวิตช์ที่ใช้ในโปรเจกต์นี้ซึ่งมีขาที่แข็ง การปรับจูนจึงต้องเน้นไปที่การวางตำแหน่งเชิงกลเป็นหลัก


บทสรุปและแหล่งอ้างอิง
โปรเจกต์นี้แสดงให้เห็นถึงการนำลอจิกการควบคุมระดับอุตสาหกรรม (เช่นการใช้ Timer Interrupts และ Debouncing) มาประยุกต์ใช้กับอุปกรณ์พื้นฐาน เพื่อสร้างระบบที่มีเสถียรภาพและใช้งานได้จริงในชีวิตประจำวัน
อ้างอิง:
- [1] เครื่องคำนวณค่า Timer สำหรับ AVR: https://www.arduinoslovakia.eu/application/timer-calculator