☰
用Arduino自制电容触摸传感器:原理、电路与调试全攻略
2026/10/7 15:47:17 网站建设 项目流程

如果你做过几个硬件小项目,迟早会遇到同一个问题:想检测“人有没有碰到这里”,但既不想装机械微动开关——手感生硬、寿命短、还有缝隙,也不想用一堆红外对管——怕光干扰、怕遮挡、装起来还丑。我第一次遇到这个需求是做亚克力台灯,想用手摸灯座调节亮度,翻遍手边的模块箱也没找到合适的触摸方案。市面上的 TTP223 模块便宜归便宜,但电极形状固定,隔着 5mm 厚的亚克力外壳经常失灵;MPR121 模块功能强,买回来却要配不少外围元件,数据手册对新手也不算友好。后来我花了两个晚上,用铜箔胶带、几颗电阻、一个 Arduino 把电容传感器完整地搓了出来,效果比预期好不少。

这篇文章就把整个制作过程、测量原理、选型逻辑和踩坑记录完整写下来。你会看到最核心的原理推导,也会跟着我把电极贴在真实外壳上,从裸数据一步步调到稳定触发。文章不追求高大上的专用芯片,而是先用最朴素、最透明的 RC 充放电法把测量链路吃透——等你理解了底层的“电容变化如何变成数字信号”,再决定要不要上专用电容检测芯片就非常容易了。

适合这几类人看:想搞懂电容传感器底层逻辑而不是只会买模块的硬件爱好者,做交互装置需要自定义触摸/接近感应方案的创客,以及正在为“隔着外壳检测水位或人手靠近”找可行方案的产品原型开发者。

1. 测量原理:电容传感器到底在测什么

1.1 平行板电容公式与人体近场效应的物理图像

传感器这个名词听起来唬人,但拆开看,电容传感器的核心就是测一个“电容值的变化”。先回到基础公式:

C = εr × ε0 × A / d

其中 εr 是电极间介质的相对介电常数,ε0 是真空介电常数,A 是两个极板正对面积,d 是极板间距。

应用到人手触摸这个场景时,物理图像是这样的:电极本身和周围的导体——大地、电源地线、甚至整个设备金属外壳——之间天然存在一个寄生电容。当你的手指靠近电极时,手指相当于另一块“极板”,它与电极之间的距离 d 很小,而且人体组织的等效介电常数远大于空气,所以整个电极对地的总电容会明显变大。传感器要捕捉的,就是这个“静音状态下突然增加的那几个皮法”。

我自己喜欢把一个比较生活化的类比讲给新手听:电容就像一个容量很难说清楚的水池,电极周围的环境就是水池的骨干结构。手指靠近相当于有人把手伸进水池里,水面高度(电容值)会出现一个小幅但可测的变化。我们做的所有电路和代码,都是在想办法把这个“水面变化”测出来、读数出来、再决定要不要触发。

1.2 自电容与互电容:两种不同的工作方式

做电容传感器之前,先搞清楚自己要做哪一种工作方式,因为电路和电极布局差别很大。

自电容测量的是“单一电极对地”的电容。手指靠近或接触电极,会增大电极对地的等效电容。它的优点是灵敏度高,单个电极就能工作,适合触摸按键、接近感应。缺点是当手指靠近时,测量的是“电极-手指-人体-大地-系统地”这一整条回路的电容,所以对地回路质量很敏感,接地处理不好容易误触发。

互电容测量的则是两个电极之间的电容耦合量。手指靠近时,会吸收部分电场线,导致两极板间的耦合电容下降;反向地看,手指像“桥”一样改变两个电极之间的场分布。互电容的好处是指标明确、不容易受远端大地波动影响,而且能实现多点触控——我们手机上用的触摸屏,绝大多数就是投射式互电容阵列。

自己做 DIY 项目,我建议优先从自电容起步,因为只需要一个电极、一根线、一个测量引脚,调试链路最短。等自电容摸透了,再考虑做互电容阵列也不迟。

1.3 干扰源:寄生电容、湿度、电源噪声

如果只看着理想公式,你会觉得做一个电容传感器很简单。真正让新手翻车的是下面几种“看不见的边界条件”:

寄生电容无处不在。导线和大地之间、铜箔和桌面之间、焊盘之间都有电容。一块 10cm 长的普通杜邦线,寄生电容很容易到几十皮法。如果你的手指触摸带来的变化量只有几皮法,寄生电容稍微抖动一下,信号就淹没在噪声里了。所以第一原则是:布线和电极尽量短、尽量远离高频信号和开关电源。

湿度影响非常大。空气相对湿度升高时,水分子容易在电极表面形成一层极薄的导电膜,等效于给电极加了一个不稳定的电阻,同时让基线电容明显漂移。这也是为什么潮湿天气里自制触摸设备容易乱跳。

电源噪声主要来自 USB 5V、开关电源的纹波以及你身边的各种无线信号。50Hz 工频干扰、几百 kHz 的开关噪声,都会通过电源地线耦合进测量回路。后文我会专门讲怎么判断和压制这些问题。

只要能理解这三个干扰源,后续所有调试动作就都有了方向:要么降低噪声,要么提高信号,要么让算法足够“健壮”去扛住漂移。

2. 材料和工具选型:哪些钱不能省,哪些能省必须省

2.1 电极材料怎么选:铜箔、导电布、ITO各有归宿

电极是电容传感器的“天线”,材料选择直接决定信号质量和寿命。

材料优点缺点适合场景
铜箔胶带导电性好、便宜、易裁剪、随处可买表面会氧化发黑,需要覆盖保护原型验证、壳体内壁贴装
导电布胶带柔软可弯折、贴合曲面表面电阻比铜箔大一些曲面外壳、可穿戴设备原型
ITO导电玻璃/薄膜透明、表面均匀贵、需要专门定制需要透光的触摸面板
铝板/不锈钢片硬质、耐刮、寿命长切割成型麻烦大面积电极、长期固定安装

我自己做原型时 90% 的场景用铜箔胶带,一卷十块钱出头,用美工刀就能裁出任意形状。需要提醒的是,铜箔胶带长期暴露在潮湿空气中表面会氧化,阻抗升高导致读数漂移。如果你做的是长期一直在设备里的传感器,铜箔电极必须用绝缘胶带、油漆或者外壳完全密封起来。如果连密封都不想要,就直接选铝板或不锈钢片更省心。

2.2 测量方案和主控:Arduino够用,还是必须上专用芯片

这是整个制作里最关键的选择题。电容值的变化量通常只有几个皮法,怎么把这个皮法级别的变化可靠地读取,决定了你要不要用专用芯片。

我在这个项目里首选的是 Arduino 的 RC 充放电测量法,原因很直接:元件只需要一到两颗电阻,原理完全透明,数据可以通过串口一行行打印出来看,非常适合把测量链路学明白。Arduino 的 ADC 是 10 位,实际测量分辨率虽然没有专用芯片高,但应对触摸开关、水位判断、接近感应这类“非接触开关量”完全够用。

如果你做的是多点触控矩阵或者对分辨率要求比较高的连续感应条,建议直接用 MPR121——它通过 I2C 输出,自带硬件滤波和基线跟踪,十几块钱就能搞定,省掉大量算法工作。

如果你的目标是纳米级位移测量、超高精度接近感应,那就要上 FDC2214 这类基于 LC 谐振的专用电容感测芯片了。它把电极和一个电感组成谐振回路,通过测量谐振频率变化来反推电容,分辨率能做到 fF 级别,当然价格和外围复杂度也上去了。

方案典型成本分辨率上手难度适合场景
Arduino + RC充放电10 元以内相对变化量低DIY原型、触摸开关、粗略水位
555振荡器测频5 元左右频率变化中抗干扰要求稍高的原型
MPR12115 元左右中等、多通道低多点触摸、简单手势
FDC221450 元以上fF 级、很高高精密检测、非接触水位、材料识别

这条路线图送给所有想少走弯路的人:先把第一个方案做通,拿到原始数据,你自然知道下一个项目该用哪种芯片,而不是反过来一上来就被数据手册劝退。

2.3 工具清单:万用表必须有,示波器属于“没有也能干,有就牛逼”

做电容传感器,万用表是底线工具。测量电阻值、检查焊接短路、确认电源电压都离不开它。

示波器不是必需品,但如果有,调试效率会翻很多倍。主要用它看两件事:一是电源纹波有多大,二是测量引脚上的信号翻转是否干净。如果没有示波器,你仍然可以通过串口打印的数据来间接推断——数据跳动幅度大、有规律震荡,就说明有噪声混进来了。

除了这些,基础耗材还需要:100kΩ 左右的金属膜电阻(温漂小一点)、100nF 瓷片电容、10uF 电解电容、杜邦线或者屏蔽线、美工刀、绝缘胶带、热熔胶。这里我特别想说一个观点:连接线是全系统最容易出问题的部分。从电极到单片机的引线如果超过 15cm,建议用屏蔽线,并且屏蔽层接系统地,否则这段线就像一根天线,把周围环境变化全部耦合进来。

3. 核心电路搭建:从电荷充放电到信号采集

3.1 方案一:RC充放电法,我主推的最简透电路

先看电路怎么搭:

  • 电极接 Arduino 的一个模拟输入引脚(比如 A0)。
  • A0 引脚通过一颗 100kΩ 电阻接到一个数字输出引脚(比如 D2)上。
  • 电极和 A0 之间,实际上对地存在寄生电容 Cx,这个 Cx 包括了电极本身、导线以及外界的耦合。

测量思路是这样的:把 D2 拉高,5V 会通过 R 给 Cx 充电,A0 的电压会缓慢上升;电容越大,电压爬升越慢。我们不需要真的等它充到 5V,只需要用一个固定的充电时间,然后马上读一次 A0 的电压值——电容大,相同时间内电压更低;电容小,电压更高。这样一来,一次充电后的“电压读数”就直接反映电容的相对大小。

下面是我实际跑通过的代码:

const int chargePin = 2; // D2,接电阻另一端 const int sensorPin = A0; // 模拟输入,接电极 void setup() { Serial.begin(9600); pinMode(chargePin, OUTPUT); pinMode(sensorPin, INPUT); } void discharge() { // 主动把电极放干净,避免上一次测量残留电荷 pinMode(sensorPin, OUTPUT); digitalWrite(sensorPin, LOW); digitalWrite(chargePin, LOW); delayMicroseconds(200); pinMode(sensorPin, INPUT); } int readCapValue() { discharge(); digitalWrite(chargePin, HIGH); // 开始充电 delayMicroseconds(800); // 固定充电时间,可调 int v = analogRead(sensorPin); // 读取充电后的电压 return v; // 电容越大,v 越小 } void loop() { int val = readCapValue(); Serial.println(val); delay(50); }

上电以后打开串口监视器,你大概会看到这样的数据:不触摸时读数稳定在 410 附近,手指轻轻接触电极,读数掉到 350 以下。方向很容易理解:电容变大了,相同时间内充到的电压更低,所以 ADC 读数变小。这个“读数小 = 电容大”的对应关系,后文所有算法都是围绕它来写的。

为什么我推荐固定时间充电法而不是等电压到阈值计时法?因为 Arduino 的analogRead本身需要若干微秒转换时间,如果在循环里反复读电压去等阈值,时间抖动比较大;而固定充电时间配合一次采样,时间基准是稳定的,实测下来抖动小很多。当然,如果你用 ATmega328P 的模拟比较器加定时器,也能做出很漂亮的阈值计时方案,但对初学者来说没必要一开始就上那么复杂。

3.2 方案二:555定时器构成振荡器,牺牲简单换抗干扰

RC 法最大的软肋是什么?它对电源电压非常敏感——充电电压本身会随 5V 波动,读数也跟着波动。如果你想把传感器放进一个电源噪声明显、或者用电池供电电压会掉电的环境,RC 法的基线漂移会变大。

这时 555 振荡器方案就值得考虑了。用 555 搭建一个无稳态多谐振荡器,电极接入振荡器的定时电容位置,振荡频率会随电容变化而明显改变。Arduino 只需要用pulseIn读取一个脉冲宽度,或者用外部中断统计频率,就能算出电容的相对变化。频率信号比模拟电压信号的抗干扰能力强很多,因为衡量的是“时间/频率”这个量,而不是绝对电压。代价是电路多了几颗元件,而且 555 本身的温漂也需要处理。

如果你已经上 RC 法并且跑得不错,这一节可以暂时跳过;如果你发现你的项目环境噪声大得离谱,RC 法怎么调都抖,建议切到 555 振荡器方案实测对比一下。

3.3 方案三:电荷转移法与专用芯片,产品化的必经之路

MPR121 和 FDC2214 这类专用芯片,内部用的都不是简单的 RC 充放电,而是更精致的电荷转移法或者 LC 谐振法。

电荷转移法的思想值得理解:首先把待测电容 Cx 充电到 VDD,然后把它与一个已知的积分电容 Cs 并联,电荷会在两者之间重新分配,Cs 上的电压就会按比例上升。反复执行“给 Cx 充电 → 转移到 Cs”这个循环若干次,Cs 上的电压就累加起来,再通过 ADC 读出来。这个过程把皮法级的微小电容转化为可测量的电压累积量,对噪声的免疫力比单次 RC 测量好很多,而且不需要外接高精度电阻。

如果你在产品原型阶段发现 Arduino 方案的重复性不够、或者想做多点触控,MPR121 是最平滑的升级路径。它的外围电路非常少,I2C 接口直连,固件里数据手册都给了参考例子。我个人建议的顺序仍然是:先手动搭 RC 电路把原始数据看明白,再让芯片帮你干活——这样芯片的数据手册在你的脑海里才不是一堆空洞的寄存器地址。

4. 完整制作步骤:以电容触摸按键为例

4.1 第一步:设计电极形状与布局

我建议第一次做,电极就做成直径 15mm 的圆形铜箔片,或者 20mm × 30mm 的圆角矩形。圆角不是玄学,尖角会导致电场集中,虽然对灵敏度有时有好处,但更容易耦合外部噪声,得不偿失。铜箔胶带剪好形状后,贴在外壳内侧需要触摸的位置,轻轻压实,边缘不要起翘。

电极布局上有几条经验值,我都标出来:

  • 相邻两个电极间距至少 10mm,否则按 A 键的时候 B 键也会吃到信号。
  • 电极到 MCU 的走线尽量控制在 10cm 以内,走线要远离继电器、电机驱动这种强干扰源。
  • 电极正下方如果有金属外壳或者大面积铺铜,等于给电极并联了一个很大的对地电容,会严重拉低灵敏度。务必让电极正对的背面区域保持绝缘悬空,或者做好接地屏蔽设计后再测。

4.2 第二步:覆盖层与外壳处理

电容触摸不需要直接接触电极,它隔着绝缘材料也能工作,这正是它的核心优势。但你得知道覆盖层是怎么吃掉灵敏度的:增加厚度 d、降低材料介电常数,都会让手指靠近产生的电容变化变小。

我实测下来几个参考值:

  • 1.5mm 厚的亚克力:非常灵敏,隔空 1cm 都能感应到接近。
  • 5mm 厚的亚克力:正常触摸没问题,但接近感应的距离明显缩短。
  • 10mm 厚的木板的密度不均会导致灵敏度不稳定,不建议用作覆盖层。

关键细节在于覆盖层和电极之间不能有气隙。空气的介电常数只有 1 左右,和玻璃、亚克力差好几倍,中间的空气层相当于串联了一个很大的“阻力”,会让手指的信号传不到电极上。我曾经图省事用热熔胶点了几下固定铜箔,结果触摸区域周围出现明显的灵敏度差异——按压有热熔胶的位置手感很钝。后来改成用双面胶整面贴合,问题立刻消失。

4.3 第三步:电路焊接与连接

电路连接本身非常简单,但焊接质量要足够认真。以下几点是常见做法:

  • 从电极引出的导线先过焊盘,不要把铜箔胶带的铜面直接塞进 Arduino 母座,否则接触电阻不稳,读数会跳。
  • 系统只用同一个接地点,电极附近的屏蔽层单端接到电源地,避免形成地环路。
  • 上电之前用万用表蜂鸣档检查电源和地之间是否短路,这一步能救下很多后续莫名奇妙的问题。

4.4 第四步:固件初跑与串口原始数据观察

很多人一上手就奔着“触摸灯亮灭”去写代码,这其实绕过了最关键的调试阶段。正确顺序是先写一个只打印原始读数的程序,然后做三个观察:

第一,不触摸时读数波动范围是多少。比如 30 秒内读数从 405 到 415 跳动,那你的系统噪声就是 ±5 左右。第二,用手指轻轻放在覆盖层表面,读数变化了多少。如果变化量是 60 以上,信号余量很充足;如果只有 20,你得考虑加大电极或者减薄覆盖层。第三,压力变化会不会导致读数雪花式乱跳。如果手指放上去后读数仍然快速波动,说明噪声耦合比较严重,先去查电源和走线。

把这三个观察做扎实之后,你手里的传感器已经是一个“能输出有效信号”的系统了,剩下的就是算法把它变成稳定的开关信号。

5. 校准与读数处理:ADC数据到稳定触发的关键

5.1 原始数据的漂移与滤波

即使你的硬件做得很好,原始读数也不可能是绝对静止的。环境湿度的缓慢变化、电源电压的轻微波动、甚至你房间温控系统带来的空气流动,都会让读数基线上下漂移。如果直接拿原始读数跟固定阈值比较,过几个小时就可能误触发。

第一步先做平滑滤波。最简单的是滑动平均:每 5 到 10 次采样取一次平均,就能压掉大部分高频抖动。如果数据里偶尔出现尖峰——比如附近有人开大功率电器——滑动平均会被尖峰拽着走,这时改用中值滤波更稳健。中值滤波是取最近 5 个采样中间的那个值,对尖峰免疫。代价是响应速度略慢,但对触摸按键来说 20 到 50ms 的响应时间完全可接受。

5.2 动态基线与相对阈值

第二步是引入动态基线。环境条件缓慢变化,基线就应该跟着变。每次采样时对基线做这样的自我修正:

baseline = baseline × 0.995 + reading × 0.005

这个公式本质上一个一阶低通滤波,α 取 0.005 左右意味着基线会缓慢地跟随长期变化,但不会被手指触摸时的短期跳变带走。实现时要注意:一旦检测到触摸,要立刻暂停基线更新,否则手指按在上面的时候,基线会被“拉”向触摸值,松手之后会有一段比较长的恢复期。

第三步是关键:不要拿绝对读数跟固定阈值比,要拿“当前读数 - 当前基线”的差值跟阈值比。相对阈值方案可以让传感器在傍晚、深夜、开空调、关空调等环境变化中基本保持同样的触发手感。

再叠加迟滞逻辑,防止临界抖动。比如触发阈值设为差值大于 60,释放阈值设为差值小于 40。手按上去时超过 60 触发,手松开后要回到低于 40 才释放,中间这段 40-60 的区域相当于一个“缓冲带”,能有效避免手在临界压力附近来回抖动造成的频繁触发。

bool touched = false; void loop() { int raw = readCapValue(); if (!touched) { baseline = baseline * 0.995 + raw * 0.005; } int diff = baseline - raw; // 读数变小代表电容变大,所以用 baseline - raw if (diff > 60 && !touched) { touched = true; Serial.println("TOUCH ON"); } else if (diff < 40 && touched) { touched = false; Serial.println("TOUCH OFF"); } delay(10); }

我给出一个参考:如果原始抖动的峰峰值是 ±5,那建议把触发阈值取在信号变化量的三分之一左右,不要压得太低。阈值设得越低越灵敏,但系统会越来越容易被噪声触发;阈值设得太高,触摸又不够灵敏。实际的临界区域往往需要你用真实外壳试几十次才能找到最舒服的档位。

5.3 应对温度湿度的长期漂移

动态基线已经解决了大部分缓慢漂移问题,但有两个情况它处理不了。

一是电极表面凝露。当环境湿度极高、电极表面出现冷凝水时,电容会瞬间跳变到另一个水平,基线来不及跟随,可能造成持续触发。对策是在设计阶段就把电极密封好,不让水汽直接接触铜箔。二是温度剧烈变化导致的元器件参数偏移,尤其是我前面提到的 100kΩ 充电电阻,如果用了普通碳膜电阻,温漂明显,读数会跟着环境温度跑。我后来统一换成金属膜电阻,温漂从几百 ppm 降到几十 ppm,长期稳定性肉眼可见地变好。

还有一个笨但可靠的办法:在成品里留一个“校准模式”。比如长按某个实体按键 3 秒,程序重新跑一遍基线初始化,重新采集 100 次取平均,把基线强制复位。环境发生季节性变化时,用户自己动手校准一次就能继续稳定使用很久。

6. 常见故障排查:我在实测中踩过的坑

6.1 误触发:手没碰到,它自己一直动

现象:电极附近没人,串口数据却隔几秒就有一个明显脉冲,或者触摸状态反复横跳。

我的排查顺序一般是这样:

  1. 先拔掉 USB 供电,改用一节锂电池或者干电池组供电。如果误触发立刻消失,说明问题出在 USB 电源噪声太脏。USB 5V 来自电脑或充电头,纹波和开关噪声都不小,直接给传感器供电等于把噪声全部塞进测量回路。
  2. 电源并电容:在 MCU 的电源引脚旁边并一个 100nF 瓷片电容和一个 10uF 电解电容,给高频噪声一个低阻抗泄放路径。
  3. 测一下测量引脚周围有没有高频信号走线。如果单片机引脚旁边跑着 I2C 或者 PWM 波形,这些快速翻转的信号会通过寄生电容耦合到传感器走线上。

这个案例的根源通常是“地没处理好”——布线时把传感器回路和数字电路回路混用了同一条长地线,数字噪声通过地阻抗耦合进模拟端。处理办法是单点接地,把传感器部分的模拟地单独走线,在电源入口处与数字地汇合。

6.2 灵敏度不足:按下去之后反应迟钝甚至没反应

现象:手指要用力按住,或者隔着厚外壳完全没反应。

先确认一个基本逻辑:读到的差值变化量是不是太小了。如果原始读数差值只有 20,而阈值设了 60,那当然触发了。这时优先做的不是调阈值,而是从物理层面提高信号:

  • 增大电极面积。从直径 15mm 增加到 25mm,信号变化量往往能有接近两倍的提升。
  • 减小覆盖层厚度。这是最有效但经常受外形制约的一步。
  • 缩短电极到 MCU 的走线长度。我见过一个翻车案例,电极引线绕了 50cm,信号全被导线寄生电容吃掉,最后把主控板挪到电极附近,问题直接解决。
  • 确保覆盖层和电极之间没有气隙,这一个细节经常被人忽略。

如果物理层面已经到位,才去调代码:把充电时间从 800 微秒加到 2 毫秒,可以让充到的电压差更大,ADC 读到的差值也更明显——但注意不要充到饱和,如果读数已经逼近 1023 或者 0,灵敏度和线性度都会变差。

6.3 多按键串扰:按 1 号键,2 号键也触发

在并排做两个以上的电极时,串扰是必然要面对的。原因有两层:一是电极之间的互电容直接耦合,二是两个电极的走线如果挨得近,信号线之间的寄生电容也会让它们互相感应。

对策按优先级排序:

  • 把电极间距拉大,至少 10mm 以上。
  • 在相邻电极之间加一条地线隔离。这条地线要真正接到系统地,而不是悬空,效果很明显。
  • 两个通道不要同时测量,改成“分时扫描”:先充电测 1 号电极,放电,再充电测 2 号电极,中间留一点死区时间。
  • 如果走线必须平行长距离,就把两条信号线之间的距离拉开,或者在中间加一条地线。

6.4 一个典型的“翻面之后全线乱跳”排查案例

有一次我把传感器做好后放在桌面上测试一切正常,之后把它翻过来研究背面的焊点,串口数据突然开始疯狂跳动。我第一反应是哪里虚焊了,但碰了碰焊盘没有任何变化。后来我把示波器探头的地夹子夹到系统的地上,数据居然立刻稳定了一部分。反复折腾后,我发现问题出在人体上:我把板子翻过来拿在手里时,手离电极、走线和芯片都很近,人体本身变成一个巨大的悬浮导体,直接改变了电极对地的电容。而且当时系统的地并没有真正接到大地,只是悬浮在 USB 的 5V 地上,所以人体和示波器探头的接地路径大量改变了寄生电容的分布。

这个案例给我的教训是:电容传感器测量的是“绝对耦合”,它对周围任何导体都敏感。做产品时,不仅要去关心手指带来的信号,也要防范结构件、安装人员、临时工具这些“多余导体”对测量环境的影响。工业上会用屏蔽层、校准补偿电容、固定安装结构来把环境做“死”,DIY 项目至少要做到:测试时模拟真实使用环境,不要一边调试一边让手在板子附近随意晃动。

7. 换一个场景复用:液位检测与小体积接近感应

7.1 容器外壁贴片液位检测,不接触液体

电容传感器的能力不止触摸。当你把电极从“平面触摸”换到“液体容器外壁”,它立刻变成一款非接触式液位计。

原理依然是介电常数的差异。空气的相对介电常数约 1,而水的相对介电常数约为 80。将两个电极平行贴在非金属容器的外壁上,液面升高到电极位置时,电极之间的等效介电常数大幅上升,电容随之显著变大。

操作上非常简单:取两根宽度 5mm 左右的铜箔胶带,平行贴在亚克力杯或者塑料瓶外壁,长度根据你需要检测的液位范围决定,两根电极间隔 5 到 10mm,形成一对互电容。它们不接触液体,所以卫生、安全,也不会被腐蚀。

需要注意的是几个坑:一是液体如果是导电的(比如盐水、饮料),不能把两个电极当成单纯的电容器并联处理,导电液体相当于在电极之间引入一个电阻通路,可能改变信号方向;二是气泡附着在容器内壁会导致读数抖动;三是容器壁越厚,信号变化越小,所以玻璃杯和塑料瓶的结果差异很大。所有情况下,最终阈值都要用真实液体实测后确定,不能直接照抄别人的参数。

7.2 大面积接近感应与人体检测

把电极面积做大到 100mm × 100mm 甚至更大,电容传感器就能感知人的靠近——手在电极上方 20cm 到 30cm 处就会让读数发生可测变化。这种特性很适合做桌面互动装置、灯具自动唤醒、卫生间镜子前的隔空手势。

大电极带来的副作用是更容易吸收环境中的各种电磁干扰。我做大面积感应时,通常会加一层屏蔽结构:在电极背面(远离人手的一面)加一片同样形状的铜箔,并与系统地连接。这样电极向后的电场被屏蔽层“吸收”,只剩下向前的一面感应手势。当然这个屏蔽层也会给电极增加一倍的寄生电容,所以需要在灵敏度上做权衡,但换来的是稳定性的巨大提升。

7.3 自制方案 vs 工业传感器,精度和替代关系

很多人会问:我自己做的能替代工业电容传感器吗?我的看法是,在“开关量”甚至“粗略连续量”的层面上完全可以替代,但进入“精密测量”领域就要冷静。

自制 RC 方案适合做的是:触摸开关、水位高低判断、近距离人体感应、手势存在检测。这些任务需要的分辨率和重复性都不高,成本却比工业传感器低一到两个数量级,而且电极形状可以完全贴合你的外壳来定制,这是买现成传感器做不到的。

工业电容传感器(比如用于精密位移测量、材料厚度检测的高端产品)会使用大量温度补偿、屏蔽层结构、高精度振荡电路和复杂的数字信号处理,这些不是业余条件下靠几根杜邦线就能追平的。所以理性态度是:原型验证和小批量交互装置用自制方案,遇到严苛工业场景直接选成熟工业传感器,这并不丢人,反而能让你把精力放在真正该创新的部分。

从动手做第一个电极到现在,我对电容传感器最大的感受是:它不像很多数字传感器那样把结果直接喂给你,而是给你一个“连噪声都算在内”的模拟世界视图。你搭的电路、写的滤波、做的屏蔽,说白了都是在跟环境里的杂散电容和电磁噪声谈判。每次误触发都是一个信号,告诉你某个地方的环境耦合没处理好。每解决一个问题,你对“电子设备如何感知人体”这件事的理解就深了一层。

最后分享一点我的使用习惯:不管做触摸按键还是液位计,我都坚持把原始读数串口打印留到最后再删。哪怕成品已经交付,调试接口留着永远比不留强——因为电容传感器的“手感”会随着季节、湿度、使用损耗慢慢变化,重新校准的时候,原始数据是你唯一可靠的参考系。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询