TTP223 电容触摸传感器
| 器材 | 数量 | 参考 |
|---|---|---|
| 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 为准;本页公开资料整理,接线与代码请结合实物验证。