跳到主要內容

 自 109 / 2 /25 起啟用

物聯網 / 人體紅外線感測器

PIR
紅外線感測器可分為主動式和被動式兩種。
 
主動式的紅外線感測器,感測器本身會發射紅外線光束,當紅外線光束被物體擋住後,紅外線光束就會反射,接收器接收反射的紅外線,做出動作。例如:廁所的自動沖水小便斗、感應式水龍頭。
 
人體紅外線感應器 ( Pyro-electric Infrared Detector,簡稱 PIR)或稱做紅外線動作感測器(PIR Motion Sensor),是屬於被動式的紅外線裝置,感應器本身不會發射紅外線光束,原理是利用物體發射出來的紅外線的變化,來感應物體的移動,如偵測到移動中的紅外線源(人 / 動物),其輸出值為 HIGH;如果沒有移動中的紅外線源,感應器的輸出值為 LOW,常見的應用為如自動照明和防盜報警系統。
 
把上面半球的白色蓋子打開,可以發現裡面有一個熱釋電傳感接收器(Pyroelectric sensor),半圓白色蓋子為聚乙烯 PE 透鏡,主要用來將外在的紅外線信號聚焦到熱釋電傳感器上,讓原本的偵測角度可以擴大 ( 原理可以參考「菲涅爾透鏡」 )。
 
 
PIR
 
人體紅外線感測器上有兩個可變電阻十字旋鈕(橘色的旋鈕),分別是調整感測器靈敏度以及延時時間長短。
● 標示 SX ( Sensitivity ) 的旋鈕是調整偵測的靈敏度,靈敏度以偵測距離計算,範圍 3~7 公尺,順時針旋轉靈敏度越高(感應距離增大)。
● 標示 TX ( Time Delay ) 的旋鈕是偵測到訊號之後,下一次間隔多久再繼續進行偵測的延遲時間,時間範圍是 5~300 秒,順時針旋轉延時時間越長。
建議先將敏感度(Sensitivity)先順時針調到底,也就是最高值
延時時間(Time Delay)先逆時針調到最底,也就是最低值
這樣在測試時比較容易看到效果。等程式正常運作後,再試著調到適合的程度。
 
感應角度:100 度
偵測距離:7 公尺內
觸發方式:L 不可重複觸發 / H 重複觸發(Jumper 跳線調整)
不可重複觸發:即感應輸出高電位後,延遲時間段一結束,輸出將自動從高電平變成低電平。
重複觸發:即感應輸出高電平後,在延遲時間段內,如果有人體在其感應範圍活動,其輸出將一直保持高電平,直到人離開後才延時將高電平變為低電平(感應模塊檢測到人體的每一次活動後會自動順延一個延時時間段,並且以最後一次活動的時間為延時時間的起始點)。
 
接線方式
● GND:接地
● OUT:數位訊號輸出(程式範例接 D7)
● VCC:接電源
 
#include "SSD1306.h" //匯入OLED程式庫
SSD1306  display(0x3C, D2, D1);    //宣告使用OLED螢幕物件(位址,SDA,SCL)==SDA>D2,SCL>D1
 
#define pirPin D7    // 設定人體紅外線感應器的數位接腳 D7 or 13 
 
int sensorValue;
String message;
long previousTime = 0;          // 用來保存前一次狀態的時間
long interval = 500;           // 讀取間隔時間,單位為毫秒(miliseconds)
 
void setup() {
   display.init(); //螢幕初始化
   display.flipScreenVertically();  //螢幕垂直翻轉
   display.setFont(ArialMT_Plain_16);    //使用16字體
   display.setTextAlignment(TEXT_ALIGN_LEFT);  //靠左對齊 
   pinMode(pirPin, INPUT);   //設定 pirPin 為輸入模式
}
 
void loop() {
   unsigned long currentTime = millis();  //將當前的時間存入變數currentTime
   if (currentTime - previousTime > interval) {  //如果當前時間扣除前一次保留時間超過間隔時間(interval)就進入執行程式
      sensorValue = digitalRead(pirPin);   // 讀取 pirPin 腳位是否有偵測到物體移動
      if (sensorValue == HIGH) {     // 偵測到移動中的紅外線源,感應器的輸出值為 HIGH    
         message = "Motion";
      }
      else {          // 沒有偵測到移動中的紅外線源,感應器的輸出值為 LOW
         message = "No Motion"; 
      }
      previousTime = currentTime;  // 離開if時更新時間
   }   
   display.clear(); //清除螢幕
   display.drawString(0, 0, message); //x=0,y=0 位置顯示移動狀態
   display.display();//螢幕顯示畫面
}
 

 

消息公佈欄

時間類別單位標題發佈點閱
跳至網頁頂部