กลับไปหน้ารวมไฟล์
phone-call-indicator-cum-panic-switch-93a611.md

ชื่อโปรเจกต์: Phone Call Indicator cum Panic Switch

คุณพ่อของพี่ท่านเริ่มมีอายุแล้วครับน้องๆ ปัญหาก็คือท่านใช้พวก Smartphone ไม่ค่อยถนัด แถมหูยังไม่ค่อยดีอีก เวลาคนโทรมาทีไรท่านไม่เคยรู้เรื่องเลย พี่เลยปิ๊งไอเดียว่าถ้ามีตัวช่วยบอกสัญญาณแบบเห็นชัดๆ หรือมีเสียงเตือนตอนสายเข้าก็น่าจะดี ระหว่างทำโปรเจกต์พี่เลยแถมฟีเจอร์เด็ดเพิ่มเข้าไปด้วย คือทำเป็น Panic Switch ไว้กดโทรหรือส่งข้อความหาเบอร์ที่ตั้งไว้ได้ทันที เผื่อมีเหตุฉุกเฉิน จัดไปวัยรุ่น!

ตอนแรกพี่ก็เริ่มจากใช้ Arduino Pro Mini กับ HC-05 Bluetooth Module ต่อบน Breadboard ลองไฟ LED กับสวิตช์ง่ายๆ ก่อน แต่พอทุกอย่างลงตัว พี่ก็จัดการย้ายลง PCB ที่ออกแบบเองกับมือ แถมทำกล่อง Acrylic ใส่ให้ดูหล่อเท่กว่าเดิมเยอะ

ไหนๆ พี่ก็ลงมือทำเองทุกขั้นตอนแล้ว ทั้ง PCB ทั้งกล่อง พี่ว่าโปรเจกต์นี้เหมาะมากสำหรับน้องๆ ที่อยากลองทำโปรเจกต์แบบ End-to-End (ตั้งแต่ต้นจนจบ) จะได้ไม่ต้องเสียเวลาไปงมหาอุปกรณ์เอง หรือถ้าน้องคนไหนมีไอเดียเจ๋งกว่านี้ จะเอาไปต่อยอดพี่ก็ยินดีมากครับ

เดี๋ยวพี่จะแบ่งขั้นตอนเป็น Step ย่อยๆ จะได้ทำตามกันง่ายๆ นะ:

  • ภาพรวมของระบบ (High level view)
  • การสื่อสาร Bluetooth บน Android
  • การสื่อสาร Serial บน Arduino
  • การประกอบบน Breadboard
  • การย้ายอุปกรณ์ลง PCB
  • การทำกล่อง (Acrylic Enclosure)

High Level View:

จริงๆ หลักการมันพื้นฐานมากน้องเอ๊ย! มันคือการสร้างช่องทางสื่อสาร (Serial Communication) ระหว่าง Android (โทรศัพท์) กับ Bluetooth Module (ที่ต่ออยู่กับ Arduino) ผ่านทาง Android App นั่นเอง พอมีสายเรียกเข้า โทรศัพท์ก็จะส่งข้อความชุดหนึ่งไปให้ Bluetooth Module แล้ว Arduino ก็จะอ่านค่านั้นมาเช็คตามที่เขียนโปรแกรมไว้ ในเคสนี้คือสั่งให้ Buzzer ดังสนั่นหวั่นไหว และพี่ก็ใส่สวิตช์ Manual Reset ไว้ให้กดปิดเสียงตอนทุกอย่างกลับสู่ภาวะปกติด้วย

LED สีแดงกับ [Buzzer](https://s.shopee.co.th/6pvZFdZdRf) ทำงานตอนสายเข้า

ส่วนขากลับ (Panic Switch Mode) พอเรากดปุ่มปุ๊บ Arduino ก็จะส่งชุดตัวอักษรกลับไปที่ Android App แล้วตัว App ก็จะจัดการโทรออกไปยังเบอร์ที่ตั้งค่าไว้ทันที หล่อเท่เลยงานนี้

Android Phone โทรออกหาเบอร์ที่ตั้งไว้เมื่อกดสวิตช์

Android Bluetooth Communication

เรื่องการเขียนแอปสื่อสารระหว่าง Android กับ Arduino พี่ได้ศึกษา Code มาจากแหล่งข้อมูลต่างๆ ซึ่งหัวใจสำคัญคือเรื่อง Threads และ Handlers ใน Android ครับน้องๆ จำไว้เลยว่าอะไรที่ต้องรอนานๆ หรือทำงานต่อเนื่องห้ามไปรันบนหน้า User Interface หลักเด็ดขาด ไม่งั้นแอปค้างนะจ๊ะ ต้องแยกไปรันเป็น Thread ข้างหลัง ส่วน Handler ก็เอาไว้ใช้ส่งข้อมูลข้ามไปมานั่นเอง

สำหรับการเชื่อมต่อ HC-05 กับโทรศัพท์ Android น้องต้องจับคู่ (Pair) มันให้เรียบร้อยก่อน และทางที่ดีในโทรศัพท์ควรจะ Pair ไว้แค่ตัวเดียว เพื่อความชัวร์ในการทำงานครับ

การสื่อสารระหว่างสองอุปกรณ์มีขั้นตอนคือ:

  • สร้างช่องทางสื่อสาร (Interface)
  • รับ-ส่งข้อมูลระหว่างกัน

ในโปรเจกต์นี้ เราสร้างทางเชื่อมระหว่าง Android กับ Bluetooth (HC-05 Module) และมี Serial Interface เชื่อมระหว่าง HC-05 กับ Arduino อีกที สรุปสั้นๆ คือ Android ส่งข้อมูลมา Arduino ก็รับผ่านทาง HC-05 นั่นแหละ

ขั้นตอนบน Android มีดังนี้:

  • Get the BT Adapter - เช็คก่อนว่าเครื่องรองรับ Bluetooth ไหม โดยใช้ Method getDefaultAdapter() ถ้าเครื่องมีฟังก์ชันนี้มันจะส่ง Object กลับมาให้

ในไฟล์ MainActivity.java บรรทัดที่ 83 จะเช็คแบบนี้:

btAdapter = BluetoothAdapter.getDefaultAdapter();
  • Get the BT Device - ตัว btAdapter จะมี Property ชื่อ getBondedDevices() ไว้ลิสต์รายชื่ออุปกรณ์ที่ Pair ไว้ ถ้าเรา Pair ไว้ตัวเดียว HC-05 ของเราก็จะอยู่ลำดับแรกสุดเลย

บรรทัดที่ 191 และ 192 ใน MainActivity.java จะเป็นการดึง BTDevice ออกมา:

btDevice = (BluetoothDevice) (btAdapter.getBondedDevices().toArray())[0];
               btAdapter.getRemoteDevice(String.valueOf(btDevice));
  • Open a BT Socket - พอได้ Object ของอุปกรณ์มาแล้ว เราก็ต้องเปิด Socket ระหว่างโทรศัพท์กับ HC-05 ซึ่งต้องใช้ UUID ของอุปกรณ์นั้นๆ

  • สำหรับ HC-05 ซึ่งเป็นอุปกรณ์ประเภท SPP (Serial Port Profile) จะมี UUID ตายตัวคือ "00001101-0000-1000-8000-00805F9B34FB" บรรทัดที่ 54 ใน MainActivity.java จะแปลง String นี้เป็น UUID:

private final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb");
public void run() {
           try {
               mmSocket = btDevice.createInsecureRfcommSocketToServiceRecord(MY_UUID);
               mmSocket.connect();
           } catch (IOException e) {
               cont = false;
               Message message = Message.obtain();
               message.what = SOCKET_NOT_CONNECTED;
               handler.sendMessage(message);
               e.printStackTrace();
           }
           if ((mmSocket != null) && (cont)) {
               Message message = Message.obtain();
               message.what = SOCKET_OPENED;
               handler.sendMessage(message);
               socket = mmSocket;
           }
       }
   }
  • Read and Write using the BT Socket - หลังจากนี้ก็สั่งอ่านและเขียนข้อมูลผ่าน Socket ได้เลย สู้งานนะน้อง!

EXPANDED TECHNICAL DETAILS

Integrated Safety & Notification HUB

โปรเจกต์นี้เป็นศูนย์กลางแจ้งเตือนความปลอดภัย โดยจะแสดงไฟเตือนที่มองเห็นชัดเจนเมื่อมีสายเข้า และมีปุ่ม Panic สำหรับเหตุฉุกเฉิน

  • Android App Bluetooth Handshake: ใช้ HC-05 BT module เชื่อมต่อกับแอปที่เขียนจาก Android Studio เมื่อโทรศัพท์มีสายเข้า แอปจะส่ง Byte Code เฉพาะเจาะจงไปที่ Arduino
  • Multicolor LED Status Matrix: มีการเปลี่ยนสีตามสถานะ เช่น "สีน้ำเงิน" เมื่อมีสายเข้า และ "สีแดงกะพริบ" เมื่อเกิดเหตุฉุกเฉิน ซึ่งโหมด Panic นี้จะทำงานเมื่อกดปุ่มขนาดใหญ่ที่ตัวเครื่อง

Hardware

  • EAGLE PCB Optimization: พี่ออกแบบวงจรเป็น custom PCB ขนาดกะทัดรัดด้วยโปรแกรม Autodesk EAGLE เพื่อให้ตัวเครื่องมีขนาดเล็กพอที่จะวางบนโต๊ะหรือพกพาได้สะดวก ห้ามทำช็อตนะตัวนี้!

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

title: "Phone Call Indicator cum Panic Switch"
description: "Bluetooth and Android-based call indicator with panic switch for calling a preset number."
author: "ratnaddeepjoshi"
category: "Internet of Things, BT & Wireless"
tags:
  - "hc-05"
  - "bluetooth"
  - "android"
views: 4970
likes: 1
price: 699
difficulty: "Intermediate"
components:
  - "1x Arduino Pro Mini 328 - 5V/16MHz"
  - "1x Tactile Switch, Top Actuated"
  - "1x Buzzer Module"
  - "1x HC-05 Bluetooth Module"
  - "1x ATmega 328 P-PU"
  - "1x 5 mm LED: Yellow"
  - "1x 5 mm LED: Red"
  - "2x Resistor 220 ohm"
tools: []
apps:
  - "1x Android Studio"
  - "1x EAGLE"
  - "1x Arduino IDE"
downloadableFiles:
  - "https://projects.arduinocontent.cc/60708a60-fbb1-4e57-a913-3fc1a933c38c.ino"
  - "https://projects.arduinocontent.cc/ef4d5efe-522f-462a-83ed-42e7a00fa5c7.java"
  - "https://projects.arduinocontent.cc/0c34f831-cb41-496d-9ef6-8808d50ad0c7.xml"
  - "https://projects.arduinocontent.cc/9201dfe4-a945-470d-89c0-f70654372cf5.java"
  - "https://projects.arduinocontent.cc/ef4d5efe-522f-462a-83ed-42e7a00fa5c7.java"
  - "https://projects.arduinocontent.cc/60708a60-fbb1-4e57-a913-3fc1a933c38c.ino"
  - "https://projects.arduinocontent.cc/c8f35386-a137-4c64-b230-508fc8347023.xml"
  - "https://projects.arduinocontent.cc/0c34f831-cb41-496d-9ef6-8808d50ad0c7.xml"
  - "https://projects.arduinocontent.cc/9201dfe4-a945-470d-89c0-f70654372cf5.java"
documentationLinks: []
passwordHash: "8f89a0b25d473882cacaf340333e5355ea9705640d3824022411e70b02a329c6"
encryptedPayload: "U2FsdGVkX1/8dlQE3oJ1NK4v5USRLWHvIWs+oSBLNz2wZev67MO6G8ZcmhiRJZ02yTWbait+3DMXhqfx6xYCsZPM+hkqOSqChjzJ3cx3DBLjZjWr9sMSlijTUIVCRoFT/nnktLn4jos8I6ohrjPc9A=="
seoDescription: "Bluetooth and Android Phone Call Indicator with a Panic Switch to dial a preset emergency number."
videoLinks:
  - "https://www.youtube.com/embed/QcMrrQA81P4"
  - "https://www.youtube.com/embed/FoQhGVdOj5E"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/phone-call-indicator-cum-panic-switch-93a611_cover.jpg"
lang: "th"