(1)实验平台:普中科技ESP32开发板
(2)平台购买地址:普中ESP32开发板
(3)资料下载:普中科技-各型号产品资料下载链接


        前面章节我们学习了ESP32的按键控制,当时通过查询GPIO输入电平来判断按键状态,此种方法占用CPU资源,效率不高。本章我们学习外部中断,通过外部中断实现LED控制。本章分为如下几部分内容:

 

10.1 实验介绍

10.1.1 实验简介

10.1.2 实验目的

10.1.3 MicroPython函数使用

10.2 硬件设计

10.3 软件设计

10.4 实验现象


10.1 实验介绍

10.1.1 实验简介

        前面我们在做按键控制实验时,虽然能实现 IO 口输入功能,但代码是一直在检测 IO 输入口的变化,因此效率不高,特别是在一些特定的场合,比如某个按键,可能 1 天才按下一次去执行相关功能,这样我们就浪费大量时间来实时检测按键的情况。

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

        ESP32的外部中断有上升沿、下降沿、低电平、高电平触发模式。上升沿和下降沿触发如下:

        若将按键对应IO配置为下降沿触发,当按键按下后即触发中断,然后在中断回调函数内执行对应功能。

10.1.2 实验目的

        使用外部中断功能实现按键控制LED亮灭。

10.1.3 MicroPython函数使用

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

10.2 硬件设计

        本实验使用到硬件资源如下:

        (1)按键模块

        (2)ESP32 GPIO

        (3)LED模块

        按键模块电路如下所示:

        由图可知,J3端子的KEY1-KEY4脚为按键控制端,要检测按键是否被按下,只需读取J3端子的KEY1-KEY4脚是否为低电平,因此可使用导线将ESP32的IO口与J2端子的KEY1-KEY4脚连接。

        本章实验使用ESP32的IO14、27、26、25引脚,接线如下所示:

10.3 软件设计

        下面我们打开“\4--实验程序\1--MicroPython实验\1--基础实验\9-外部中断实验”程序,控制代码全部都在main.py中,代码如下:

'''
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN
 普中

实验名称:外部中断实验
接线说明:按键模块-->ESP32 IO
         (K1-K4)-->(14,27,26,25)
         
         LED模块-->ESP32 IO
         (D1-D4)-->(15,2,0,4)
         
实验现象:程序下载成功后,操作K1键控制D1指示灯亮灭;操作K2键控制D2指示灯亮灭;
         操作K3键控制D3指示灯亮灭;操作K4键控制D4指示灯亮灭;
注意事项:

'''

#导入Pin模块
from machine import Pin
import time

#定义按键控制对象
key1=Pin(14,Pin.IN,Pin.PULL_UP)
key2=Pin(27,Pin.IN,Pin.PULL_UP)
key3=Pin(26,Pin.IN,Pin.PULL_UP)
key4=Pin(25,Pin.IN,Pin.PULL_UP)

#定义LED控制对象
led1=Pin(15,Pin.OUT)
led2=Pin(2,Pin.OUT)
led3=Pin(0,Pin.OUT)
led4=Pin(4,Pin.OUT) 


#定义LED状态
led1_state,led2_state,led3_state,led4_state=0,0,0,0

#KEY1外部中断函数
def key1_irq(key1):
    global led1_state
    time.sleep_ms(10)
    if key1.value()==0:
        led1_state=not led1_state
        led1.value(led1_state)

#KEY2外部中断函数
def key2_irq(key2):
    global led2_state
    time.sleep_ms(10)
    if key2.value()==0:
        led2_state=not led2_state
        led2.value(led2_state)

#KEY3外部中断函数
def key3_irq(key3):
    global led3_state
    time.sleep_ms(10)
    if key3.value()==0:
        led3_state=not led3_state
        led3.value(led3_state)

#KEY4外部中断函数
def key4_irq(key4):
    global led4_state
    time.sleep_ms(10)
    if key4.value()==0:
        led4_state=not led4_state
        led4.value(led4_state)
        
#程序入口
if __name__=="__main__":
    led1.value(led1_state)  #初始化LED,熄灭状态
    led2.value(led2_state)
    led3.value(led3_state)
    led4.value(led4_state)
    
    key1.irq(key1_irq,Pin.IRQ_FALLING)  #配置key1外部中断,下降沿触发
    key2.irq(key2_irq,Pin.IRQ_FALLING)  #配置key2外部中断,下降沿触发
    key3.irq(key3_irq,Pin.IRQ_FALLING)  #配置key3外部中断,下降沿触发
    key4.irq(key4_irq,Pin.IRQ_FALLING)  #配置key4外部中断,下降沿触发
    
    while True:
        pass

        以上代码中需要注意的地方:

        1、ledx_state 是全局变量,因此在 fun 函数里面用该变量必须添加 global ledx_state 代码,否则会在函数里面新建一个样的变量造成冲突。

        2、在定义回调函数keyx_irq的时候,需要将 Pin 对象 KEY 传递进去。

10.4 实验现象

        下载程序前,按照如下接线:

        将程序下载到开发板内(可参考第2章节“2.2.5 程序下载运行”),可以操作K1键控制D1指示灯亮灭;操作K2键控制D2指示灯亮灭;操作K3键控制D3指示灯亮灭;操作K4键控制D4指示灯亮灭。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐