← 返回传感器图鉴

TTP223 电容触摸传感器

最后更新 2026-06-20
⏱ 约 7 分钟 🟢 软件/低风险
🛒 器材清单
器材数量参考
TTP223 触摸模块1

价格随渠道波动,以购买页实时为准。

你想给自己的作品做一个开关,但又不想在面板上钻孔、装一个咔哒咔哒的机械按键——你希望手指往亚克力外壳上一摸,灯就亮了,外面看不到任何按钮。这种"隔着一层壳就能感应"的隐形开关,最便宜好用的方案就是 TTP223 电容触摸模块。一块指甲盖大小的板子,2 元出头,三根线接好就能用。

它的接法和读法跟普通按键几乎一模一样,但体验完全不同:没有手感、没有磨损、能藏在面板背后。下面把原理、接线、代码和那几个新手必踩的坑讲清楚。

工作原理

先理解一个词:电容。任何两块导体之间都存在电容,电容的大小跟导体面积、距离、周围介质有关。TTP223 模块上有一块铜质的触摸电极(就是板子正面那块大焊盘,有的型号背面有个弹簧或镀金区),这块电极本身对地就有一个固定的基准电容,大概几个 pF。

当你的手指靠近或接触这块电极时,人体相当于一个大电容,会让电极的对地电容增大。TTP223 芯片内部一直在测量这个电容值,一旦检测到电容比基准值高出一定阈值,就判定为"被触摸了",然后把 OUT 引脚的电平翻转——默认情况下:没摸 = 低电平(0),摸了 = 高电平(1)。

关键点在于:电容感应不需要金属直接接触手指。手指和电极之间隔一层非金属(亚克力、玻璃、塑料),只要足够薄,电容变化照样能被检测到。这就是它能做"隐藏式按键"的原因——把模块的触摸面贴在外壳内侧,外面光滑一片,手指摸上去照样有反应。一般亚克力/玻璃厚度在 1-3mm 以内最稳,再厚电容变化太小就摸不灵了。

和机械按键比,它没有任何活动部件,所以不存在"按多少万次会坏"的问题,也不会有接触不良、氧化。代价是它没有"咔哒"的物理反馈,你得靠灯光、声音来告诉用户"摸到了"。

接线

TTP223 是数字输出,三根线搞定:

TTP223 ESP32
VCC 3.3V(也可接 5V,模块支持 2.0-5.5V)
OUT (I/O) 任意 GPIO(数字读,比如 GPIO4)
GND GND

接好后 OUT 引脚就是一个干净的数字信号:摸 = 高,不摸 = 低(默认模式下)。它内部已经做了信号处理,输出非常稳定,不需要外接上拉/下拉电阻

如果你对数字信号和 GPIO 还不熟,可以先看 数字与模拟信号GPIO 是什么 两篇基础。

完整代码

逻辑和读普通按键一样:digitalRead 读 OUT 引脚,高电平就是被触摸。下面这段实现"每摸一下,LED 翻转一次开关状态"(触摸切换灯):

const int TOUCH_PIN = 4;    // OUT 接 GPIO4
const int LED_PIN   = 2;    // 板载 LED(ESP32 多为 GPIO2)

bool ledOn = false;         // 当前灯的状态
int lastState = LOW;        // 上一次读到的触摸电平

void setup() {
  Serial.begin(115200);
  pinMode(TOUCH_PIN, INPUT);   // TTP223 输出干净信号,不用 INPUT_PULLUP
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
}

void loop() {
  int state = digitalRead(TOUCH_PIN);   // 摸了=HIGH,没摸=LOW

  // 只在「从没摸 -> 摸到」这个上升沿动作一次,避免按住时连续翻转
  if (state == HIGH && lastState == LOW) {
    ledOn = !ledOn;                      // 翻转开关状态
    digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
    Serial.println(ledOn ? "灯 开" : "灯 灭");
  }
  lastState = state;

  delay(20);   // 普通按键这里要写一堆去抖代码,TTP223 芯片已经处理好了,简单延时即可
}

注意代码里那行注释:用机械按键时,你通常要写软件去抖(debounce),因为金属触点弹跳会产生很多毛刺脉冲。而 TTP223 芯片内部已经把抖动处理干净了,输出的是稳定电平,所以这里只需要做一个"上升沿检测"(从 LOW 变 HIGH 才动作),连复杂的去抖逻辑都省了。

你应该看到什么

上传代码后打开串口监视器(115200):

  • 手指摸触摸面 → OUT 从低跳到高 → 串口打印"灯 开",板载 LED 亮。
  • 再摸一下 → 串口打印"灯 灭",LED 灭。
  • 手指离开时 OUT 自动回到低电平,但因为代码只在"上升沿"动作,离开的瞬间不会触发。

如果你想直接看电平,把 Serial.println(state) 加进 loop,没摸时一直打印 0,手指一碰立刻变 1,松开回到 0——这就是默认的瞬动模式。

模式配置

TTP223 模块背面通常有两组焊盘(标记可能是 A/B 或 1/2,看具体丝印),用焊锡短接或断开来改变行为,这是它很灵活的地方:

  • 触发模式
    • 瞬动(momentary):默认。摸着才输出有效电平,松手就恢复——像普通按键。
    • 自锁(toggle):摸一下翻转一次并保持,再摸一下翻回去——模块自己当开关,连上面代码里的状态翻转都不用写了。
  • 输出电平
    • 高有效:默认。没摸低、摸了高(digitalRead 高 = 触摸)。
    • 低有效:反过来,没摸高、摸了低。改成低有效后记得把代码里的判断逻辑也对应翻转。

具体哪组焊盘对应哪个功能,以你手上模块的丝印或卖家说明为准——不同批次标注不完全一样。改完焊盘建议先用串口打印实测一下电平,确认行为符合预期再写正式逻辑。

选型 / 避坑

什么时候用触摸、什么时候用机械按键?

  • 隐藏式、无磨损、外观干净(隔壳感应、触摸面板、防水密封)→ 选 TTP223 电容触摸。
  • 明确的物理手感、最便宜、绝对可靠(确认键、急停、调试用)→ 选机械按键,参考 按键接线与去抖
🚧 避坑

上电瞬间会自校准:TTP223 通电那一刻会把当前电极电容当作"没摸"的基准。如果你上电时手正好放在触摸面上,它会把"有手"当成基准,结果就是怎么摸都没反应、或者行为乱掉。规则:上电时手离开触摸面,等它校准完(几百毫秒)再用。
金属面板会屏蔽:触摸面前面不能有金属,金属是导体会把电场屏蔽掉,手指的电容变化传不进去,直接失效。隔壳只能用亚克力、玻璃、塑料这类非金属。
外壳别太厚:隔壳感应的厚度一般控制在 1-3mm 以内,越厚越不灵,超过就基本摸不动了。
电源噪声会误触发:用劣质电源、或旁边有大功率开关电源时,电极容易被干扰乱跳。VCC 就近加一个 0.1μF 滤波电容、用干净的稳压电源能改善。

故障排查

现象 可能原因 怎么办
怎么摸都没反应 上电时手放在触摸面上,基准被带偏 手离开,断电重新上电校准
隔着外壳摸不灵 外壳太厚 / 中间有金属 换 1-3mm 非金属外壳,去掉金属层
不摸也乱跳/误触发 电源噪声、布线太长、附近强干扰 换干净电源、VCC 加 0.1μF、缩短信号线
摸了电平方向反了 焊盘被配成低有效,或代码判断写反 实测电平后对应改代码,或改回高有效焊盘
按住时灯一直闪 用了瞬动模式但没做上升沿检测 用本文代码的 lastState 上升沿逻辑

进阶 / 变体

  • 多路触摸做面板:一块 TTP223 只管一个触摸点。想做"四键触摸面板",就用 4 块 TTP223,各占一个 GPIO,分别读 OUT 即可——逻辑还是 4 次 digitalRead。预算多还可以选 TTP224/TTP229 这类多通道触摸芯片,一颗管多个键。
  • 自锁模式当独立开关:把焊盘改成自锁(toggle)模式,模块就成了一个不需要单片机也能用的"触摸开关",OUT 直接驱动继电器模块控制大功率设备(继电器接法见 继电器控制),单片机都可以不参与。
  • 触摸 + 灯效反馈:触摸没有手感,配一个 LED 或蜂鸣器在触摸时给反馈,体验会好很多。

小结

TTP223 用电容变化检测手指触摸,能隔着 1-3mm 的非金属外壳感应,输出干净的数字电平,读法和按键一样但免去了去抖。记住三件事:上电时手别放在触摸面上、前面不能有金属、外壳别太厚。需要隐形、无磨损、好看的开关就用它;要明确手感和极致可靠就回头看机械按键。

相关阅读:按键接线与去抖数字与模拟信号GPIO 是什么继电器控制,更多模块见 传感器图鉴

参数以 datasheet 为准;本页公开资料整理,接线与代码请结合实物验证。

内容有错、看不懂、或想看下一期?告诉我们 →

本文为公开资料的学习整理,非亲测。涉接线/花钱/合规的步骤请结合实物与官方最新资料验证,风险自负。见免责声明