ชื่อโปรเจกต์: ระบบรักษาความปลอดภัยด้วย PIR Sensor
โปรเจกต์นี้พี่จัดทำขึ้นมาเพื่อส่งในวิชา Robotics ของพี่เองแหละน้อง ใครอยากลองเล่นใน Simulator ก่อน ก็ลองหาดูใน TinkerCad ได้นะ จัดไปวัยรุ่น!
มาส่อง Code กันหน่อยดีกว่า:
LiquidCrystallcd(2,3,4,5,6,7); เป็นการประกาศเรียกใช้งาน (initializes) ตัว LiquidCrystal Class เพื่อบอกบอร์ดว่าเราต่อขากับหน้าจอ LCD ยังไงบ้าง
int ledPin = 12;
const int PIRPin = 8;
int pirState = LOW;
int val = 0;
int photoCellPin = A0;
int photoCellReading;
int speakerPin = 10;
ตรงนี้คือการประกาศ Variable (ตัวแปร) ต่างๆ เตรียมพร้อมเอาไว้ใช้งาน
void setup()
{
lcd.begin(16,2);
pinMode(ledPin, OUTPUT);
pinMode(PIRPin, INPUT);
pinMode(photoCellPin, INPUT);
pinMode(speakerPin, INPUT);
Serial.begin(9600);
lcd.setCursor(0,0);
lcd.print("P.I.R Motion And");
lcd.setCursor(0,1);
lcd.print("light sensors");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Processing Data.");
playTone(300,300);
delay(150);
playTone(0,0);
delay(3000);
lcd.clear();
lcd.setCursor(3,0);
lcd.print("Waiting For");
lcd.setCursor(3,1);
lcd.print("Motion...");
}
ส่วนของ setup() นี้ พี่เอาไว้ตั้งค่าพวก Sensor ต่างๆ และสั่งให้หน้าจอ LCD มันโชว์ข้อความต้อนรับเท่ๆ นิดนึง แล้วก็สั่งให้มีเสียงปี๊ดออกมาเบาๆ พอเป็นพิธี
void loop()
{
val = digitalRead(PIRPin);
photoCellReading = analogRead(photoCellPin);
if(val == HIGH)
{
digitalWrite(ledPin, HIGH);
if(pirState == LOW)
{
Serial.println("Motion Detected");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Motion Detected");
lcd.setCursor(0,1);
lcd.print(photoCellReading);
playTone(300,300);
delay(150);
playTone(0,0);
pirState = HIGH;
}
} else
{
digitalWrite(ledPin, LOW);
delay(300);
scrollScreenSaver();
if(pirState == HIGH)
{
Serial.println("Motion Ended");
pirState = LOW;
}
}
}
ในส่วน loop() จะทำหน้าที่เช็คว่ามีใครเดินตัดหน้า PIR Sensor ของเราหรือเปล่า ถ้าเจอตัวล่ะก็... สั่ง Alarm ให้ดังลั่นบ้านเลย! แต่ถ้าไม่มีใครผ่าน (เหงาๆ) ก็ให้มันรันข้อความเก๋ๆ ไปแทน
void playTone(long duration, int freq)
{
duration *= 1000;
int period = (1.0/freq)*100000;
long elapsed_time = 0;
while(elapsed_time < duration)
{
digitalWrite(13, HIGH);
digitalWrite(speakerPin, HIGH);
delayMicroseconds(period/2);
digitalWrite(13, LOW);
digitalWrite(speakerPin, LOW);
delayMicroseconds(period/2);
elapsed_time += (period);
}
}
นี่คือ Function สำหรับสร้างเสียงเตือน (Alarm) นั่นเอง ใครชอบเสียงแบบไหนไปปรับจูนกันเอาเองนะน้อง
void scrollScreenSaver()
{
lcd.clear();
lcd.setCursor(15,0);
lcd.print("No Motion");
lcd.setCursor(15,1);
lcd.print("Waiting");
for(int i = 0; i < 22; i++)
{
lcd.scrollDisplayLeft();
delay(150);
}
}
ส่วนอันนี้คือ Function สำหรับเลื่อนข้อความตอนว่างงาน (Screen Saver) ให้หน้าจอ LCD มันดูมีอะไรหน่อย ไม่ใช่ปล่อยนิ่งๆ จนจืดชืด
รายละเอียดเจาะลึกแบบวิศวะ (EXPANDED TECHNICAL DETAILS)
การตรวจจับการบุกรุกด้วย Passive Infrared (PIR)
โปรเจกต์นี้โชว์หลักการพื้นฐานของการตรวจจับความร้อนที่เคลื่อนไหว เพื่อสร้างระบบแจ้งเตือนความปลอดภัยที่เชื่อถือได้และที่สำคัญคือ "กินไฟต่ำ" มากนะน้อง
- Fresnel-Lens Thermal Analysis: ตัว Arduino จะทำหน้าที่คุยกับ PIR Sensor โดยอาศัยเลนส์ Fresnel (ไอ้ฝาครอบกลมๆ นั่นแหละ) ช่วยวิเคราะห์ Firmware ของเราจะแยกแยะรังสี IR ที่เกิดจากคนเดินผ่านได้แม่นยำ ไม่ไปมั่วซั่วกับพวกแหล่งความร้อนนิ่งๆ อย่างพวกเครื่องทำความร้อนหรือพัดลม
- Dual-State Alert Sequencer: พี่ใส่ระบบเตือน 2 จังหวะไว้ด้วย คือ "Soft Alert" (ไฟ LED ติดเตือนขำๆ) ในช่วง 3 วินาทีแรกที่เจอการเคลื่อนไหว แต่ถ้าไอ้ขโมยมันยังไม่ไปไหนและขยับต่อ คราวนี้จะเจอ "Hard Alert" (Piezo Siren ร้องระงม แถมส่งข้อความ GSM แจ้งเตือน) งานนี้มีวงแตกแน่นอน!