專題範例_停車場

 




#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 秒檢查一次距離

}


留言