Please visit https://proteshea.com/interface-a-pir-sensor/ for a complete list of materials needed for this project.
บทนำ (Introduction)
ในโปรเจกต์นี้ เราจะยกระดับการเรียนรู้จากโปรเจกต์ที่ผ่านมา (DHT11) โดยการเปลี่ยนมาใช้งานเซนเซอร์ตรวจจับความเคลื่อนไหวชนิด Passive InfraRed (PIR) ซึ่งเป็นอุปกรณ์ที่ได้รับความนิยมอย่างมากในระบบรักษาความปลอดภัยและระบบอัตโนมัติภายในบ้าน เซนเซอร์ PIR รุ่นที่เราเลือกใช้นี้มีความสามารถในการตรวจจับการเคลื่อนไหวได้ไกลถึง 30 ฟุต (ประมาณ 9 เมตร) ในมุมกว้างถึง 180 องศา ซึ่งเหมาะอย่างยิ่งสำหรับการสร้างระบบเตือนภัยเบื้องต้น หรือระบบเปิด-ปิดไฟอัตโนมัติในห้องเรียนและสำนักงานเพื่อการประหยัดพลังงาน
การเชื่อมต่อหน้าจอ LCD Character ขนาด 16x2
สำหรับการแสดงผลสถานะ เรายังคงเลือกใช้หน้าจอ LCD ขนาด 16 ตัวอักษร 2 บรรทัด ในโหมดการเชื่อมต่อแบบ 4-bit mode เพื่อประหยัดขา I/O ของ Arduino Uno โดยคุณสามารถศึกษารายละเอียดเชิงลึกได้จากบทความ "Interface a 16x2 Character LCD" ของเรา
การเชื่อมต่อขา (Pin Mapping):
- LCD Pin 4 (RS), 6 (E): ต่อเข้ากับขา Digital 2 และ 3 ของ Arduino Uno ตามลำดับ
- LCD Pin 11, 12, 13, 14 (Data Lines): ต่อเข้ากับขา Digital 4, 5, 6 และ 7 ของ Arduino Uno
หากคุณใช้ระบบ Modulus Canister หน้าจอ LCD จะถูกติดตั้งผ่านเฮดเดอร์ตัวเมียแบบงอ (Right-angle female header) 16 พิน ที่บัดกรีเข้ากับลิงก์แบบ 1-to-1 ดังที่แสดงในภาพด้านล่าง

แต่หากคุณต้องการทดลองบนโปรโตบอร์ด (Solderless Breadboard) ก็สามารถเชื่อมต่อได้ตามวงจรมาตรฐานนี้:

เจาะลึกการทำงานของเซนเซอร์ Passive InfraRed (PIR)
เซนเซอร์ PIR ที่เราเลือกใช้ประกอบด้วย 4 พินหลัก ได้แก่ GND, VCC, OUT, และ EN (Enable)
หลักการทางวิศวกรรม: ภายในโดมสีขาวที่เรียกว่า Fresnel Lens (ทำหน้าที่รวมแสงอินฟราเรดจากหลายทิศทางมายังตัวรับ) จะมีเซนเซอร์ชนิด Pyroelectric ที่มีช่องรับสัญญาณสองช่อง (Dual Slots) เซนเซอร์นี้ไม่ได้ "ปล่อย" แสงออกมา แต่จะ "รับ" รังสีอินฟราเรด (ความร้อน) ที่แผ่ออกมาจากวัตถุ
- สภาวะปกติ: เมื่อไม่มีการเคลื่อนไหว ทั้งสองช่องจะได้รับรังสีอินฟราเรดในปริมาณที่เท่ากัน (วัดจากอุณหภูมิห้องหรือสิ่งของที่อยู่นิ่ง)
- เมื่อมีการเคลื่อนไหว: เมื่อมีสิ่งมีชีวิต (เช่น มนุษย์หรือสัตว์) เคลื่อนที่ผ่าน รังสีความร้อนจากร่างกายจะไปตกกระทบที่ช่องรับสัญญาณช่องแรกก่อนช่องที่สอง ทำให้เกิดความต่างศักย์ระหว่างสองช่องนี้ วงจรภายในจะประมวลผลและส่งสัญญาณ Digital High ออกมาทางขา OUT
คุณสามารถปรับความไว (Sensitivity) และระยะเวลาหน่วงสัญญาณได้ผ่านตัวต้านทานปรับค่าได้ (Potentiometer) ที่อยู่ด้านหลังโมดูล
ข้อมูลทางเทคนิค (Specifications):

การประกอบวงจรและติดตั้ง (Hardware Setup)
หากคุณทำโปรเจกต์ DHT11 มาก่อนหน้านี้ ให้ถอดเซนเซอร์ตัวเดิมออกและเสียบเซนเซอร์ PIR แทนที่ ในกรณีที่ใช้งานร่วมกับ Modulus ให้บัดกรีเฮดเดอร์ตัวเมีย 4 พินแบบงอ และเฮดเดอร์ตัวผู้แถวเดี่ยว 4 พินไว้ข้างกัน จากนั้นทำการสร้าง Solder Bridge (สะพานบัดกรี) เพื่อเชื่อมต่อพินที่สอดคล้องกันสำหรับการ Wire-wrap


ขั้นตอนการเดินสายไฟ:
- เสียบ Modulus Canister เข้ากับคอนเน็กเตอร์ 4x26 พินบน FuelCan
- GND: เชื่อมต่อพินซ้ายสุดของเฮดเดอร์ตัวผู้ไปยังจุด Ground บน Modulus
- VCC (+5Vdc): เชื่อมต่อพินที่สองจากซ้ายไปยังแหล่งจ่ายไฟ +5V
- OUT: เชื่อมต่อไปยังขา Digital 8 ของ Arduino Uno (ใช้สาย F/M ยาว 12 นิ้ว)
- EN (Enable): เชื่อมต่อไปยังขา Digital 9 ของ Arduino Uno เพื่อสั่งเปิดการทำงานของเซนเซอร์

สำหรับผู้ที่ใช้งาน Breadboard สามารถอ้างอิงแผนผังวงจร (Schematic) ได้ที่นี่:

การเชื่อมต่อ FuelCan
ตรวจสอบการติดตั้ง Arduino Uno บนพื้นที่ Prototyping ของ FuelCan หากใช้ Breadboard แนะนำให้วางไว้ในช่องเก็บของด้านล่างเพื่อความเป็นระเบียบและลดความยาวสายไฟ จ่ายไฟ +5V และ Ground เข้าที่ Power Rail ของ Breadboard โดยใช้สาย Banana Jack และอย่าลืมเชื่อมต่อสาย USB Type A ไปยังคอมพิวเตอร์และ Type B เข้ากับ Arduino เพื่อทำการอัปโหลดโปรแกรม
การวิเคราะห์ลอจิกของซอฟต์แวร์ (Software Analysis)
ในส่วนของโค้ดโปรแกรม มีจุดที่น่าสนใจในการจัดการประสิทธิภาพการแสดงผล ดังนี้:
- Initialization: ในฟังก์ชัน
setup()เราจะสั่งให้ขา EN (ขา 9) เป็น HIGH เพื่อเปิดการทำงานของเซนเซอร์ PIR - Polling & State Management: ในฟังก์ชัน
loop()โปรแกรมจะทำการอ่านค่าจากขา OUT (ขา 8) ตลอดเวลา - กลไก
nomotionflag: นี่คือส่วนสำคัญทางวิศวกรรมซอฟต์แวร์ เพื่อป้องกันไม่ให้หน้าจอ LCD เกิดการกะพริบจากการเขียนข้อมูลเดิมซ้ำๆ (Overhead)- เมื่อไม่มีการเคลื่อนไหวและ
nomotionflagเป็น 0: หน้าจอจะแสดง "No motion" และตั้งค่าแฟล็กเป็น 1 เพื่อหยุดการเขียนซ้ำ - เมื่อมีการเคลื่อนไหว: หน้าจอจะแสดง "Motion detected" และรีเซ็ตแฟล็กกลับเป็น 0 เพื่อเตรียมพร้อมสำหรับการแจ้งเตือนครั้งต่อไป
- เมื่อไม่มีการเคลื่อนไหวและ
Source Code สำหรับโปรเจกต์:
#include <LiquidCrystal.h>
// กำหนดพินสำหรับ LCD
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
const int pirOutPin = 8;
const int pirEnablePin = 9;
int nomotionflag = 0;
void setup() {
lcd.begin(16, 2);
pinMode(pirOutPin, INPUT);
pinMode(pirEnablePin, OUTPUT);
// เปิดการทำงานของเซนเซอร์ PIR
digitalWrite(pirEnablePin, HIGH);
lcd.print("PIR Initializing");
delay(2000); // ให้เวลาเซนเซอร์ในการคาลิเบรตสภาพแวดล้อม
lcd.clear();
}
void loop() {
int sensorValue = digitalRead(pirOutPin);
if (sensorValue == HIGH) {
lcd.setCursor(0, 0);
lcd.print("Status: ");
lcd.setCursor(0, 1);
lcd.print("Motion Detected ");
nomotionflag = 0; // รีเซ็ตแฟล็กเมื่อเจอการเคลื่อนไหว
}
else {
if (nomotionflag == 0) {
lcd.setCursor(0, 0);
lcd.print("Status: ");
lcd.setCursor(0, 1);
lcd.print("No Motion ");
nomotionflag = 1; // ตั้งแฟล็กเพื่อไม่ให้เขียนหน้าจอซ้ำโดยไม่จำเป็น
}
}
delay(100);
}
เมื่อคุณอัปโหลดโค้ดนี้แล้ว ลองเดินผ่านหน้าเซนเซอร์หรือโบกมือ คุณจะเห็นการตอบสนองที่รวดเร็วบนหน้าจอ LCD ซึ่งเป็นรากฐานสำคัญในการพัฒนาโปรเจกต์ระบบอัตโนมัติขั้นสูงต่อไป