利用外部中断方式来检查按键KEY状态

电子说

1.3w人已加入

描述

我们学习了如何使用 Micropython 和 ESP32 实现 GPIO 输入输出功能。然而,这种方式存在一个问题:代码需要不断地检测 IO 输入口的变化,导致效率较低。特别是在一些特定场景下,例如某个按键可能一天只被按下一次,但我们仍然浪费了大量时间实时检测按键情况。

为了解决这个问题,我们引入了外部中断的概念。顾名思义,当按键被按下(产生中断)时,我们才去执行相关功能。这大大节省了 CPU 的资源,因此中断在实际项目中的应用非常普遍。

在这个实验证中,我们利用中断方式来检查按键 KEY 状态,被按键被按下(产生外部中断)后使 LED的亮灭状态翻转。

什么是外部中断

外部中断是一种硬件机制,用于通知 CPU 有事件发生。当某个特定的条件满足时(例如,一个按键被按下),CPU 会暂停当前的任务,转而执行与该事件相关的处理程序。这样,我们可以在事件发生时才去处理,而不是持续地检测事件是否发生。

材料准备

  • ESP32开发板
  • LED灯
  • 220欧姆电阻
  • 面包板
  • USB数据线
  • 电脑
  • 按键开关(最好是自复位的)
    和前面那篇用的一样的材料

连接电路

led灯

数字电路中的高低电平

在数字电路中,信号的传输是通过电压的变化来实现的。上升沿、下降沿和高低电平是描述信号变化过程的重要概念。

1.高电平和低电平:

高电平和低电平是用来表示数字信号的两个状态。通常情况下,我们将逻辑“1”对应的电压值称为高电平(如3.3V或5V),将逻辑“0”对应的电压值称为低电平(如0V)。这两个状态之间的电压差称为阈值电压。

2.上升沿:

上升沿是指信号从低电平跳变到高电平的过程。在这个过程中,信号的电压从一个阈值电压上升到另一个阈值电压。上升沿通常用于表示一个事件的发生,例如按键按下、时钟信号的上升等。

3.下降沿:

下降沿是指信号从高电平跳变到低电平的过程。在这个过程中,信号的电压从一个阈值电压下降到另一个阈值电压。下降沿通常用于表示一个事件的结束,例如按键释放、时钟信号的下降等。

led灯

编写代码

led灯

代码简说

外部中断也是通过 machine 模块的 Pin 子模块来配置,我们来看看其配构造函数和使用方法:

构造函数

KEY=machine.Pin(id,mode,pull) 构建按键对象

  • id:引脚编号
  • mode:输入输出方式
  • pull:上下拉电阻配置

中断使用方法

KEY.irq(handler,trigger) 配置中断模式
handler:中断执行的回调函数;
trigger: 触发中断的方式,共 4 种分别是

  • Pin.IRQ_FALLING(下降沿触发)
  • Pin.IRQ_RISING(上升沿触发)
  • Pin.IRQ_LOW_LEVEL(低电平触发)
  • Pin.IRQ_HIGH_LEVEL(高电平触发)

上升沿和下降沿触发统称边沿触发,根据前面的波形图,我们可以选择下降沿方式触发外部中断,也就是当按键被按下的时候立即产生中断。

整体思路中断跟前面的实验类似,在初始化中断后,当系统检测到外部终端时候,执行 LED 亮灭状态反转的代码即可。

在以上代码中,需要注意以下几点:

1.在函数fun中使用全局变量state时,需要使用global state声明,否则会在函数内部创建一个新的同名变量,导致冲突。

2.在定义回调函数fun时,需要将Pin对象KEY作为参数传递进去。这样可以确保在回调函数内部可以访问到正确的引脚对象。

运行程序

运行代码,每次按下按键 LED 状态翻转。

总结

从参考代码来看,仅仅几行代码就实现了实验功能,而且相对于使用while True实时检测函数来说,代码的效率得到了极大的提升。外部中断的应用非常广泛,不仅包括普通的按键输入和电平检测,还有很多输入设备,如传感器,也是通过外部中断方式来实时检测的。这些在后面的章节中会详细讲解。

现在越来越注重青少年的科创活动,micropython,树莓派,arduino,图形化编程学会了硬件控制的基础,这些平台用起来大同小异。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分