PIR人體感應器


PIR人體感應器

tags: esp32 PIR_motion


實驗說明


此次實驗,以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;

    }
  

文章作者: blairan
版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY 4.0 許可協議。轉載請註明來源 blairan !
评论
  目錄