-
关注嘉友创科技公众号
- 源码地址:https://github.com/HX-IoT/ESP32-Developer-Guide
- ESP32开发指南QQ群:824870185,内有pdf版,排版整洁。
学习目的及目标
学习轻触按键检测电路及硬件原理
学习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