Address
南台科技大學 C 棟

週一至週五: 8AM - 6PM
假日: 休息

紅外線感測器偵測物品並即時傳送數據的應用

紅外線感測器偵測物品並即時傳送數據的應用

在現代自動化設備與智慧感測系統中,紅外線感測器被廣泛應用於物品偵測、安防監控與智慧分類。本篇文章將探討如何透過紅外線感測器即時偵測物品,並搭配超音波感測器來測量物品距離,最後將數據傳輸至串口,供後續系統處理。


1. 紅外線感測器的工作原理

紅外線感測器能夠偵測物體是否存在,當物體靠近時,感測器會輸出一個低電位信號 (LOW),反之則輸出高電位 (HIGH)。透過這樣的特性,我們可以即時偵測物品的進出狀態。


2. 系統架構

本系統主要由以下元件組成:

  • 紅外線感測器 (Infrared Sensor):負責偵測物品是否出現。
  • 超音波感測器 (Ultrasonic Sensor):測量物品與感測器之間的距離。
  • Arduino 開發板:控制感測器並將數據傳輸至串口,供後端系統使用。

3. 程式碼解析

以下程式碼實作了紅外線感測器與超音波感測器的整合,當紅外線感測器偵測到物體時,系統將立即傳送感測數據。

程式碼

// 超音波感測器引腳
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);
}

4. 程式運作方式

  1. 初始化感測器
    • setup() 函數中設定感測器的 pinMode 並啟動串口通信 (Serial.begin(115200))。
  2. 測距函數 getDistance()
    • 超音波感測器發送超音波,計算回音返回的時間,轉換為距離 (公分)。
  3. 即時偵測物品
    • 透過 loop() 持續偵測紅外線感測器的狀態變化 (HIGHLOWLOWHIGH)。
    • 若偵測到變化,則讀取超音波感測器的距離,並將資訊以 JSON 格式 傳送至串口,供後端系統處理。

5. 數據傳輸與應用

(1) JSON 格式的數據傳輸

當紅外線感測器偵測到物品時,Arduino 會輸出如下 JSON 數據:

{
  "command": "DETECT_OBJECT",
  "ultrasonic1": 25,
  "ultrasonic2": 30,
  "status": "detected"
}

這些數據可以傳送到Django、Flask 或 WordPress 後端進行進一步處理,例如:

  • 記錄每次物品偵測的時間與距離
  • 在前端網頁顯示感測數據
  • 觸發警報或機械動作

(2) 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 文章內的感測數據區塊即時更新。