第5章 按键控制实验

第五章 按键控制实验

1. 导入

按键是一种电子开关, 使用时轻轻按开关按钮就可使开关接通, 当松开手时,开关断开。 一般机械按键按下和松开时存在抖动情况, 如下:

屏幕截图 2024 08 05 103251

这种抖动可能会影响程序误判, 造成严重后果, 通常会使用软件延时 10ms来消斗。 例如, 当按键按下后, 引脚为低电平; 所以首先读取引脚电平, 若引脚为低电平, 则延时 10ms 后再次读取引脚电平, 若为低电平, 则证明按键已按下。这种方法称为软件消抖。

两者区别参考:硬件消抖和软件消抖的比较 - 面包板社区 (eet-china.com)

2. 硬件设计

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

  • 按键模块

  • ESP32 GPIO

  • LED模块

按键模块电路如下所示:

屏幕截图 2024 08 05 103529

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

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

屏幕截图 2024 08 05 103716

3. 软件设计

3.1 MicroPython函数使用

MicroPython 中可使用 machine 模块中的 Pin 模块对 GPIO 输入检测。 其构造方法和使用方法如下:

屏幕截图 2024 08 05 103831

GPIO 输入操作函数和输出是类似的, 仅在 mode 参数配置为输入方式和 pull设置上下拉电阻。

3.2 代码分析

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)

# 定义按键键值
KEY1_PRESS,KEY2_PRESS,KEY3_PRESS,KEY4_PRESS = 1,2,3,4
key_en = 1

# 按键扫描函数
def key_scan():
    global key_en # 声明全局变量
    if key_en == 1 and (key1.value() == 0 or key2.value() == 0 or key3.value() == 0 or key4.value() == 0): # 按键被按下
        time.sleep_ms(10) # 延时10ms,消抖
        key_en = 0 # 按键被按下,禁止重复按键
        if key1.value() == 0:
            return KEY1_PRESS
        elif key2.value() == 0:
            return KEY2_PRESS
        elif key3.value() == 0:
            return KEY3_PRESS
        elif key4.value() == 0:
            return KEY4_PRESS
    elif key1.value() == 1 and key2.value() == 1 and key3.value() == 1 and key4.value() == 1: # 按键被释放
        key_en = 1 # 按键被释放,允许按键
    return 0 # 按键未被按下

# 主函数
if __name__ == '__main__':
    key = 0
    i_led1,i_led2,i_led3,i_led4 = 0,0,0,0 # 定义LED初始状态
    led1.value(i_led1)
    led2.value(i_led2)
    led3.value(i_led3)
    led4.value(i_led4)
    while True:
        key = key_scan() # 扫描按键
        if key == KEY1_PRESS: # 按键1被按下
            i_led1 = 1 - i_led1 # 切换LED状态
            led1.value(i_led1)
        elif key == KEY2_PRESS: # 按键2被按下
            i_led2 = 1 - i_led2
            led2.value(i_led2)
        elif key == KEY3_PRESS: # 按键3被按下
            i_led3 = 1 - i_led3
            led3.value(i_led3)
        elif key == KEY4_PRESS: # 按键4被按下
            i_led4 = 1 - i_led4
            led4.value(i_led4)

有过学习51单片机的基础,看这个代码应该比较简单了

屏幕截图 2024 08 05 105905

屏幕截图 2024 08 05 105941

屏幕截图 2024 08 05 110042

4. 小结

这一章主要就是一个按键扫描函数,这个我们已经在51单片机矩阵按键那章见识过了,只是C语言和python语法不一样


2024.8.20 第一次修订,后期不再维护

posted @ 2024-08-20 09:19  hazy1k  阅读(47)  评论(0编辑  收藏  举报