Address
南台科技大學 C 棟
週一至週五: 8AM - 6PM
假日: 休息
Address
南台科技大學 C 棟
週一至週五: 8AM - 6PM
假日: 休息
在現代自動化設備與智慧感測系統中,紅外線感測器被廣泛應用於物品偵測、安防監控與智慧分類。本篇文章將探討如何透過紅外線感測器即時偵測物品,並搭配超音波感測器來測量物品距離,最後將數據傳輸至串口,供後續系統處理。
紅外線感測器能夠偵測物體是否存在,當物體靠近時,感測器會輸出一個低電位信號 (LOW
),反之則輸出高電位 (HIGH
)。透過這樣的特性,我們可以即時偵測物品的進出狀態。
本系統主要由以下元件組成:
以下程式碼實作了紅外線感測器與超音波感測器的整合,當紅外線感測器偵測到物體時,系統將立即傳送感測數據。
// 超音波感測器引腳
const int trigPin1 = A0;
const int echoPin1 = A1;
const int trigPin2 = A2;
const int echoPin2 = A3;
// 紅外線感測器引腳
const int infraredSensorPin = 12;
// 記錄上一次的紅外線狀態
int lastIrStatus = HIGH; // 初始狀態為無偵測
void setup() {
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
pinMode(infraredSensorPin, INPUT);
Serial.begin(115200);
Serial.println("System initialized, ready to detect objects...");
}
// 測距函數
long getDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH, 30000); // 限制最大等待時間 30ms
if (duration == 0) {
return 400; // 如果測不到回音,返回 400 cm,表示沒有物體
}
long distance = duration * 0.034 / 2;
return (distance > 400) ? 400 : distance; // 限制最大距離 400cm
}
void loop() {
// 讀取紅外線感測器的值
int irValue = digitalRead(infraredSensorPin);
// **當紅外線感測器狀態變化時才發送資料**
if (irValue != lastIrStatus) {
lastIrStatus = irValue; // 更新狀態
String irStatus = (irValue == LOW) ? "detected" : "not_detected";
// 使用超音波感測器測量距離
long distance1 = getDistance(trigPin1, echoPin1);
long distance2 = getDistance(trigPin2, echoPin2);
// 生成 JSON 格式的數據並發送到串口
char jsonBuffer[100];
sprintf(jsonBuffer, "{\"command\": \"DETECT_OBJECT\", \"ultrasonic1\": %ld, \"ultrasonic2\": %ld, \"status\": \"%s\"}",
distance1, distance2, irStatus.c_str());
Serial.println(jsonBuffer);
}
// **稍微延遲 10ms 來避免 CPU 過載**
delay(10);
}
setup()
函數中設定感測器的 pinMode
並啟動串口通信 (Serial.begin(115200)
)。getDistance()
loop()
持續偵測紅外線感測器的狀態變化 (HIGH
→ LOW
或 LOW
→ HIGH
)。當紅外線感測器偵測到物品時,Arduino 會輸出如下 JSON 數據:
{
"command": "DETECT_OBJECT",
"ultrasonic1": 25,
"ultrasonic2": 30,
"status": "detected"
}
這些數據可以傳送到Django、Flask 或 WordPress 後端進行進一步處理,例如:
若要將數據顯示於 WordPress,可以透過 JavaScript 來即時獲取 SerialPort 資訊,並動態更新 HTML:
fetch("http://your-backend-server/api/sensor-data")
.then(response => response.json())
.then(data => {
document.getElementById("sensor-status").innerText =
`物品狀態: ${data.status}, 距離1: ${data.ultrasonic1} cm, 距離2: ${data.ultrasonic2} cm`;
});
這樣就可以讓 WordPress 文章內的感測數據區塊即時更新。