當我們使用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:狀態改變就觸發
}