ESP32-S3开发教程四:GPIO输入/按键控制LED
新建一个名为Button的工程,这里不再赘述。
·
一、新建工程
新建一个名为Button的工程,这里不再赘述。
二、添加头文件
分别完善CMakeList.txt和main.c文件:
idf_component_register(SRCS "main.c"
PRIV_REQUIRES driver freertos
INCLUDE_DIRS ".")
#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
void app_main(void)
{
}
编译确认无误:

三、编写按键代码
#include <stdio.h>
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
void button_init(void)
{
gpio_config_t io_config = {
.pin_bit_mask = (1ULL << GPIO_NUM_11),
.mode = GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_ENABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE,
};
gpio_config(&io_config);
}
void LED_init()
{
gpio_config_t io_config = {
.pin_bit_mask = (1ULL << GPIO_NUM_15)|(1ULL << GPIO_NUM_16)|(1ULL << GPIO_NUM_17),
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE,
};
gpio_config(&io_config);
}
void button_task(void *pvParameters)
{
int a = 0;
while (1)
{
if (gpio_get_level(GPIO_NUM_11) == 0)
{
vTaskDelay(pdMS_TO_TICKS(10));
if(gpio_get_level(GPIO_NUM_11) == 1)
{
continue;
}
while (gpio_get_level(GPIO_NUM_11) == 0)
{
vTaskDelay(pdMS_TO_TICKS(10));
}
a++;
}
if (a>2)
{
a = 0;
}
if (a == 0)
{
gpio_set_level(GPIO_NUM_15, 1);
gpio_set_level(GPIO_NUM_16, 0);
gpio_set_level(GPIO_NUM_17, 0);
}
else if (a == 1)
{
gpio_set_level(GPIO_NUM_15, 0);
gpio_set_level(GPIO_NUM_16, 1);
gpio_set_level(GPIO_NUM_17, 0);
}
else if (a == 2)
{
gpio_set_level(GPIO_NUM_15, 0);
gpio_set_level(GPIO_NUM_16, 0);
gpio_set_level(GPIO_NUM_17, 1);
}
}
}
void app_main(void)
{
button_init();
LED_init();
xTaskCreate(
button_task,
"button_task",
2048,
NULL,
5,
NULL);
}
在button_init()中,我们定义了GPIO10为带上拉电阻的输入。上拉电阻的意思就是当这个引脚没有任何操作时,默认是高电平,按钮按下后,回到低电平。
在button_task()中,我们做了一个消抖处理,当检测到按钮按下后,先等待10ms,如果按钮变为高电平则说明是机械抖动,不予理会。若等待10ms后还是低电平,证明是有用输入,我们更改LED状态并修改对应引脚的输出电平。
LED_init()和有关的逻辑都是流水灯的逻辑,详情可以参考上上篇开发教程。
四、编译烧录
点击编译烧录后,可以看到当按钮按下时,切换被点亮的LED:

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)