PIR人體感應器
PIR人體感應器
此次實驗,以PIR感應器檢測人體運動,在高電位時使LED亮,
到達設製的時間,自動滅掉。
同時我在這個實驗裡學到中斷函式attachInterrupt()和mills()的運用
中斷函式可以運用在PIR,當檢測到變化,中斷函式會被觸發去執行所
設定的動作。同時藉由mills()替化delay()而不至於所有的過程都被delay()
暫停。
接線方式
const int led=18;
const int motionSensor=27;
unsigned long oldTime;
bool startTimer=false;
void IRAM_ATTR detectedMotion(){
Serial.println("detected motion....");
digitalWrite(led, HIGH);
oldTime=millis();
startTimer=true;
}
void setup(){
Serial.begin(115200);
pinMode(led, OUTPUT);
pinMode(motionSensor, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(motionSensor), detectedMotion, RISING);
}
void loop(){
unsigned long now=millis();
if (startTimer&&(now-oldTime>5000)){
Serial.println("motion stop!!!");
digitalWrite(led, LOW);
startTimer=false;
}
}
特別提到這裡有一個自定義函式,它的作用是當PIR偵測到動作後,就會去執行這部份
並且使startTimer開始紀錄執行後的时間。
注意:IRAM_ATTR 用於運行 RAM 中的中斷代碼,否則代碼存儲在 flash 中,速度較慢。
void IRAM_ATTR detectedMotion(){
Serial.println("detected motion....");
digitalWrite(led, HIGH);
oldTime=millis();
startTimer=true;
}
中斷函式可以參考-我的函式筆記本
attachInterrupt(digitalPinToInterrupt(motionSensor), detectedMotion, RISING);
時間函式可以參考-我的函式筆記本
unsigned long now=millis();
if (startTimer&&(now-oldTime>5000)){
Serial.println("motion stop!!!");
digitalWrite(led, LOW);
startTimer=false;
}
留言
張貼留言