1.学习目标
- 学习轻开关键检测电路及硬件原理
- 学习 ESP32 GPIO 作为输入时候的配置
- 掌握库函数读取 GPIO 状态
- 掌握开关按键检测程序
2.硬件设计及原理
通过检测输入按键的高低电平来判断是断开状态还是启动状态
从按键的原理图可知,这些按键在没有被按下的时候,GPIO 15引脚的输入状态为高电平(按键所在的电路不通),当按键按下时,GPIO 引脚的输入状态为低电平(按键所在的电路导通,引脚接到 GPIO4)。只要我们检测引脚的输入电平,即可判断按键是否
被按下。将检测到的状态用自带的LED灯表示出来,用户按键占用 ESP32 的引脚如下
按键引脚 | 接引至引脚 | 作用 |
---|---|---|
GPIO4 | GPIO15 | 按键开关 |
GPIO2 | 无 | LED灯显示 |
3.代码实现
1.代码逻辑
- 初始化LED灯
- 初始化按键
- 检测按键状态
- 状态用LED显示并打印到串口
- 重复开关按键,检测是否准确
2.源码编写
#include <stdio.h>
#include <sdkconfig.h>
#include <driver/gpio.h>
#include <esp_log.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#define Key_IO 4
#define LED_IO 2
#define Key_IO2 15
static const char *TAG = "example";
void key_read(void)
{
if (gpio_get_level(Key_IO2==0)) //判断按键是否为接通
{
while (gpio_get_level(Key_IO2)==0)//等待松手
{
//灯亮
gpio_set_level(LED_IO,1);
ESP_LOGI(TAG,"The Led is turn");
}
}
if (gpio_get_level(Key_IO2==1)) //判断按键是否断开
{
while (gpio_get_level(Key_IO2)==1)//等待松手
{
//灯灭
gpio_set_level(LED_IO,0);
ESP_LOGI(TAG,"The Led is off");
}
}
}
void app_main(void)
{
//选择IO口
esp_rom_gpio_pad_select_gpio(Key_IO);
esp_rom_gpio_pad_select_gpio(Key_IO2);
esp_rom_gpio_pad_select_gpio(LED_IO);
//设置输入模式
gpio_set_direction(Key_IO2,GPIO_MODE_INPUT);
gpio_set_direction(Key_IO,GPIO_MODE_OUTPUT);
gpio_set_direction(LED_IO,GPIO_MODE_OUTPUT);
while (1)
{
key_read();//按键识别
}
}
评论