Ameba Arduino: [RTL8722CSM] [RTL8722DM] [RTL8722DM MINI] GPIO - 使用GPIO Interrupt控制LED

材料准备

  • AmebaD [RTL8722DM / RTL8722CSM / RTL8722DM MINI] x 1
  • LED x 1
  • Button x 1

范例说明

这个范例里,我们使用按钮与LED。一开始LED是亮的,当我们按下按钮并放开之后,LED变暗。再按下按钮之后,LED变亮。

相比较于Arduino的入门的范例 “按钮与LED”,不一样的地方是,Arduino的范例是按着按钮,LED才亮着,放开按钮,LED才熄灭。

我们打开范例程式, “Files” -> “Examples” -> “AmebaGPIO” -> “LED_InterruptCtrl”。

RTL8722DM / RTL8722CSM 接线如下图:

1

RTL8722DM MINI 接线如下图:

1

编译程式并上传到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
请先确认已安装QQ通讯软体