第九章 ESP32的GPIO输入按键操作

学习目的及目标

学习轻触按键检测电路及硬件原理

学习ESP32 GPIO作为输入时候的配置

掌握库函数读取GPIO状态

掌握轻触按键检测程序

硬件设计及原理

按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生下图的带波纹信号,需要用软件消抖处理滤波,不方便输入检测。本实验板连接的按键带硬件消抖功能,如下图,它利用电容充放电的延时,消除了波纹,从而简化软件的处理,软件只需要直接检测引脚的电平即可,如果效果不佳,可以再使用软件去抖。

从按键的原理图可知,这些按键在没有被按下的时候,GPIO引脚的输入状态为高电平(按键所在的电路不通,引脚通过电阻接3.3V),当按键按下时,GPIO引脚的输入状态为低电平(按键所在的电路导通,引脚接到GND)。只要我们检测引脚的输入电平,即可判断按键是否被按下。1个用户按键占用ESP32的引脚如下:

按键标号

接至ESP32的引脚

K3

IO34

若您使用的实验板按键的连接方式或引脚不一样,只需根据我们的工程修改引脚即可,程序的控制原理相同。

软件设计

代码逻辑

ESP32的GPIO接口介绍

设置IO输出值函数:int gpio_get_level(gpio_num_t gpio_num);

函数原型

int gpio_get_level

(

gpio_num_t gpio_num

)

函数功能

读取IO输入值

参数

[in]gpio_num:引脚编号,0~34(存在部分)

返回值

按键的输入值

0:输入低

1:输入高

按键按下后松手在灯切换源码编写

获取按键状态,等于0表示按键按下,然后死等松手,切换灯状态。

包含头文件、IO宏定义、led灯状态变量定义

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <stdio.h>

#include <stdio.h>

#include "freertos/FreeRTOS.h"

#include "freertos/task.h"

#include "driver/gpio.h"

#include "sdkconfig.h"

#define LED_R_IO        2

#define LED_G_IO        18

#define KEY_IO 34

unsigned char led_r_status = 0;

unsigned char led_g_status = 0;

按键识别函数

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

void key_read(void)

{

    if(gpio_get_level(KEY_IO)==0)//按键按下

    {

        //等待松手,最傻的办法

        while(gpio_get_level(KEY_IO)==0);

        if (led_r_status==1)

        {

            led_r_status = 0;

            gpio_set_level(LED_R_IO, 1);//不亮

        }

        else

        {

            led_r_status = 1;

            gpio_set_level(LED_R_IO, 0);//亮

        }

    }

}

主函数:配置IO和调用按键识别

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

void app_main()

{

//选择IO

    gpio_pad_select_gpio(LED_R_IO);

    gpio_pad_select_gpio(LED_G_IO);

    gpio_pad_select_gpio(KEY_IO);

    //设置灯IO为输出

    gpio_set_direction(LED_R_IO, GPIO_MODE_OUTPUT);

    gpio_set_level(LED_R_IO, 1);//不亮

    gpio_set_direction(LED_G_IO, GPIO_MODE_OUTPUT);

    gpio_set_level(LED_G_IO, 1);//不亮

    //设置按键IO输入

    gpio_set_direction(KEY_IO, GPIO_MODE_INPUT);

    

    while(1) {

        key_read();//按键识别

    }

}

按键按下红灯切换,松手绿灯切换源码编写

新建一个缓存key_status[2],保存按键的实时状态,当按键状态发送下降沿就是按键按下动作,当发生上升沿就是按键松手动作。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

void key_read1(void)

{

    //按键识别

    if(gpio_get_level(KEY_IO)==0){

        key_status[0] = 0;

    }

    else{

       key_status[0] = 1;

    }

    if(key_status[0]!=key_status[1]) {

        key_status[1] = key_status[0];

        if(key_status[1]==0){//按键按下

            if (led_r_status==1){

                led_r_status = 0;

                gpio_set_level(LED_R_IO, 1);//不亮

            }else{

                led_r_status = 1;

                gpio_set_level(LED_R_IO, 0);//亮

            }

        }else{//按键松手

            if (led_g_status==1){

                led_g_status = 0;

                gpio_set_level(LED_G_IO, 1);//不亮

            }else{

                led_g_status = 1;

                gpio_set_level(LED_G_IO, 0);//亮

            }

        }

    }

}

更多更详细接口请参考官方指南

硬件连接

开发板默认已经连接好按键,下载程序即可,使用其他开发板需要修改程序或者修改硬件连接皆可。

效果展示

简单,如期。

按键总结

按键去抖最好使用硬件解决掉。

实际项目中也可能会使用专用的按键芯片,例如CH452、AW9523等。

按键除了这种扫描方式(简单),还有中断识别(常用实用)的方式,我们再后期讲解。

源码地址:https://github.com/xiaolongba/wireless-tech

点我->更多ESP32开发指南系列目录

发布了45 篇原创文章 · 获赞 48 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_24550925/article/details/85335516