GPIO - 使用 GPIO Interrupt 控制 LED

材料準備

  • AmebaD [AMB21 / AMB22 / AMB23 / BW16] x 1

  • LED x 1

  • Button x 1

範例説明

這個範例裡,我們使用按鈕與LED。一開始LED是亮的,當我們按下按鈕並放開之後,LED變暗。再按下按鈕之後,LED變亮。相比較於Arduino的入門的範例 “按鈕與LED”,不一樣的地方是,Arduino的範例是按著按鈕,LED才亮著,放開按鈕,LED才熄滅。

Open the example, “Files” “Examples” “AmebaGPIO” “LED_InterruptCtrl”

AMB21 / AMB22 接線的方式如下

../../../../_images/image153.png

AMB23 接線的方式如下

../../../../_images/image248.png

BW16 接線的方式如下

../../../../_images/image2-23.png

BW16-TypeC Wiring Diagram:

../../../../_images/image2-31.png
編譯程式並上傳到Ameba完成之後,按下Reset按鈕。
一開始LED是亮的,當我們按下Pin 12的按鈕並放開,LED變暗,再按一次,LED變亮

程式碼説明

setup()

裡面我們將Pin 12的按鈕設定成

INPUT_IRQ_RISE

,代表當這根pin的電壓遇到GND變成3V3的情況會觸發Interrupt。所以我們將按鈕一端接在3V3,按下按鈕時3V3會連通而觸發interrupt。

pinMode(button, INPUT_IRQ_RISE);

我們也可以設定成

INPUT_IRQ_FALL

,代表遇到pin的電壓遇到3V3變成GND會觸發Interrupt。這種情況裡,按鈕另一端通常會接在GND設定完pin mode之後,再設定要處理interrupt的function:

digitalSetIrqHandler(button, button_handler);

其中第二個參數是function pointer,它的prototype是:

void button_handler(uint32_t id, uint32_t event)

所以我們在這個handler裡面處理interrupt,每按一次按鈕(並放開)會觸發一次中斷,我們就改變LED狀態。