當我們使用ESP32時,可以像傳統Arduino UNO使用中斷語法

中斷(Interrupt)這個功能,類似我們以前寫C#時的Callback,也就是物件導向裡面的事件(Event)驅動,當特定事件發生時,我們再去處理這件事所對應的功能Function。

舉個例子來說,在還沒學習到中斷以前,我們的來客報知機(人體感測器+錄放音機)是利用Loop內的不斷偵測,delay時間還不能太長,避免沒偵測到,而沒有觸發歡迎詞,但是如果來客報知機還有其他用途時,例如偵測光敏,就必須也寫在loop內,這樣兩個功能就可能互相干擾,delay時間可能不同之類。

中斷的功能則是把「偵測」、「觸發」的部份合併在一起,並且可以拉出去Loop外,讓系統來幫我們做,不過偵測只能數位偵測(HIGH或LOW),另外中斷內不放置Delay,越簡單越好。

以下範例程式,可以讓ESP32依據腳位14發生變化時,改變腳位2的燈號,例如當人體感測器發生變化時,會點亮LED燈。能偵測的變化有四種類型

LOW:狀態成為LOW就觸發
HIGH:狀態成為HIGH就觸發
CHANGE:狀態改變就觸發,例如LOW->HIGH,或HIGH->LOW都算
RISING:狀態由LOW->HIGH就觸發,反之無效
FALLING:狀態由HIGH->LOW就觸發,反之無效

最後當要取消中斷時,可以用detachInterrupt(GPIOPin);來取消即可


int interruptPin = 14;  //中斷腳位
int ledPin=2; //LED腳位
int state = 0;   //預設LED狀態LOW
void setup() {
  pinMode(ledPin, OUTPUT);  
  pinMode(interruptPin, INPUT); //人體感測輸入
  attachInterrupt(digitalPinToInterrupt(interruptPin), isr_Callback, CHANGE);  
  //CHANGE:狀態改變就觸發
}
 
void loop() {
}
 
//中斷時的Callback,型態宣告為IRAM_ATTR,代表將此程式放置RAM中,提昇效能與命中率
void IRAM_ATTR isr_Callback() {  
  digitalWrite(ledPin, digitalRead(interruptPin));
}


 

arrow
arrow
    全站熱搜

    夜市 小霸王 發表在 痞客邦 留言(0) 人氣()