#include <Servo.h>
// กำหนดพินสำหรับ Servo และ Ultrasonic Sensor
Servo barrierServo;
const int servoPin = 9; // พินต่อ Servo Motor
// กำหนดพินสำหรับ Ultrasonic Sensor
const int trigPin = 6; // พินต่อขา TRIG ของ Ultrasonic Sensor
const int echoPin = 7; // พินต่อขา ECHO ของ Ultrasonic Sensor
// กำหนดมุมสำหรับการเปิดและปิดที่กั้นจราจร
const int openPosition = 90; // มุมเปิดที่กั้นจราจร (90 องศา)
const int closePosition = 0; // มุมปิดที่กั้นจราจร (0 องศา)
// กำหนดระยะทางในการตรวจจับวัตถุ
const int detectionDistance = 150; // ระยะทาง (เซนติเมตร) ในการเปิดที่กั้นจราจร
// ตัวแปรเก็บสถานะการเปิด/ปิดที่กั้น
bool isOpen = false;
void setup() {
// ตั้งค่า Servo และ Ultrasonic Sensor
barrierServo.attach(servoPin); // ผูก Servo เข้ากับพิน 9
pinMode(trigPin, OUTPUT); // ตั้งค่า TRIG เป็น OUTPUT
pinMode(echoPin, INPUT); // ตั้งค่า ECHO เป็น INPUT
// เริ่มต้นด้วยการปิดที่กั้นจราจร
barrierServo.write(closePosition);
Serial.begin(9600); // เริ่มต้นการสื่อสารแบบ Serial สำหรับการดีบั๊ก
}
void loop() {
// ตรวจจับระยะห่างด้วย Ultrasonic Sensor
long duration, distance;
// ส่งสัญญาณ TRIG
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// อ่านเวลาจาก ECHO
duration = pulseIn(echoPin, HIGH);
// คำนวณระยะทาง (ในหน่วยเซนติเมตร)
distance = (duration * 0.034) / 2;
// แสดงระยะทางผ่าน Serial Monitor (ถ้าต้องการดู)
Serial.print("Distance: ");
Serial.println(distance);
// ตรวจสอบว่าระยะห่างน้อยกว่าระยะที่กำหนด
if (distance < detectionDistance) {
if (!isOpen) {
// เปิดที่กั้นจราจรถ้าสถานะปัจจุบันยังปิดอยู่
barrierServo.write(openPosition);
isOpen = true;
delay(1000); // หน่วงเวลาเพื่อให้ Servo ทำงานเสร็จสิ้น
}
} else {
if (isOpen) {
// ปิดที่กั้นจราจรถ้าสถานะปัจจุบันเปิดอยู่
barrierServo.write(closePosition);
isOpen = false;
delay(1000); // หน่วงเวลาเพื่อให้ Servo ทำงานเสร็จสิ้น
}
}
// หน่วงเวลาเล็กน้อยเพื่อความเสถียร
delay(100);
}