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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章