基于Freertos的ESP-IDF开发——5.使用按键[不带消抖、带消抖、长按短按识别]

news2024/9/28 11:20:56

基于Freertos的ESP-IDF开发——5.使用按键[不带消抖、带消抖、长按短按识别]

  • 0. 前言
  • 1. 确定GPIO引脚
  • 2. 触发函数(不带消抖)
  • 3. 触发函数(带消抖)
  • 4. 长按和短按识别
  • 5.其他FreeRtos文章

0. 前言

这一节我们来学习使用按键操作。包括带消抖和不带消抖。

由于之前已经学习过FreeRtos使用任务的方式,所以不再过多赘述、
如果你对使用任务存有疑惑,你可以跳转到文章末尾学习第三节

开发环境:ESP-IDF 4.3
操作系统:Windows10 专业版
开发板:自制的ESP32-WROOM-32E

1. 确定GPIO引脚

查看原理图,发现GPIO引脚是连接在GPIO0引脚,也就是我们的 boot 按键上
在这里插入图片描述
先把前期要准备的工作先准备好,如下:

#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <driver/gpio.h>
#include "esp_log.h"

#define BUTTON_PIN  GPIO_NUM_0
static const char *TAG = "Key_Input";

2. 触发函数(不带消抖)

不带消抖的按键触发很简单:在一个死循环中,只要连接在 IO0 上的按键按下(IO0 接收到低电平),那么就视为触发了按键,演示代码如下:

#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <driver/gpio.h>
#include "esp_log.h"

#define BUTTON_PIN  GPIO_NUM_0
static const char *TAG = "Key_Input";

void button_task(void *arg)
{
    gpio_pad_select_gpio(BUTTON_PIN);
    gpio_set_direction(BUTTON_PIN, GPIO_MODE_INPUT);
    gpio_set_pull_mode(BUTTON_PIN, GPIO_PULLUP_ONLY);

    while (1) {
        if (gpio_get_level(BUTTON_PIN) == 0) {
			ESP_LOGI(TAG,"Button Pressed!\n");
        }
        vTaskDelay(10 / portTICK_PERIOD_MS);
    }
}

void app_main()
{
    xTaskCreate(button_task, "button_task", 2048, NULL, 10, NULL);
}

效果如下,只要按下去了就会检测到很多次触发:
在这里插入图片描述

3. 触发函数(带消抖)

上面的示例你可以看到每隔10ms就触发了一次函数,这样的高频操作甚至让我触发了堆栈空间溢出导致重启,所以我们使用按键还是需要使用消抖的,代码如下:

#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <driver/gpio.h>
#include "esp_log.h"

#define BUTTON_PIN  GPIO_NUM_0
static const char *TAG = "Key_Input";

void button_task(void *arg)
{
    int button_state = 0;
    int button_debounce = 0;
    int button_pressed = 0;
    while (1) {
        button_state = gpio_get_level(BUTTON_PIN);
        if (button_state == 0) {
            button_debounce++;
            if (button_debounce >= 10) {
                if (!button_pressed) {
					ESP_LOGI(TAG,"Button Pressed!\n");
                    button_pressed = 1;
                }
            }
        } else {
            button_debounce = 0;
            button_pressed = 0;
        }
        vTaskDelay(10 / portTICK_PERIOD_MS);
    }
}

void app_main()
{
    gpio_pad_select_gpio(BUTTON_PIN);
    gpio_set_direction(BUTTON_PIN, GPIO_MODE_INPUT);
    gpio_set_pull_mode(BUTTON_PIN, GPIO_PULLUP_ONLY);

    xTaskCreate(button_task, "button_task", 2048, NULL, 10, NULL);
}

演示效果如下,我连续按动,触发的间隔变短,也没有出现持续触发的情况,所以我们的按键消抖代码就写好了
在这里插入图片描述

4. 长按和短按识别

长按和短按的识别就是根据低电平的持续时间来判断是低电平还是高电平:

#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <driver/gpio.h>
#include "esp_log.h"

#define BUTTON_PIN  GPIO_NUM_0
static const char *TAG = "Key_Input";

#define LONG_PRESS_TIME_MS  1000

static void button_task(void *arg)
{
    gpio_pad_select_gpio(BUTTON_PIN);
    gpio_set_direction(BUTTON_PIN, GPIO_MODE_INPUT);
    gpio_set_pull_mode(BUTTON_PIN, GPIO_PULLUP_ONLY);

    TickType_t press_start_time = 0;
    bool is_button_pressed = false;

    while (1) {
        bool button_state = gpio_get_level(BUTTON_PIN);

        if (button_state && !is_button_pressed) {
            // Button is pressed
            is_button_pressed = true;
            press_start_time = xTaskGetTickCount();
        } else if (!button_state && is_button_pressed) {
            // Button is released
            is_button_pressed = false;
            TickType_t press_duration = xTaskGetTickCount() - press_start_time;

            if (press_duration >= pdMS_TO_TICKS(LONG_PRESS_TIME_MS)) {
                // 长按
                ESP_LOGI(TAG,"长按");
            } else {
                // 短按
                ESP_LOGI(TAG,"短按");
            }
        }

        vTaskDelay(pdMS_TO_TICKS(10));
    }
}

void app_main()
{
    xTaskCreate(button_task, "button_task", 2048, NULL, 10, NULL);
}

经过测试发现如果按键比较小不太好按的话,会容易出现抖动导致识别错误:
在这里插入图片描述

5.其他FreeRtos文章

还有以上文章值得你一览
基于Freertos的ESP-IDF开发——0.Windows下espidf的环境搭建
基于Freertos的ESP-IDF开发——1.HelloWorld
基于Freertos的ESP-IDF开发——2.点亮一颗LED
基于Freertos的ESP-IDF开发——3.使用任务(上)
基于Freertos的ESP-IDF开发——3.使用任务(中)
基于Freertos的ESP-IDF开发——3.使用任务(下)
基于Freertos的ESP-IDF开发——4.使用任务的方式来点亮LED灯

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/546516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能Python-python3_run

Python3 Run&#xff1a;学习Python必须掌握的运行方式 如果你在学习Python编程&#xff0c;那么Python3 Run是你必须掌握的运行方式之一。Python3 Run可以让你在本地环境中运行Python代码并查看运行结果。在本文中&#xff0c;我们将介绍Python3 Run的基本概念、使用方法和注…

概论_第4章__协方差Cov(X)的定义和性质___相关系数的定义和性质

前面讨论的方差是 一维随机变量X, 对于二维随机变量&#xff0c; 怎样计算方差呢&#xff1f; 这就引出了 协方差&#xff1a; 讨论X与Y之间相互关系的数字特征。 一 协方差的定义 协方差通俗的理解&#xff1a; 两个随机变量X, Y协作产生的方差。 计算协方差的公式有…

SSM框架学习-Spring事务

1. 数据库中事务与Spring中的事务 数据库事务和Spring中的事务是两个不同的概念&#xff0c;但Spring中的事务是建立在数据库事务之上的。 数据库事务是指一组数据库操作&#xff0c;要么全部成功执行&#xff0c;要么全部回滚&#xff08;撤销&#xff09;。这么做是为了保证数…

【Markdown】笔记

设置-通用-开启调试模式 普通文本编辑器编写的轻量级标记语言 标题 # ~ ###### 文本 _斜体_ *斜体* **粗体** ***粗斜体*** 列表 无序 * - 有序 1. 2. 3. Tab控制层级 链接 [链接名](链接地址) <链接地址> 引用 > 嵌套 > >> >>&…

hadoop零碎知识点总结

系列文章目录 ubuntu虚拟机下搭建zookeeper集群&#xff0c;安装jdk压缩包&#xff0c;搭建Hadoop集群与spark集群的搭建 虚拟机VMware里面安装Windows sever 2003版本详细教程_vmware安装win2003 centos7配置静态网络常见问题归纳_centos7网络问题 文章目录 系列文章目录…

chatgpt赋能Python-python3_排序

Python3 排序指南&#xff1a;介绍、说明和实践 Python3是当今最受欢迎的编程语言之一&#xff0c;拥有许多可用于各种任务的库和框架。其中之一是它自带的排序函数&#xff0c;在数据分析和机器学习等领域中非常有用。 在本篇文章中&#xff0c;我们将简要介绍Python3的排序和…

Baumer工业相机堡盟工业相机IO介绍与配置(二)

Baumer工业相机堡盟工业相机IO介绍与配置&#xff08;二&#xff09; Baumer工业相机Baumer工业相机IO的功能Baumer工业相机IO的作用Baumer工业相机IO上点连线方法 Baumer工业相机 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#…

Linux下基于TCP协议的Socket套接字编程(客户端服务端)入门详解

写在前面&#xff1a; 本篇博客探讨&实践环境如下&#xff1a; 1.操作系统&#xff1a; Linux 2.版本(可以通过命令 cat /etc/os-release 查看版本信息)&#xff1a;PRETTY_NAME“CentOS Linux 7 (Core)” 编程语言:C 一、socket 是什么&#xff1f; 常常说socket 、套接字…

chatgpt赋能Python-python3加密解密

Python3加密解密——确保你的数据安全 在今天的数字化时代&#xff0c;数据已经成为最重要的财产之一。然而&#xff0c;随着互联网的流行&#xff0c;数据泄露和非法访问变得越来越普遍。因此&#xff0c;确保数据的安全性变得非常重要。加密解密是目前最受欢迎的数据安全措施…

chatgpt赋能Python-python3_8如何下载

Python 3.8如何下载 Python 3.8是一种高级编程语言&#xff0c;具有简单易于学习和高度可读性的特点。这篇文章旨在为您提供Python 3.8的下载方法。 什么是Python 3.8 Python 3.8是Python编程语言的最新版本&#xff0c;于2019年10月发布。它引入了许多新特性和功能&#xf…

分布式消息中间件RocketMQ的安装与启动

RocketMQ 安装与启动 基本概念 消息(Message)&#xff1a;消息是指&#xff0c;消息系统所传输信息的物理载体&#xff0c;生产和消费数据的最小单位&#xff0c;每条消息必须属于一个主题。主体(Topic)&#xff1a; Topic表示一类消息的集合&#xff0c;每个主题包含若干条消…

免接管余压探测器的优势是什么?

余压传感器&#xff08;探测器&#xff09;是什么&#xff1f; 余压传感器&#xff08;探测器&#xff09;主要用于测量两个位置之间的压差。 余压传感器&#xff08;探测器&#xff09;的作用&#xff1f; 流量测量&#xff1a;在管道中&#xff0c;通过测量两点之间的压差&…

头歌计算机组成原理实验—运算器设计(5) 第5关:32位快速加法器设计

第5关&#xff1a;32位快速加法器设计 实验目的 帮助学生理解成组进位产生函数&#xff0c;成组进位传递函数的概念&#xff0c;熟悉 Logisim 平台子电路的概念&#xff0c;能利用前述实验封装好的4位先行进位子电路以及4位快速加法器子电路构建16位、32位、64位快速加法器&a…

Day42【动态规划】背包问题详解、416.分割等和子集

0-1背包问题详解&#xff1a;二维数组 文章讲解 视频讲解 0-1 背包问题&#xff1a;有 n 件物品和一个最多能背重量为 w 的背包。第 i 件物品的重量是 weight[i]&#xff0c;价值是 value[i]&#xff0c;每件物品只能用一次&#xff0c;求解将物品装入背包里物品价值总和最大…

深入理解 Go sync.Map

前言 Go 语言原生 map 并不是线程安全的&#xff0c;要对它进行并发读写操作时&#xff0c;一般有两种选择&#xff1a; 原生map搭配Mutex或RWMutex使用sync.Map 和原生map搭配Mutex或RWMutex相比&#xff0c;sync.Map在以下场景更有优势&#xff1a; 读多写少 修改&#x…

Golang 1.18 新特性模糊测试

一、Go 1.18新特性一览 0.官方博客&#xff1a;跳转 1.支持泛型 2.模糊测试 3.工作空间 4.性能提升 二、模糊测试介绍 模糊测试 &#xff08;fuzz testing, fuzzing&#xff09;是一种软件测试技术。其核心思想是將自动或半自动生成的随机数据输入到一个程序中&#xff0…

chatgpt赋能Python-python3怎么保存

Python 3如何高效地保存数据 Python是一门广泛使用的编程语言之一&#xff0c;其强大的工具和库使其成为从数据分析到机器学习等领域的首选语言。在处理大量数据时&#xff0c;数据的存储和访问变得非常关键。在这篇文章中&#xff0c;我们将讨论Python 3中如何保存数据以提高…

delphi6安装手册

DELPHI6安装手册 安装delphi6软件&#xff1a; 运行&#xff1a;\\dev2000 选择&#xff1a;set up→语言及开发工具→DELPHI6→双击图标install.exe 先后安装Delphi6和TeamSource 安装delphi6时会出现的要填序列号的情况 delphi6的安装序列号&#xff1a;在同一路径下双击ke…

chatgpt赋能Python-python3_9怎么调成黑色背景

Python是一种高级编程语言&#xff0c;它的版本不断发展和改进。最新发布的Python 3.9版本为用户提供了更多的新特性和改进&#xff0c;其中包括能够自定义代码编辑器背景颜色的新功能。本篇文章将介绍如何在Python 3.9中调整编辑器背景颜色为黑色&#xff0c;并探讨这个功能的…

三十九、分布式事务、seata、配置微服务客户端

1、事务 事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列SQL操作&#xff0c;这些操作作为一个整体一起向系统提交&#xff0c;要么都执行、要么都不执行。 1.1 ACID事务的特点 原子性: 一致性&#xff1a;隔离性持久性 1.2 事务并发带来的问题 脏读 幻读 不可重复读 …