ESP32自带电容触摸引脚:不接模块做触控开关

2026-11-09 20:16:54 28阅读 所属项目:ESP32 开发板

翻 ESP32 的引脚图才发现,这块板子居然自带 10 个电容触摸 GPIO,也就是说不用买任何触摸模块,接根杜邦线就能做触控开关。我照着教程踩了一遍坑,从读数值到点亮 LED 全流程跑通了,这篇就把过程记下来,给同样想白嫖板载触摸功能的朋友省点时间。

ESP32 触摸传感器引脚实操封面图

一、板子上哪些脚能摸

ESP32 一共有 10 个电容触摸 GPIO,编号 T0 到 T9。这类引脚能感知任何带电荷物体的接近,人的皮肤正好符合,所以手指一碰,读数就有明显变化。它们可以直接接一块触摸焊盘,替代机械按键用。

对照下面这张引脚图,触摸引脚用粉色标出来了:触摸传感器 0 对应 GPIO4,传感器 2 对应 GPIO2,以此类推。有个小坑要提醒:触摸传感器 1 是 GPIO0,但我手头这块 30 个引脚的 DOIT DEVKIT V1 板子没有把 GPIO0 引出来,36 脚的版本才有。另外当时 Arduino IDE 的 ESP32 库还有个已知问题,GPIO33 和 GPIO32 的触摸编号是反的——想用 GPIO32 得写 T8,想用 GPIO33 得写 T9。如果你下载的库版本没这个问题,就当我没说。

ESP32 DOIT DEVKIT V1 引脚图,粉色为触摸引脚

二、touchRead() 先读个裸值

读触摸引脚就一个函数:touchRead(GPIO),把要读的 GPIO 编号传进去就行。库里有现成示例,Arduino IDE 里打开 文件 > 示例 > ESP32 > Touch > TouchRead 就能看到。核心就这几行:

Serial.begin(115200);
Serial.println(touchRead(4));

示例读的是 T0,也就是 GPIO4,你可以传触摸编号 T0,也可以直接传 GPIO 编号 4,效果一样。选好板子和串口,上传之后在 GPIO4 上插一根杜邦线,金属头就是触摸点。打开串口监视器,波特率 115200,能看到数值不停刷出来。

我实际试的结果:手没碰的时候读数在 90 左右晃,手指一捏杜邦线的金属头,数值立刻往下掉。下图的例子更直观,没碰时 94,捏住线之后一路降到 0 附近。

手捏接在 GPIO4 上的杜邦线,串口数值明显下降

想看得更细可以关掉串口监视器,换 工具 > 串口绘图仪,数值曲线会画出来,摸不摸一目了然。这个走的是同一个串口,只是换了个显示方式。

三、贴块铝箔,把阈值摸准

裸杜邦线能摸,但接触面太小。教程推荐剪一小块铝箔纸裹在线头上,做一个触摸垫,手一放上去就能感应到。

用铝箔纸裹住杜邦线头做成触摸垫

裹好铝箔后回到串口监视器观察:不碰的时候读数稳定在 70 以上,手掌按上去直接掉到 10 以下。于是可以定一个阈值,比如 20——读数低于 20 就认为被摸了。我的建议是阈值别贴着极限值定,留出余量,不然环境波动容易误触发。

四、做成触控 LED 开关

光看数字没意思,接个 LED 让它真的"开个东西"。需要的材料很简单:

  • ESP32 DOIT DEVKIT V1 开发板
  • 5mm LED 一颗
  • 330 欧电阻一颗
  • 面包板和杜邦线若干

LED 通过电阻接 GPIO16,按下图接就行。

LED 经 330 欧电阻接 GPIO16 的电路原理图

完整代码如下,逻辑就是循环读触摸值,低于阈值点灯,高于就灭:

// set pin numbers
const int touchPin = 4; 
const int ledPin = 16;

// change with your threshold value
const int threshold = 20;
// variable for storing the touch pin value 
int touchValue;

void setup(){
  Serial.begin(115200);
  delay(1000); // give me time to bring up serial monitor
  // initialize the LED pin as an output:
  pinMode (ledPin, OUTPUT);
}

void loop(){
  // read the state of the pushbutton value:
  touchValue = touchRead(touchPin);
  Serial.print(touchValue);
  // check if the touchValue is below the threshold
  // if it is, set ledPin to HIGH
  if(touchValue < threshold){
    // turn LED on
    digitalWrite(ledPin, HIGH);
    Serial.println(" - LED on");
  }
  else{
    // turn LED off
    digitalWrite(ledPin, LOW);
    Serial.println(" - LED off");
  }
  delay(500);
}

上传后把手指按在铝箔垫上,LED 亮;手拿开,LED 灭。下图就是点亮的实拍效果,稳定复现,没有出现乱触发。

手按铝箔触摸垫,GPIO16 上的 LED 点亮

五、踩坑小结

把这次玩下来的要点归拢一下:

  • ESP32 板载 10 个电容触摸 GPIO,不用外接触摸模块;
  • 手指碰上去读数会掉——是变低不是变高,别把判断逻辑写反;
  • 阈值要按自己的实测值定,我用 20,你那边不碰时的底值可能不一样,先看串口再定;
  • 杜邦线越长越容易受干扰,铝箔垫面积越大变化越明显;
  • 触摸引脚还能当深度睡眠的唤醒源,下次拿它做个拍一下就醒的小东西。

整个项目零额外模块成本,只花了两根杜邦线、一颗 LED 和一块铝箔。对新手来说,这大概是 ESP32 上性价比最高的入门实验之一,建议都摸一遍。


作者:菜鸟也想玩
链接:https://www.aiddithome.com/p/1446f780be297a.html
本作版权归作者所有,未经允许请勿转载。若存在违规行为,您可以点击 “举报”。


登录 后发表评论
6条评论
锡点
1楼 · 3小时前

串口绘图仪看曲线确实直观,建议新手第一步先看图再定阈值,别照抄20

阿伟不emo
2楼 · 3小时前

请问这个阈值20是固定的吗?我看你文中说不同板子底值不一样,我的是40多,是不是直接把阈值定在10左右就行?

老张装机
3楼 · 3小时前

之前用触摸模块踩过坑,原来ESP32板子自带触摸脚,学到了

触底反弹的Tony
4楼 · 3小时前

楼主你好,我照着接的LED一直常亮不灭,串口里数值常年十几个,是不是杜邦线太长了?换短的那根试试

电烙铁爱好者
5楼 · 3小时前

铝箔这个方法真香,我贴在盒子外壳内侧,隔着一层塑料板都能触发

1 2