#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// กำหนดที่อยู่ของจอ LCD I2C (ส่วนใหญ่เป็น 0x27 หรือ 0x3F)
LiquidCrystal_I2C lcd(0x27, 20, 4);
// กำหนดขา Trig, Echo, Servo, PIR และ Buzzer
const int trigPin = 6;
const int echoPin = 5;
const int servoPin = 9;
const int pirPin = 4; // ขาของ PIR sensor
const int buzzerPin = 7; // ขาของ Buzzer
Servo myServo; // สร้างอ็อบเจ็กต์ Servo
void setup() {
// เริ่มต้นจอ LCD และตั้งค่าให้พร้อมใช้งาน
lcd.init();
lcd.backlight(); // เปิดแสง backlight
// ตั้งค่า pin สำหรับ HC-SR04
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// ตั้งค่า pin สำหรับ PIR และ Buzzer
pinMode(pirPin, INPUT);
pinMode(buzzerPin, OUTPUT);
// เริ่มต้น servo และกำหนดตำแหน่งเริ่มต้นเป็น 0 องศา
myServo.attach(servoPin);
myServo.write(0); // เริ่มที่ 0 องศา
// แสดงข้อความเบื้องต้นบนจอ LCD
lcd.setCursor(0, 0);
lcd.print("Distance Sensor");
}
void loop() {
// ตรวจจับการเคลื่อนไหวจาก PIR
int pirState = digitalRead(pirPin);
// ถ้า PIR ตรวจจับการเคลื่อนไหว
if (pirState == HIGH) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Motion Detected");
// ส่งสัญญาณ ultrasonic pulse
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// รับสัญญาณ echo
long duration = pulseIn(echoPin, HIGH);
// คำนวณระยะทาง (เซนติเมตร)
long distance = duration * 0.034 / 2;
// แสดงผลระยะทางบนจอ LCD
lcd.setCursor(0, 1);
lcd.print("Distance: ");
lcd.print(distance);
lcd.print(" cm");
// ควบคุม Servo ตามระยะทาง
if (distance < 50) {
myServo.write(180); // ถ้าน้อยกว่า 50 cm หมุนไปที่ 180 องศา
} else {
myServo.write(0); // ถ้ามากกว่า 50 cm หมุนไปที่ 0 องศา
}
// เล่นเสียงไซเรนเมื่อมีการเคลื่อนไหว
playSiren();
} else {
// ถ้าไม่มีการเคลื่อนไหวจาก PIR
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("No Motion");
myServo.write(0); // Servo อยู่ที่ 0 องศาเมื่อไม่มีการเคลื่อนไหว
// หยุดเสียงไซเรน
noTone(buzzerPin);
}
delay(500); // หน่วงเวลา 500ms ก่อนคำนวณใหม่
}
void playSiren() {
// เล่นเสียงไซเรนที่มีความถี่เพิ่มขึ้นและลดลง
for (int freq = 1000; freq <= 2000; freq += 100) {
tone(buzzerPin, freq);
delay(50); // หน่วงเวลา 50ms
}
for (int freq = 2000; freq >= 1000; freq -= 100) {
tone(buzzerPin, freq);
delay(50); // หน่วงเวลา 50ms
}
}