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解答
代码没问题,问题可能出在以下几个方面:
如果您仍然无法解决问题,建议检查ESP32-CAM的文档和相关资源,以确保正确设置和使用触摸传感器功能。此外,查阅ESP32论坛或社区,寻求其他开发者的经验和建议也可能有所帮助。
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
免费下载得到。
根据你提供的参考资料中的代码以及其他资料,我发现可能会有以下原因导致你读取ESP32-CAM触摸传感器脉冲数始终为0:
以下是一份示例代码来读取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