ESP32 IDF的触摸按键例子

硬件资源

1.ESP32 开发板

2. LED灯(-接到GND, +通过10K电阻接到PIN4)

3. 触摸按键(接到PIN32,对应触摸通道9)

预期效果:

1. 点动模式:小于1s的触摸,LED交替亮灭

2. 长按模式:大于1s的触摸,LED快速闪烁(100ms)

3. 带防抖

代码如下

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "driver/touch_pad.h" // 添加触摸传感器头文件
#include "esp_log.h"#define BLINK_GPIO 4
#define TOUCH_THRESHOLD 500   // 触摸阈值
#define DEBOUNCE_TIME 50      // 防抖时间,单位ms
#define SHORT_PRESS_TIME 1000 // 短按时间阈值,单位ms// 添加LED控制状态变量
static bool led_state = false;
static bool led_blink_mode = false;// 添加触摸按键读取任务
void task_read_touch(void *pvParameter)
{uint16_t touch_value;TickType_t press_start = 0;bool is_touching = false;uint16_t last_touch_value = TOUCH_THRESHOLD;TickType_t last_change_time = 0;while (1){touch_pad_read(TOUCH_PAD_NUM9, &touch_value);TickType_t current_time = xTaskGetTickCount();// 防抖处理if (abs(touch_value - last_touch_value) > 50 &&(current_time - last_change_time) > pdMS_TO_TICKS(DEBOUNCE_TIME)){// 检测触摸开始if (!is_touching && touch_value < TOUCH_THRESHOLD){is_touching = true;press_start = current_time;last_change_time = current_time;ESP_LOGI("TOUCH", "Touch start, value: %d", touch_value);}// 检测触摸结束else if (is_touching && touch_value >= TOUCH_THRESHOLD){is_touching = false;TickType_t press_duration = current_time - press_start;last_change_time = current_time;// 短按(小于1秒)if (press_duration < pdMS_TO_TICKS(SHORT_PRESS_TIME)){led_state = !led_state;gpio_set_level(BLINK_GPIO, led_state);ESP_LOGI("TOUCH", "Short press detected! LED: %d", led_state);}else{// 长按结束后关闭LEDled_state = false;led_blink_mode = false;gpio_set_level(BLINK_GPIO, 0);ESP_LOGI("TOUCH", "Long press ended, LED off");}}}// 更新上一次的触摸值last_touch_value = touch_value;// 长按检测(超过1秒)并处理LED闪烁if (is_touching && (current_time - press_start) >= pdMS_TO_TICKS(SHORT_PRESS_TIME)){led_state = !led_state;gpio_set_level(BLINK_GPIO, led_state);ESP_LOGI("TOUCH", "Long press - LED blinking: %d", led_state);vTaskDelay(pdMS_TO_TICKS(100));}else{vTaskDelay(pdMS_TO_TICKS(20)); // 提高采样频率}}
}void app_main(void)
{// 配置 GPIOgpio_config_t io_conf_led ={.pin_bit_mask = (1ULL << BLINK_GPIO),.mode = GPIO_MODE_OUTPUT,.pull_up_en = GPIO_PULLUP_DISABLE,.pull_down_en = GPIO_PULLDOWN_DISABLE,.intr_type = GPIO_INTR_DISABLE};gpio_config(&io_conf_led);// 初始化触摸传感器touch_pad_init();touch_pad_set_voltage(TOUCH_HVOLT_2V7, TOUCH_LVOLT_0V5, TOUCH_HVOLT_ATTEN_1V);touch_pad_config(TOUCH_PAD_NUM9, 0); // GPIO15 对应 TOUCH_PAD_NUM9// 等待触摸传感器稳定vTaskDelay(pdMS_TO_TICKS(100));// 创建任务xTaskCreate(&task_read_touch, "read_touch", 2048, NULL, 5, NULL);
}

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

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

相关文章

《2025软件测试工程师面试》功能测试篇

什么是功能测试? 功能测试是通过验证产品功能是否满足用户需求的过程,主要关注软件的功能是否符合需求规格说明,包括软件的各种功能、特性、性能、安全性和易用性等。 功能测试的流程包括哪些步骤? 需求分析:明确软件需求,确定测试范围。测试计划:制定详细的测试计划,…

python官方文档阅读整理(一)

2.2 解释器的运行环境 2.2.1 源文件的字符编码 默认情况下&#xff0c;python源码文件的编码是UTF-8。 3.Python速览 Python注释以#开头&#xff0c;直到该物理行结束。注释可以在行开头&#xff0c;或空白符与代码之后&#xff0c;但不能在字符串里面。 3.1 Python用作计…

队列的顺序结构—循环队列的判断条件(rear + 1) % MAXSIZE分析

一、为什么需要牺牲一个空间&#xff1f; 循环队列通过 front 和 rear 指针的位置关系来判断队列的空和满。但如果不牺牲一个空间&#xff0c;会导致以下问题&#xff1a; 1. 队空和队满的冲突 队空条件&#xff1a;front rear。队满条件&#xff1a;如果允许队列完全填满&…

Baklib内容中台赋能企业智管

内容中台构建全场景智管 现代企业数字化运营中&#xff0c;全域内容管理能力已成为核心竞争力。通过智能知识引擎驱动的内容中台架构&#xff0c;企业能够实现跨部门、多形态数据的统一归集与动态调度。以某制造企业为例&#xff0c;其利用中台系统将分散在CRM、ERP及内部文档…

大模型学习--微调

模型微调是一种在已有预训练模型的基础上&#xff0c;通过使用特定任务的数据集进行进一步训练的技术。这种方法允许模型在保持其在大规模数据集上学到的通用知识的同时&#xff0c;适应特定任务的细微差别。使用微调模型&#xff0c;可以获得以下好处&#xff1a; 提高性能&a…

【C++】模板编程入门指南:零基础掌握泛型编程核心(初阶)

文章目录 一、泛型编程二、函数模板1. 函数模板的概念和格式2. 函数模板的原理3. 函数模板的实例化隐式实例化显式实例化 三、类模板 一、泛型编程 泛型编程就是编写与类型无关的通用代码&#xff0c;是代码复用的一种手段&#xff0c;模板是泛型编程的基础&#xff0c;可能不太…

IO学习day2

一、思维导图 IO标准函数 问&#xff1a; printf\fprintf\sprintf\snprintf之间的区别&#xff1f; 1. printf&#xff1a;格式串输出&#xff0c;会在当前终端打印输出结果 2. fprintf&#xff1a;文件的写入&#xff0c;可以写入不同的数据类型&#xff08;int&#xff0c…

python-leetcode 47.路径总和III

题目&#xff1a; 给定一个二叉树的根结点root,和一个整数targetSum,求该二叉树力节点值之和等于targetSum的路径数目。 路径不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节点到子节点&#xff09; 方法一…

加油站小程序实战教程06地图多站点显示

目录 引言功能设计与开发步骤第一步&#xff1a;初始化项目与地图第二步&#xff1a;动态切换城市地图第三步&#xff1a;标记加油站位置第四步&#xff1a;获取用户位置并计算最近加油站第五步&#xff1a;城市名称解析完整代码总结 引言 在上一篇《加油站小程序实战05&#…

【vue-echarts】——04.配置项---legend

文章目录 一、配置项-legend图例二、显示结果一、配置项-legend图例 图例组件展现了不同系列的标记,颜色和名字。可以通过点击图例控制哪些系列不显示。 代码如下 Demo4View.vue <template><div class="about">

如何在一台服务器上搭建 mongodb副本集1主2从节点

在一台服务器上搭建 MongoDB 副本集&#xff08;1 主节点 2 从节点&#xff09;可以通过运行多个 MongoDB 实例并使用不同端口和数据目录来实现。以下是详细步骤&#xff1a; 1. 准备工作 确保已安装 MongoDB。为每个实例创建独立的数据目录和日志文件。 2. 创建数据目录和…

【Mac】2025-MacOS系统下常用的开发环境配置

早期版本的一个环境搭建参考 1、brew Mac自带终端运行&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" Installation successful!成功后运行三行命令后更新环境&#xff08;xxx是mac的username&a…

本地部署 DeepSeek:从 Ollama 配置到 Spring Boot 集成

前言 随着人工智能技术的迅猛发展&#xff0c;越来越多的开发者希望在本地环境中部署和调用 AI 模型&#xff0c;以满足特定的业务需求。本文将详细介绍如何在本地环境中使用 Ollama 配置 DeepSeek 模型&#xff0c;并在 IntelliJ IDEA 中创建一个 Spring Boot 项目来调用该模型…

行为型模式 - 观察者模式 (Publish/Subscribe)

行为型模式 - 观察者模式 (Publish/Subscribe) 又称作为订阅发布模式&#xff08;Publish-Subscribe Pattern&#xff09;是一种消息传递模式&#xff0c;在该模式中&#xff0c;发送者&#xff08;发布者&#xff09;不会直接将消息发送给特定的接收者&#xff08;订阅者&…

科技查新有不通过的情况吗?为什么?

1. 科技查新有不通过的情况吗&#xff1f;为什么&#xff1f; 有。科技查新“不通过”&#xff08;即查新报告显示技术缺乏新颖性或存在侵权风险&#xff09;的情况并不罕见&#xff0c;主要原因包括&#xff1a; &#xff08;1&#xff09;技术缺乏创新性 重复开发&#xff…

Docker安装Postgres_16数据库

PostgreSQL简介 PostgreSQL 是一个功能强大、开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;以其可靠性、功能丰富性和可扩展性而闻名。它支持复杂的查询、事务完整性、并发控制以及多种数据类型和扩展功能&#xff0c;适用于各种规模的应用程序; 适用传…

【期末考试应急处理】Linux 历年考试-试题及答案汇总

一、单选 1 . 存放用户帐号的文件是&#xff08;C&#xff09;。 A. shadow B. group C. passwd D. gshadow 2 . 下面哪个系统目录中包含 Linux 使用的外部设备&#xff08;B&#xff09;。 A./bin B./dev C./boot D./home 3 . Linux 系统的联机帮助命令是&#xff08;D&…

文件上传漏洞:upload-labs靶场1-10

目录 文件上传漏洞介绍 定义 产生原因 常见危害 漏洞利用方式 upload-labs详解 pass-01 pass-02 pass-03 pass-04 pass-05 pass-06 pass-07 pass-08 pass-09 pass-10 文件上传漏洞介绍 定义 文件上传漏洞是指网络应用程序在处理用户上传文件时&#xff0c;没有…

XR应用测试:探索虚拟与现实的边界

引言 随着XR&#xff08;扩展现实&#xff0c;Extended Reality&#xff09;技术的快速发展&#xff0c;VR&#xff08;虚拟现实&#xff09;、AR&#xff08;增强现实&#xff09;和MR&#xff08;混合现实&#xff09;应用逐渐渗透到游戏、教育、医疗、工业等多个领域。对于…

探秘基带算法:从原理到5G时代的通信变革【二】Viterbi解码

文章目录 二、关键算法原理剖析2.1 Viterbi 解码2.1.1 卷积码与网格图基础**卷积码****网格图****生成多项式****理想情况下解码过程** 2.1.2 Viterbi 算法核心思想2.1.3 路径度量与状态转移机制2.1.4 算法流程与关键步骤详解2.1.5 译码算法举例与复杂度分析2.1.6 算法代码示例…