กลับไปหน้ารวมไฟล์
tilt-switch-alarm-38b0ff.md

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)

หัวใจของระบบนี้ประกอบด้วยอุปกรณ์หลักเพียงไม่กี่ชิ้น เพื่อเน้นความเรียบง่ายและเสถียรภาพ:

  1. Arduino UNO: สมองกลหลักในการประมวลผลลอจิก
  2. 5 Volt LEDs: ผมเลือกใช้ LED แบบที่มีตัวต้านทานในตัว (Built-in Resistors) เพื่อลดจำนวนอุปกรณ์บนบอร์ด (สีแดง 1 ดวง, สีเหลือง 1 ดวง)
  3. Non-mercury Tilt Switches: วางในมุมที่ต่างกันเพื่อเพิ่มความไวในการตรวจจับ
  4. 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 แบบลูกบอลมีความไวสูงมากเมื่อวางบนพื้นผิวเรียบ เพียงแค่การแตะโต๊ะเบาๆ ก็สามารถกระตุ้นระบบได้ ผมได้พยายามแก้ไขด้วยซอฟต์แวร์ผ่านสองวิธีแต่พบข้อจำกัด:

  1. ลดความถี่ในการสแกน (Polling Frequency): ไม่สามารถแก้ปัญหาระดับฮาร์ดแวร์ได้หมด
  2. ขยายขนาด Debounce Matrix: วิธีนี้ทำให้ ISR ทำงานนานเกินไป ซึ่งขัดต่อหลักการเขียนโปรแกรมฝังตัวที่ดี (ISR ควรจะสั้นและเร็วที่สุด)

ทางออกทางวิศวกรรม: สำหรับสวิตช์ที่มีขาอ่อน (Flexible leads) เราสามารถดัดตัวถังเพื่อให้ลูกบอลต้องกลิ้ง "ขึ้นเนิน" ก่อนจะสัมผัสวงจรเพื่อลดความไว แต่สำหรับสวิตช์ที่ใช้ในโปรเจกต์นี้ซึ่งมีขาที่แข็ง การปรับจูนจึงต้องเน้นไปที่การวางตำแหน่งเชิงกลเป็นหลัก

การดัดขาเพื่อปรับมุมเอียง (Slope) ช่วยลดความไวในสวิตช์บางรุ่น
สวิตช์ที่ผมเลือกใช้มีขาที่แข็งแรงมาก ทำให้ต้องเน้นการวางตำแหน่งที่แม่นยำแทน

บทสรุปและแหล่งอ้างอิง

โปรเจกต์นี้แสดงให้เห็นถึงการนำลอจิกการควบคุมระดับอุตสาหกรรม (เช่นการใช้ Timer Interrupts และ Debouncing) มาประยุกต์ใช้กับอุปกรณ์พื้นฐาน เพื่อสร้างระบบที่มีเสถียรภาพและใช้งานได้จริงในชีวิตประจำวัน

อ้างอิง:

ข้อมูล Frontmatter ดั้งเดิม

title: "Tilt switch alarm"
description: "Keep people off your stuff!"
author: "glennedi"
category: "Home & Automation"
tags:
  - "alarm"
views: 4458
likes: 1
price: 699
difficulty: "Easy"
components:
  - "1x 5 Volt Red LED"
  - "1x Piezo sounder element (small)"
  - "1x Arduino UNO"
  - "2x Non mercury tilt switch (PCB mount)"
  - "1x Arduino UNO development shield"
  - "1x 5 Volt Yellow LED"
tools: []
apps:
  - "1x Arduino IDE"
downloadableFiles:
  - "https://projects.arduinocontent.cc/07d9ba2e-2c9f-4b53-8dcc-82e894daf089.ino"
documentationLinks: []
passwordHash: "53315ae8c266bc94b1d7f8322657c59268c969fae3446bb0da4f4b256848e0d9"
encryptedPayload: "U2FsdGVkX19NOGHeG27LozCbCCs1lJ9morNn8XSpP/bYXADY6CM/wnNnmVKlK+7rarKj9HQSpF+njN3uY5FKrc3ZEy7hElTKjIYb1GHdMQE="
seoDescription: "Build a Tilt switch alarm with Arduino to protect your belongings. Learn to connect the Sensor and write simple alarm code."
videoLinks: []
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/tilt-switch-alarm-38b0ff_cover.jpg"
lang: "en"