1. 程式人生 > >Arduino基礎入門篇13—外部中斷

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

掃碼加入微信公眾號:TonyCode