紅外線感測器可分為主動式和被動式兩種。
主動式的紅外線感測器,感測器本身會發射紅外線光束,當紅外線光束被物體擋住後,紅外線光束就會反射,接收器接收反射的紅外線,做出動作。例如:廁所的自動沖水小便斗、感應式水龍頭。
人體紅外線感應器 ( Pyro-electric Infrared Detector,簡稱 PIR)或稱做紅外線動作感測器(PIR Motion Sensor),是屬於被動式的紅外線裝置,感應器本身不會發射紅外線光束,原理是利用物體發射出來的紅外線的變化,來感應物體的移動,如偵測到移動中的紅外線源(人 / 動物),其輸出值為 HIGH;如果沒有移動中的紅外線源,感應器的輸出值為 LOW,常見的應用為如自動照明和防盜報警系統。
把上面半球的白色蓋子打開,可以發現裡面有一個熱釋電傳感接收器(Pyroelectric sensor),半圓白色蓋子為聚乙烯 PE 透鏡,主要用來將外在的紅外線信號聚焦到熱釋電傳感器上,讓原本的偵測角度可以擴大 ( 原理可以參考「菲涅爾透鏡」 )。
人體紅外線感測器上有兩個可變電阻十字旋鈕(橘色的旋鈕),分別是調整感測器靈敏度以及延時時間長短。
● 標示 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();//螢幕顯示畫面
}