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

一、板子上哪些脚能摸
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。如果你下载的库版本没这个问题,就当我没说。

二、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 附近。

想看得更细可以关掉串口监视器,换 工具 > 串口绘图仪,数值曲线会画出来,摸不摸一目了然。这个走的是同一个串口,只是换了个显示方式。
三、贴块铝箔,把阈值摸准
裸杜邦线能摸,但接触面太小。教程推荐剪一小块铝箔纸裹在线头上,做一个触摸垫,手一放上去就能感应到。

裹好铝箔后回到串口监视器观察:不碰的时候读数稳定在 70 以上,手掌按上去直接掉到 10 以下。于是可以定一个阈值,比如 20——读数低于 20 就认为被摸了。我的建议是阈值别贴着极限值定,留出余量,不然环境波动容易误触发。
四、做成触控 LED 开关
光看数字没意思,接个 LED 让它真的"开个东西"。需要的材料很简单:
- ESP32 DOIT DEVKIT V1 开发板
- 5mm LED 一颗
- 330 欧电阻一颗
- 面包板和杜邦线若干
LED 通过电阻接 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 灭。下图就是点亮的实拍效果,稳定复现,没有出现乱触发。

五、踩坑小结
把这次玩下来的要点归拢一下:
- ESP32 板载 10 个电容触摸 GPIO,不用外接触摸模块;
- 手指碰上去读数会掉——是变低不是变高,别把判断逻辑写反;
- 阈值要按自己的实测值定,我用 20,你那边不碰时的底值可能不一样,先看串口再定;
- 杜邦线越长越容易受干扰,铝箔垫面积越大变化越明显;
- 触摸引脚还能当深度睡眠的唤醒源,下次拿它做个拍一下就醒的小东西。
整个项目零额外模块成本,只花了两根杜邦线、一颗 LED 和一块铝箔。对新手来说,这大概是 ESP32 上性价比最高的入门实验之一,建议都摸一遍。











串口绘图仪看曲线确实直观,建议新手第一步先看图再定阈值,别照抄20
请问这个阈值20是固定的吗?我看你文中说不同板子底值不一样,我的是40多,是不是直接把阈值定在10左右就行?
之前用触摸模块踩过坑,原来ESP32板子自带触摸脚,学到了
楼主你好,我照着接的LED一直常亮不灭,串口里数值常年十几个,是不是杜邦线太长了?换短的那根试试
铝箔这个方法真香,我贴在盒子外壳内侧,隔着一层塑料板都能触发