Arduino基礎入門篇13—外部中斷
本篇介紹Arduino外部中斷的使用,通過外部中斷檢測震動開關的觸發來控制LED燈亮滅。
1. 中斷介紹
我們已經知道,Arduino程式是在loop()中不斷的迴圈的。在程式的執行中,我們時常需要監控一些事件的發生,比如對某一感測器的返回資料進行解析。使用輪詢的方式檢測,效率比較低,而且隨著程式功能增加,輪詢到指定功能時需要等待的時間變長。而使用中斷方式檢測,可以到達實時檢測的效果。
中斷程式可以看作是一段獨立於主程式之外的程式,當中斷觸發時,控制器會暫停當前正在執行的主程式,而跳轉去執行中斷程式,中斷程式執行完後,會再回到之前主程式暫停的位置,繼續執行主程式。如此便可做到實時響應處理事件的效果。
2. 實驗材料
- Uno R3開發板
- 配套USB資料線
- 麵包板及配套連線線
- 1個LED燈
- 1個220Ω限流電阻
- 1個震動開關
震動開關,即震動感測器,根據其結構的不同又分為彈簧開關和滾珠開關。
-
彈簧開關,其內部由一根中心金屬導電腳和環繞在其外部的彈簧導電腳組成。彈簧震動時會接觸到中心導電腳,形成短路閉合狀態;
-
滾珠開關,其內部包含有一顆金屬滾珠,當震動時滾珠滾動短路兩個導電腳,形成短路閉合狀態。
3. 實驗步驟
1. 根據原理圖搭建電路。
直插式LED燈負極接開發板GND,正極接220Ω限流電阻,電阻另一端接開發板數字9引腳。震動開關一端接開發板GND,另一端接數字引腳2。
實驗原理圖如下圖所示:
實物連線圖如下圖所示:
2. 新建sketch,拷貝如下程式碼替換自動生成的程式碼並進行儲存。
/*
ShakeSwitch
中斷檢測振動感測器,控制LED燈亮滅
*/
int SensorLED = 9; //定義LED為數字引腳9
int SensorINPUT = 2; //連線震動開關到中斷0,也就是數字引腳2
char state = LOW;
void setup() {
pinMode(SensorLED, OUTPUT); //LED為輸出模式
pinMode(SensorINPUT, INPUT_PULLUP); //震動開關為輸入模式
//下降沿觸發,觸發中斷0,呼叫blink函式
attachInterrupt(0, blink, FALLING);
}
void loop() {
if (state == HIGH) { // 如果state為HIGH
state = LOW;
digitalWrite(SensorLED, HIGH); // 亮燈
delay(500); //延時500ms
}
else {
digitalWrite(SensorLED, LOW); // 否則,關燈
}
}
void blink() { //中斷函式blink()
state = !state; //一旦中斷觸發,state狀態反轉
}
3. 連線開發板,設定好對應埠號和開發板型別,進行程式下載。
4. 實驗現象
觸發震動後,LED燈點亮一段時間後熄滅。再次觸發震動再次點亮。
5. 函式介紹
attachInterrupt()
- 描述:外部中斷配置函式。
- 函式原型:attachInterrupt(interrupt, ISR, mode)
- 引數:
- interrupt: 中斷號。不同Arduino開發板中斷號不同。Uno R3有兩個外部中斷,分別為數字管腳2(中斷0)和數字管腳3(中斷1)。
- ISR: 中斷處理函式。此函式不帶引數,沒有返回值。
- mode: 中斷觸發方式。
- LOW: 低電平觸發。
- CHANGE:管腳狀態改變觸發。
- RISING:上升沿觸發。
- FALLING:下降沿觸發。
- 返回值:無。
6. 實驗分析
通過attachInterrupt()函式註冊數字管腳2為外部中斷,觸發方式為下降沿觸發。中斷處理函式blink()中每觸發一次翻轉一次state的狀態。loop()函式中通過state狀態來控制LED燈亮滅。
中斷是非常實用的功能,它釋放了CPU資源來做更多的事情。很多處理器、控制器都有中斷功能,更高階的還包括中斷優先順序「多箇中斷同時觸發時處理先後問題」和中斷巢狀「中斷中的中斷」。