本篇介紹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資源來做更多的事情。很多處理器、控制器都有中斷功能,更高級的還包括中斷優先級「多箇中斷同時觸發時處理先後問題」和中斷嵌套「中斷中的中斷」。