GPIO - 使用GPIO Interrupt控制LED
材料準備
- Ameba x 1
- LED x 1
- Button x 1
範例說明
這個範例裡,我們使用按鈕與LED。一開始LED是亮的,當我們按下按鈕並放開之後,LED變暗。再按下按鈕之後,LED變亮。
相比較於Arduino的入門的範例 “按鈕與LED”,不一樣的地方是,Arduino的範例是按著按鈕,LED才亮著,放開按鈕,LED才熄滅。
我們打開範例程式, “Files” -> “Examples” -> “AmebaGPIO” -> “InterruptCtrlLed”
並且接線如下圖
編譯程式並上傳到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狀態。
NOTE:如果發現按下按紐LED的狀態沒變,或是LED閃了一下又恢復成原本的狀態,通常是因為人的手指相較於IC不夠靈敏,所以雖然我們覺得只按了一次,實際上輕微的抖動IC都認的出來,並且實際上是觸發了兩次interrupt