【ESP32 C++教程】Unit3-2 触摸输入

本小节讲解ESP32内置触摸引脚的用法,

ESP32集成了多达10个(或更多,依据具体型号)可配置的Touch引脚(如下图),能够感知轻微的电容变化,从而实现非机械式的触摸控制。
这些引脚可以配置为检测触摸事件,非常适合于构建低功耗、无按键的用户界面。

【ESP32 C++教程】Unit3-2 触摸输入

Touch引脚实际上是一个电容式传感器,具有内部振荡器电路,可测量固定时间内引脚上的充电/放电频率。
例如,如果您触摸这些引脚中的任何一个,手指电荷将通过改变连接到触摸传感器的 RC 电路来改变这个周期数。


下面用示例来说明其使用方法

从 https://gitee.com/billyzh/esp32-cpp-lesson 下载本教程的源码到本地硬盘文件夹,如d:\esp32-cpp-lesson
在VSCode中,选择【文件】->【打开文件夹...】选择上一步保存的文件夹打开

示例1:使用TouchRead

选择config.h文件,修改第10行为
#define APP_LESSON32_A 1

打开unit3-lesson32a/board_config文件,设置器件使用的引脚,
#define TOUCH_1_PIN GPIO_NUM_2

监测引脚触摸状态,代码如下(unit2-lesson32a/my_board.cpp):

MyBoard::MyBoard() : Board() {

    Log::Info(TAG, "===== Create Board ...... =====");

    Log::Info(TAG, "initial led.");
    led_ = new GpioLed(BUILTIN_LED_PIN, false); // no pwm

    xTaskCreate([](void* pvParam){
        MyBoard *board = static_cast<MyBoard*>(pvParam);
        board->TouchCheck();
    }, "TouchDetected_Task", 4096, this, 1, NULL);

    Log::Info( TAG, "===== Board config completed. =====");
}

void MyBoard::TouchCheck() {
    while (1) {
        touch_value_t tv = touchRead(TOUCH_1_PIN);
        if (tv < kThreshold) {
          Log::Info(TAG, "Touch detected.");
          Application& app = Application::GetInstance();
          app.OnPinTouchEvent(kTouch1);
       }
       delay(100);
    }
}

程序解读
1. 本程序使用xTaskCreate创建一个匿名任务,在这个任务里调用MyBoard的TouchCheck方法;
2. TouchCheck是一个死循环,意味着任务会一直执行, 在循环内读取触摸引脚电容值,当读取的值小于阀值时,判定有触摸发生,然后调用Application类的OnPinTouchEvent;
关于xTaskCreate函数,请查看FreeRTOS相关文档。

控制LED闪烁

闪烁代码如下(unit3-lesson31a/my_application.cpp):

void MyApplication::OnLoop() {
    if (touch1_detected_) {
        Led *led = Board::GetInstance().GetLed();
        led->TurnOn();
        delay(200);
        led->TurnOff();
        touch1_detected_ = false;
    }
    delay(1);
}

bool MyApplication::OnPinTouchEvent(const std::string& pin_name) {
    if (pin_name == kTouch1) {
        touch1_detected_=true;
        return true;
    }
    return Application::OnPinTouchEvent(pin_name);
}

程序解读
1. 在OnLoop方法中检测touch1_detected_的值,若为true,则点亮LED 0.2秒,touch1_deteted_是MyApplication类的一个私有变量,并使用了volatile定义,防止编译器优化变量访问,确保每次读写都直接操作内存;
2. 重载Application类的OnPinTouchEvent方法实现业务,这里简单的设置touch1_detected_变量为true;

编译项目并上传开发板检验

本例实际上是一个多任务并行的程序,一个任务执行触摸检测(TouchCheck),另一个任务为主任务(OnLoop), 有关多任务的知识在后面小节讲解。

示例2:使用touch中断

选择config.h文件,修改第10行为
#define APP_LESSON32_B 1

打开unit3-lesson32b/board_config文件,设置器件使用的引脚,
#define TOUCH_1_PIN GPIO_NUM_2

设置引脚触电摸中断,代码如下(unit2-lesson32b/my_board.cpp):

void _OnTouched() {
    Log::Info(TAG, "Touch detected.");

    Application& app = Application::GetInstance();
    app.OnPinTouchEvent(kTouch1);
}

MyBoard::MyBoard() : Board() {
    Log::Info(TAG, "===== Create Board ...... =====");

    Log::Info(TAG, "initial led.");
    led_ = new GpioLed(BUILTIN_LED_PIN, false); // no pwm

    touchAttachInterrupt(
        TOUCH_1_PIN, 
        _OnTouched, /* 中断调用函数 */
        kThreshold /* 中断触发阀值 */
    );
    //参考:https://www.xpstem.com/doc/arduino-esp32/api/touch

    Log::Info( TAG, "===== Board config completed. =====");
}

程序解读
1. 本程序使用touchAttachInterrupt关联触摸引脚(TOUCH_1_PIN)和中断处理程序(_OnTouched),第三个参数为中断触发阀值; 2. 在中断处理程序中,调用Application类的OnPinTouchEvent;

中断

中断是指当 CPU 在正常处理主程序时,突然发生了另一件事件 A(中断发生)需要 CPU 去处理,这时 CPU 就会暂停处理主程序(中断响应),转而去处理事件 A(中断服务)。当事件 A 处理完以后,再回到主程序原来中断的地方继续执行主程序(中断返回)。这一整个过程称为中断。

【ESP32 C++教程】Unit3-2 触摸输入

中断可以根据中断源分为 硬件中断 和 软件中断:
硬件中断:也被称为外部中断,硬件中断响应外部硬件事件而发生。例如,当检测到触摸时会发生触摸中断,而当 GPIO 引脚的状态发生变化时会发生 GPIO 中断;
软件中断:当触发软件事件(例如定时器溢出)时,会发生这种类型的中断,定时器中断也是软件中断。

控制LED闪烁

这部分代码与上一示例是一样的,不再详述。

有关TouchRead和touchAttachInterrupt的更多信息,请查看ESP32 TOUCH API

作业:
将本小节两种引脚触摸处理程序封装为一个TouchPin类

- 本文由用户 老张 发布,文中观点仅代表作者本人,不代表本站立场。
- 如需转载,请联系作者;如有侵权,请联系本站处理。

01-18   阅读(529)   评论(0)
 标签: 创客电子 ESP32 ESP32-ArduinoFx

涨知识
数码管

也称作LED数码管,是一种可以显示数字和其他信息的电子设备。玻璃管中包括一个金属丝网制成的阳极和多个阴极。大部分数码管阴极的形状为数字。

评论:
相关文章
ESP32扫描wifi 热点列表

就像我们用手机打开WiFi功能后可以浏览附近的可用WiFi。要将手机连接到热点,通常需要打开Wi-Fi设置应用程序,列出可用的网络,然后选择所需的热点。然后输入密码(或不输入密码),可以使用ESP32进行相同的操作。


MimiClaw 配置飞书机器人和添加硬件控制技能

本文本介绍配置飞书机器人为MimiClaw的一个输入/输出端,和添加一个控制WS2812与LED的控制技能。


ESP32-S3 部署 MimicLaw 完整教程:从零到成功调用 DeepSeek

一块 30 块钱的开发板 + 一个大模型 API,就能做出可以听懂人话的智能硬件。 本文记录完整安装过程和踩坑经验,确保你跟着做就能跑通。


MimiClaw 架构全解析,把 “智能龙虾” 跑在 ESP32 上

本文将从手绘架构图入手,逐层拆解 MimiClaw 的分层设计、核心模块、数据流转与底层实现,带你解剖这只“智能虾”的技术骨架,看懂在 C 语言加持下,AI 智能体如何以可穿戴设备的形态,在你身边稳稳运行、离线服务、主动响应。


如何用 platform.local.txt 深度定制 ESP32 编译流程?

本文介绍如何在不脱离 ArduinoIDE 可视化开发的前提下,通过一个名为 platform.local.txt 的小文件,实现对 ESP32 编译流程的精准控制。


优化Arduino-ESP32程序体积

本文将系统分析程序体积增长的五大根源,并提供经过验证的优化方案,帮助减小固件大小。


开发ESP32大模型AI语音助手-从软件到硬件

本文所DIY的语音助手设备端使用的是MicroPython、服务端是Python,对于很多开发者来说MicroPython入门没难度。


【ESP32 C++教程】Unit10-2:音频录制

本小节使用音频开发框架实现一个音频录制到文件的示例。


ESP32 I2S 接口深度解析:从时序、格式到 ESP-IDF 驱动实战

I2S协议通过BCLK、LRCLK和DATA三线精准传输音频数据,但时序边沿、帧格式、时钟源等细节常引发噪声或断连。本文详解ESP32的I2S实现,从协议原理到ESP-IDF v5.x代码配置,助你避开常见陷阱,确保音频稳定传输。


【ESP32 C++教程】Unit10-1:音频播放

本小节介绍音频的基础知识、音频开发框架和AudioCodec的简介,用一个音频播放示例来说明音频管道的使用。