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(ledHIGH);
    oldTime=millis();
    startTimer=true;
}

void setup(){
    Serial.begin(115200);
    pinMode(ledOUTPUT);
    pinMode(motionSensorINPUT_PULLUP);
    attachInterrupt(digitalPinToInterrupt(motionSensor), detectedMotionRISING);
}

void loop(){
    unsigned long now=millis();
    if (startTimer&&(now-oldTime>5000)){
        Serial.println("motion stop!!!");
        digitalWrite(ledLOW);
        startTimer=false;
    }
}

特別提到這裡有一個自定義函式,它的作用是當PIR偵測到動作後,就會去執行這部份
並且使startTimer開始紀錄執行後的时間。

注意:IRAM_ATTR 用於運行 RAM 中的中斷代碼,否則代碼存儲在 flash 中,速度較慢。
void IRAM_ATTR detectedMotion(){
    Serial.println("detected motion....");
    digitalWrite(ledHIGH);
    oldTime=millis();
    startTimer=true;
}

中斷函式可以參考-我的函式筆記本
attachInterrupt(digitalPinToInterrupt(motionSensor), detectedMotionRISING);

時間函式可以參考-我的函式筆記本
unsigned long now=millis();
    if (startTimer&&(now-oldTime>5000)){
        Serial.println("motion stop!!!");
        digitalWrite(ledLOW);
        startTimer=false;
    }






留言

這個網誌中的熱門文章