读取ESP32-CAM触摸传感器的脉冲数

https://blog.csdn.net/qq_41741344/article/details/116572887一文中,有关读取触摸传感器的脉冲数的实验,代码如下:

#include "driver/gpio.h"
#include "driver/touch_pad.h"
uint16_t value;
void setup() {
    touch_pad_init(); //初始化传感器驱动程序
    touch_pad_set_voltage(TOUCH_HVOLT_2V7, TOUCH_LVOLT_0V5, TOUCH_HVOLT_ATTEN_0V); 
    
    touch_pad_set_fsm_mode(TOUCH_FSM_MODE_TIMER);//设置为硬件触发
    touch_pad_config(TOUCH_PAD_NUM0, 0); //不使用中断,因此也不需要设置阈值
    touch_pad_filter_start(10); //设置IIR滤波器
    uint16_t value;
    while (1)
    {
        touch_pad_read_raw_data(TOUCH_PAD_NUM0, &value);  //读取原始数据
        printf("raw data = %d\n", value);
        touch_pad_read_filtered(TOUCH_PAD_NUM0, &value); //读取滤波后的数据
        printf("IIR data = %d\n", value);
        vTaskDelay(10 / portTICK_PERIOD_MS);
    }
 }

void loop() {
} 

我用一根导线连到ESP32-CAM的GPIO4,并触摸它,结果两个值一直为0,请问问题出在什么地方?

问题解决。原因是并非T0-T9在ESP32-CAM中,都能当touchPin使用。谢谢关注。

答案参考Chatgpt解答
代码没问题,问题可能出在以下几个方面:

  1. 引脚设置:确保将ESP32-CAM的GPIO4正确设置为触摸传感器输入引脚。请确保通过适当的引脚映射将GPIO4配置为触摸传感器所需的引脚。
  1. 电路连接:确认导线正确连接到ESP32-CAM的GPIO4引脚,并且导线的另一端与触摸传感器的输出脚连接。确保连接的稳定性和可靠性。
  1. 触摸传感器的工作原理:确保您使用的触摸传感器与ESP32-CAM兼容,并且正确配置了电压和阈值等参数。根据您的代码,已设置了适当的电压和滤波器参数,但请确保这些参数与您使用的触摸传感器的要求相匹配。
  1. 触摸传感器故障:如果以上步骤都没有问题,那么可能是触摸传感器本身存在问题。尝试使用不同的触摸传感器进行测试,或者使用其他方法(如按下按钮)来模拟触摸输入,看是否能够正常读取值。

如果您仍然无法解决问题,建议检查ESP32-CAM的文档和相关资源,以确保正确设置和使用触摸传感器功能。此外,查阅ESP32论坛或社区,寻求其他开发者的经验和建议也可能有所帮助。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7641859
  • 你也可以参考下这篇文章:【好奇心驱动力】ESP32-CAM PIN与GPIO引脚对应关系
  • 除此之外, 这篇博客: ESP32-CAM高性价比温湿度监控系统中的 一、ESP32-CAM高性价比温湿度监控系统是什么? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •     daodanjishui在上一篇的项目:ESP32-CAM创建热点构成并发式DNS服务器详细介绍了嵌入式服务器局域网DNS的应用,当时的服务器主页只能查询ESP32-CAM板载LED 灯的状态和控制LED灯的打开和关闭,但是没有查询环境参数功能,没有真正体现出物联网技术的精髓,也是上一篇不足的地方。
        daodanjishui在这一篇的项目中,保留上一篇的功能之外,将加入DHT11温湿度传感器模块,并且加入传感器驱动程序,这个模块只有一个数据接口data,所以只占用ESP32-CAM的一个GPIO14,所以很容易将上一期的项目改造成一个温湿度监控系统。系统的功能就是在表单的窗口中输入:data 再点击cmd按钮提交命令,ESP32服务器就会查询温湿度数据返回到服务器主页,用户就可以查询到环境参数,显示在反馈信息那里,对上一篇功能不清楚的买家可以去看看上一篇(第四篇)的介绍。硬件效果如下图所示:

    在这里插入图片描述
    程序运行效果如下所示(红色字体就是传感器采集回来的数据):
    在这里插入图片描述
    DHT11的驱动程序当时是在网上随便找一个驱动程序实现采集数据功能的,测试的效果不是很好,测几次才得一次数据,其实差不多就可以了,要准确就要好好修改驱动程序,后面找到一个靠谱一点的DHT驱动程序,在这里分享一下,一些常用的库可以在:http://www.taichi-maker.com/homepage/download/#library-download
    免费下载得到。

  • 以下回答由chatgpt基于相关博客总结生成:

    根据你提供的参考资料中的代码以及其他资料,我发现可能会有以下原因导致你读取ESP32-CAM触摸传感器脉冲数始终为0:

    1. 导线连接不良,可以检查一下连接是否牢固,并在代码中确认使用的GPIO是否正确。
    2. 需要给触摸传感器供电,一般使用3.3V电压给其供电。
    3. 代码逻辑错误或者不完整。

    以下是一份示例代码来读取ESP32-CAM触摸传感器的脉冲数:

    const int TOUCH_PIN = 4; //定义触摸引脚
    volatile bool touch_detected = false; //标记变量来检测到触摸信号
    
    void IRAM_ATTR touchInterruptHandler(void *arg)
    {
      touch_detected = true; // 标记变量设置为触摸检测到信号
    }
    
    void setup()
    {
      pinMode(TOUCH_PIN, INPUT_PULLUP);
      attachInterrupt(TOUCH_PIN, touchInterruptHandler, FALLING); // 设置触摸中断
    }
    
    void loop()
    {
      if (touch_detected)
      {
        touch_detected = false; //重置标记变量为false
        Serial.println("Touch detected!"); //打印检测到触摸信号的消息
      }
    }
    

    在这个示例中,我们使用了attachInterrupt函数来设置触摸中断。当触摸引脚的信号从高电平变为低电平时,会触发中断,然后在中断处理函数中设置标记变量touch_detected为true。在loop函数中,我们检测标记变量是否为true,如果是,就打印出一个消息并将标记变量重置为false。

    此外,你也可以使用touchRead函数来读取ESP32-CAM触摸传感器的值,例如:

    const int TOUCH_PIN = 4; //定义触摸引脚
    
    void setup()
    {
      Serial.begin(115200);
    }
    
    void loop()
    {
      int touch_value = touchRead(TOUCH_PIN); //读取触摸值
      Serial.print("Touch value: ");
      Serial.println(touch_value); //打印触摸值
      delay(100); //延时一段时间
    }
    

    以上是一些可能有帮助的代码示例,希望可以解决你的问题。如果问题仍然存在,你可以检查一下ESP32-CAM触摸传感器是否能正常工作,或者使用其他方法来获取数据。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
在上述代码中,虽然已经将触摸传感器GPIO4配置为触摸传感器的输入引脚,并且设置了相应的模式和滤波器,但是仍然需要手动启用触摸传感器GPIO的输入功能。

因此,需要在setup()函数的开头添加以下代码:

gpio_pad_select_gpio(GPIO_NUM_4); //选择GPIO4
gpio_set_direction(GPIO_NUM_4, GPIO_MODE_INPUT); //设置GPIO4为输入

此外,也可以尝试按照以下代码进行尝试:

#include "driver/gpio.h"
#include "driver/touch_pad.h"

//GPIO定义
#define TOUCH_PIN_NUM    GPIO_NUM_4

//触摸传感器读取函数
void TP_Read_Task(void *pvParameter)
{
    //启用GPIO输入
    gpio_pad_select_gpio(TOUCH_PIN_NUM); 
    gpio_set_direction(TOUCH_PIN_NUM, GPIO_MODE_INPUT);

    //初始化传感器
    touch_pad_init();
    touch_pad_set_voltage(TOUCH_HVOLT_2V7, TOUCH_LVOLT_0V5, TOUCH_HVOLT_ATTEN_0V); 
    touch_pad_config(TOUCH_PAD_NUM0, 0);

    while (true)
    {
        uint16_t touch_value = 0;
        if (touch_pad_read(TOUCH_PAD_NUM0, &touch_value) == ESP_OK)
        {
            printf("Touch value = %d\n", touch_value);
        }
        vTaskDelay(20 / portTICK_PERIOD_MS);
    }
}

void app_main()
{
    xTaskCreate(&TP_Read_Task, "TP_Read_Task", 2048, NULL, 5, NULL);
}

这是一个简单的针对ESP32-CAM触摸传感器的读取任务,读取周期是20毫秒。

建议尽量不要使用touch_pad_set_fsm_mode()函数,因为硬件触发模式可能在不同的ESP32芯片中具有不同的表现,并且可能会导致不确定性问题。在使用软件模式时,相对安全且可靠性更高。
如果我的回答解决了您的问题,请采纳!

触摸传感器
可以借鉴下
https://blog.csdn.net/qq_41741344/article/details/116572887