#include <Servo.h>
// 設定伺服馬達控制引腳 (閘門控制)
#define sg90Pin 6 // 伺服控制引腳 (連接到閘門的控制線)
// 定義超音波感應器的引腳
#define echoPin 8 // 超音波感應器的 Echo 引腳 (接收回波信號)
#define trigPin 9 // 超音波感應器的 Trigger 引腳 (發送觸發信號)
// 設定伺服物件
Servo servo;
void setup() {
Serial.begin(9600);
// 設定超音波感應器的引腳
pinMode(trigPin, OUTPUT); // Trigger 引腳設為輸出,用來發送超音波信號
pinMode(echoPin, INPUT); // Echo 引腳設為輸入,用來接收回波信號
// 連接伺服馬達到指定引腳
servo.attach(sg90Pin); // 設定伺服馬達控制引腳,這裡是 pin 6
servo.write(0); // 初始化閘門為關閉狀態(0 度)
}
void loop() {
long duration, distance;
// 發送一個超音波脈衝
digitalWrite(trigPin, LOW); // 設定 Trigger 引腳為低電位
delayMicroseconds(2); // 等待 2 微秒
digitalWrite(trigPin, HIGH); // 設定 Trigger 引腳為高電位,發送超音波
delayMicroseconds(10); // 發送超音波信號持續 10 微秒
digitalWrite(trigPin, LOW); // 停止發送超音波信號
// 測量回波的持續時間並計算距離
duration = pulseIn(echoPin, HIGH); // 計算 Echo 引腳接收到的回波時間
distance = (duration / 2) / 29.1; // 計算距離(單位:公分)
// 輸出距離數值,便於除錯
Serial.print(distance); // 輸出測量到的距離
Serial.println(" cm");
// 如果距離小於 100 cm,表示有車輛靠近,打開閘門
if (distance < 100) {
Serial.println("車輛進入,開啟閘門");
// 開啟閘門,將伺服馬達移動至 90 度(開啟閘門)
servo.write(90); // 設定伺服馬達至 90 度,表示閘門開啟
delay(5000); // 閘門保持開啟 5 秒鐘
// 完成後關閉閘門
servo.write(0); // 將伺服馬達恢復到 0 度,閘門關閉
delay(2000); // 等待 2 秒鐘再進行下一次偵測
} else {
// 車輛不在範圍內,保持閘門關閉
servo.write(0); // 保持伺服在 0 度(閘門關閉)
}
delay(500); // 每 0.5 秒檢查一次距離
}
留言
張貼留言