
1. 红外传感器没那么神秘先把它看成一扇“颜色不一样的窗”红外传感器Infrared Sensors在嵌入式项目里的出现频率高得超出很多人想象。楼道里的人体感应灯、非接触测温枪、扫地机器人的防跌落探头、自动感应水龙头、智能烟感里的探测器件本质上都是红外传感器在干活。我最早认真研究它是因为一个智能家居项目要在洗手间做“有人自动开排风扇”的需求甲方还特意强调不能用摄像头我当时第一反应就是“用红外呀”结果真上手才发现红外传感器这潭水比想象中深不少。把时间拉回到物理课本光线只是电磁波谱里很窄的一截我们肉眼能看到的可见光波长大约在380nm到780nm而红外光指的是波长大约在0.75微米到1000微米之间的频段比红光更长人眼看不见。红外传感器说白了就是“能感知红外辐射并把它转成电信号”的器件相当于给单片机装了一双能看到热量的眼睛。这双眼睛能干什么最基础的有三件事感知“有没有热的东西出现或移动”测量“目标表面有多热”以及判断“某个物体离我多远”。红外传感方案之所以在硬件圈被广泛使用核心优势就是非接触、无源感测、功耗可控。非接触意味着不需要碰到被测物体隔着几厘米甚至几米都能获取信息无源感测意味着很多方案自身不发光纯粹接收环境里本来就存在的红外辐射特别适合做低功耗场景。这篇文章我不打算照着芯片手册念参数而是站在一个常年调传感器、被各种环境干扰折磨过的工程师角度把红外传感器从原理到选型、从电路到代码、从调试到排故讲一遍。写这篇文章的目标读者很明确做嵌入式开发的、搞电子设计的、想入门智能硬件的学生以及任何被“为什么我的红外传感器乱触发”困扰过的人。2. 选型前必懂红外传感器四大流派和工作原理很多人一上来就问“红外传感器哪个型号好”这种问法其实很难回答因为红外传感器根本不是一个东西它是好几类工作原理完全不同的传感器的统称。用错流派比用错型号更致命。比如你想检测人体移动那该选热释电传感器想测物体表面温度就得选热电堆或者热释电加算法想测距离那可能是红外LED加光电二极管想检测特定气体浓度还得用上NDIR技术。所以我建议选型的第一步不是看型号而是先搞清楚这四种流派各自靠什么物理效应工作。2.1 光电型传感器靠“光子打电子”工作光电型红外传感器的核心是半导体PN结的光电效应。光子打到PN结的耗尽区如果光子能量够大就会把价带电子激发到导带产生电子-空穴对在外加偏置或内建电场作用下形成光电流。硅材料的响应范围大约在400nm到1100nm峰值往往落在850nm到950nm这个区间所以市面上红外遥控用的发射管、接收管大多选940nm的波长正好卡在硅光电器件的灵敏度峰值附近。常见的光电型器件有光电二极管、光电三极管还有把光信号处理后直接输出逻辑电平的红外接收头。光电二极管输出的光电流极其微弱通常是纳安到微安级别需要外接运放做跨阻放大光电三极管把光电流放大了一截响应速度会慢一些胜在电路简单红外接收头自己集成了滤波和放大电路专为解调38kHz载波信号设计。如果你的项目是做红外避障、红外测距、红外遥控基本都在这个流派里选型。我提醒一句这类器件的输出对可见光和太阳光里的红外成分同样敏感不能指望它“只认红外”后面调试环境光干扰会让你印象深刻。2.2 热释电传感器只对“变化”感兴趣热释电传感器又叫PIRPyroelectric Infrared传感器它的核心材料是钽酸锂这类铁电晶体。这类晶体会因为温度变化而产生自发极化强度的变化等效在晶体表面感应出电荷经过电极引出后形成电流。关键点在于热释电效应本身只对温度变化敏感如果热源静止不动晶体温度稳定下来输出就归零了。所以热释电传感器天然适合检测“运动的人”或“移动的热源”不适合测量静止物体的绝对温度。为了让这种“只对变化敏感”的特性真正用在人体感应上传感器前面会加一个菲涅尔透镜。这个透镜把视场分割成若干明暗交替的区域人一走动身体辐射的红外线在不同区域间切换传感器感受到的就是一个波动变化的辐射信号从而持续产生输出。如果没有菲涅尔透镜人站着一动不动时热释电传感器基本认不出“这里有人”。市面上常见的热释电模块基本就是一颗热释电探头D203S或LHI778加一块BISS0001处理芯片芯片内部集成两级运算放大器、电压比较器、延时定时器直接输出TTL电平用起来确实省事但灵敏度和抗干扰能力也受模块设计制约。2.3 热电堆传感器把“热量差”变成电压热电堆传感器利用的是塞贝克效应也就是温差生电。两种不同金属或半导体材料组成热电偶两个接点处于不同温度时回路里会产生与温差成正比的热电动势。把几十对热电偶串联起来就是“热电堆”。红外热电堆的经典结构是芯片上方悬浮一层吸收膜吸收膜吸收目标辐射后温度升高冷端则固定在芯片基底上维持相对温度冷热端之间的温差形成电压输出电压大小跟目标辐射强度成正比。这种传感器的最大价值是可以实现非接触测温。MLX90614就是这类芯片里最广为人知的代表它在热电堆探头内部集成了低噪声放大器、17位ADC和数字信号处理单元通过SMBus接口直接输出物体温度和环境温度精度能做到±0.5摄氏度左右。对于工业设备巡检、电路板发热点排查、粮仓储粮温度监测这些场景热电堆方案几乎是无脑选择因为它规避了模拟放大链路上大量的调试工作。2.4 NDIR光学气体检测用“指纹吸收”找分子如果往红外传感更专业的方向看一眼还有一类基于“非分散红外”原理的气体传感器即NDIR技术。某些气体分子会选择性吸收特定波长的红外光比如二氧化碳对4.26微米波长有很强的吸收峰甲烷对3.3微米附近敏感。NDIR传感器内部放一个宽谱红外光源光线穿过采样气室后再经过一个窄带滤光片最后打到红外探测器上。当目标气体浓度升高对应波段的红外光被吸收得更多探测器输出的信号就会变弱通过标定曲线反推出气体浓度。NDIR方案的最大优点是真选择性不容易像半导体气敏元件那样对酒精、油烟等干扰气体“眉毛胡子一把抓”。缺点是贵光源寿命和长期漂移也是工程上要操心的事。如果你的项目是做室内空气质量监测、冷链运输货仓气体监控NDIR基本是稳妥方向但千万别想着拿几十块钱的模拟气体传感器去替代。3. 做项目最常用的三套红外传感器电路方案原理说再多最终都得落到能不能出信号。我按输出类型把红外传感器的常用电路整理成了三种方案开关量、模拟量、数字量。对应的是“要不要检测电路”、“要不要放大电路”、“能不能直接给MCU读数据”这三个问题。搞明白自己属于哪种选型难度直接下降一半。3.1 开关量方案热释电人体感应模块最简单也最容易被环境带偏如果项目只需要判断“有没有人在动”别自己搭模拟电路直接买成品的PIR热释电模块是最性价比的选择。模块上一般有个BISS0001芯片它把热释电探头的微弱信号做了两级放大然后通过一个窗口比较器判断信号是否超过阈值超了就输出高电平之后由芯片内置定时器维持一段可调的输出时间。实际使用BISS0001模块时最需要调的是两个旋钮和一个跳线。灵敏度调节旋钮改变第一级放大器的增益拧大了容易误触发拧小了人走过去没反应延时旋钮控制输出高电平保持时间从几秒到几十秒不等。跳线用于选择“可重复触发”和“不可重复触发”模式可重复触发时只要人在探测区里有微小动作输出就不断重新计时不可重复触发时触发一次后就算人一直动延时结束也会掉回低电平必须等信号先回落后才能再次触发。用在走廊灯上可重复触发模式体验更好用在安防报警上反而不可重复触发更利于配合报警主机做沿触发。安装方面有个我踩过多次的坑模块视场里别正对空调出风口、暖气片、窗户玻璃否则温差气流会在菲涅尔透镜上形成伪红外信号导致半夜灯光自己一通乱闪。这个不是传感器本身的问题是安装角度和热源排布的问题。3.2 模拟量方案光电二极管跨阻放大电路考验基本功当需求从“有没有”升级成“有多强”时开关量模块就不够用了得自己把光电二极管的微电流放大成可采样的电压信号。经典电路是跨阻放大器光电二极管工作在零偏置模式光电流直接流入运放反相输入端运放输出端的反馈电阻把电流转换成电压输出公式是Vout I光 × Rf。选反馈电阻的规则很简单光电流越弱Rf就要选得越大。测940nm红外LED反射回来的信号时接收管电流通常在微安量级Rf选100k到1M就能得到0.1V到1V量级的输出电压MCU的ADC可以直接采。但反馈电阻一大运放的噪声也会被放大而且光电二极管的结电容和Rf会形成一个低通滤波器导致响应变慢、波形振荡。解决办法是在Rf两端并联一个小电容典型值几皮法到几十皮法给环路增加一个零点换取稳定性。这个电容具体选多大没有万能答案我是用示波器观察阶跃响应看有没有过冲过冲大了就把电容加大调到波形干脆不带回振为止。如果你不想自己折腾运放也可以选集成的光转电压芯片比如OPT101或TSL257内部已经做了放大直接输出模拟电压不过成本通常比自己搭分立方案高一些。做主动红外避障时我通常会配合脉冲驱动策略给红外发射管发一个38kHz或几百赫兹的脉冲串接收端用带通滤波器或者软件上做同步检波纯直流环境下测到的环境光干扰就能被大幅滤除这是对付强光环境很管用的一招。3.3 数字接口方案I2C读温度几乎不需要外围器件数字量方案是现在最省心的选择代表就是红外测温芯片。以MLX90614为例它会用内部DSP自动把热电堆的微弱电压转换成温度和温度误差然后通过SMBus接口直接输出。SMBus的物理层和I2C非常像设备地址是0x5A想读物体表面温度就读取RAM地址0x07读出来是16位二进制补码数据换算公式是温度摄氏度 0.02 × 数据值 - 273.15。因为数据分辨率是0.02摄氏度精度上限还是受传感器本身限制但对多数非接触测温需求来说已经足够细腻。数字接口方案的最大优势是电路极度简化传感器出来就是I2CMCU侧只需要上拉电阻软件上按通信协议解析即可。不用调运放偏置、不用调增益、不用考虑输出阻抗匹配对新手极其友好。代价是灵活性降低芯片内部模拟链路是固定的当你想针对特殊目标调整响应特性时可选的手段很有限。我的看法是一个产品里如果模拟链路要求不高尽量用数字传感器把时间留给业务逻辑和算法性价比最高。4. 从零到一做一个红外测温仪完整实战流程下面我带大家完整走一遍基于STM32和MLX90614的红外测温仪。这个项目我做过不止一次适合用来理解从传感器读原始数据到校准出可信温度的全过程。先说清楚这个不是医疗用途的精度对标的是“测个电路板发热”、“给黑体粗测温度”、“给非接触目标做温度监测”这类场景。4.1 硬件清单与接线准备材料STM32F103C8T6最小系统板一块MLX90614红外测温模块一个最好买带稳压和上拉的成品模块省得自己焊I2C接线的四根线VIN、GND、SCL、SDA0.96寸OLED显示屏一个用于显示温度杜邦线若干接线关系比较简单MLX90614模块的VIN接3.3VGND接GNDSCL和SDA分别接到STM32的PB6和PB7同时外接两个4.7k上拉电阻到3.3V。如果用的是成品模块上拉电阻模块上已经有了直接连就行。OLED也是I2C接口可以把时钟线和数据线并联到同一组I2C总线上MLX90614和OLED的地址一个是0x5A、一个是0x3C不冲突可以挂在同一条总线上。4.2 在STM32上读取MLX90614的核心代码现在写读取逻辑。STM32的标准外设库代码大概长这样核心是发起I2C读RAM地址0x07拿回两个字节后按公式换算。以寄存器操作方式为例读出的原始数据是16位需要自己拼成unsigned short然后除以50再减去273.15。#define MLX90614_ADDR 0x5A #define MLX90614_TA 0x06 #define MLX90614_TOBJ 0x07 float MLX90614_ReadTemp(uint8_t reg) { uint8_t buf[3]; // 写寄存器地址然后重新发起读操作连续读3个字节低8位、高8位、CRC I2C_Start(); I2C_SendByte((MLX90614_ADDR 1) | 0); I2C_SendByte(reg); I2C_Stop(); I2C_Start(); I2C_SendByte((MLX90614_ADDR 1) | 1); buf[0] I2C_RecvByte(ACK); buf[1] I2C_RecvByte(ACK); buf[2] I2C_RecvByte(NACK); I2C_Stop(); unsigned short raw (buf[1] 8) | buf[0]; float temp (float)(raw) * 0.02f - 273.15f; return temp; }读出来的数值就是目标物体的表面温度。不过我强烈建议第一次调试先读环境温度寄存器0x06把环境温度打印出来和环境温度计对比一下看看通信链路和数据换算是否正确。如果环境温度读出来合理说明链路没问题再读0x07测物体温度才靠谱。有个常见问题是I2C时序紧张导致读出的数据偶发“毛刺”表现为温度值突然跳到离谱区间比如从25度突然蹦到300多度多半是总线上拉电阻太大或者线太长或者代码里的I2C时钟配得太快。MLX90614的SMBus协议严格说比I2C多了超时限制总线频率我一般配在100kHz稳定优先。4.3 校准标定才是测温项目的重头戏很多人在这一步翻车。芯片手册上写着精度±0.5摄氏度但实际测下来偏差经常更大原因在于标定条件和你现场环境的差异。MLX90614在出厂时对标定在发射率为1的理想黑体上但真实物体的发射率几乎都小于1。比如抛光铝板发射率只有0.04测出来温度会严重偏低黑色哑光胶带发射率约0.95测出来比较接近真实温度皮肤发射率大概在0.98左右这也是为什么对着人体皮肤测体温有参考意义但测光滑金属表面时数据会非常不靠谱。校准方法我建议做两点标定拿一个恒温热水袋或者热水杯作为低温参考拿一个接近100摄氏度的沸水杯或者电烙铁头作为高温参考用传感器分别测量表面温度同时用一支接触式温度计记录真实温度。得到两组数据后做一元线性校正例如真实温度 k × 测量温度 b通过两个点解出k和b然后在代码里对每个读出的原始温度都做换算。这个方法虽然粗糙但对绝大多数非接触测温场景足够用而且能明显改善测量偏差。实际操作时要注意被测表面不要反光如果必须测金属表面可以贴一块黑色电工胶带作为等效黑体目标。4.4 实测数据与误差观察我拿一个加热平台测试把目标依次设定在30、40、50、60摄氏度接触式温度计记录真实值MLX90614记录原始读数。实测数据大致如下真实温度摄氏度未校正读数摄氏度两点校正后读数30.229.430.139.838.539.650.548.950.361.159.260.9可以看到未校正时误差约0.7到1.9摄氏度校正后能控制到±0.3摄氏度左右。这个精度用于“看出哪个位置明显发热”完全够用。校准过程最大的体会是不要把传感器当万能的读数的准确性不仅取决于传感器还取决于被测物体的表面特性和热平衡状态。测量时探头距离目标一般在3到5厘米左右距离过远视场里的背景辐射会混进来读出来的温度会明显被拉低。5. 踩坑实录红外传感器调试最常见的九个问题红外传感器在实验室里表现很好一放进真实环境就乱来这是几乎所有工程师都经历过的阶段。下面这九个问题每一条我都真金白银踩过按出现频率从高到低整理出来希望能帮你少走一段弯路。太阳光和白炽灯直射干扰。太阳光里含有大量近红外辐射白炽灯灯丝同样是红外大源。传感器放在窗边读数可能一直偏高甚至饱和。对策是给传感器加遮光罩或者改选带窄带滤光片的封装只让特定波段的光进来。热源突然进入视场的误触发。如果项目使用热释电传感器空调开机的热风、开水壶飘出的蒸汽、老鼠从传感器旁边跑过都可能让输出异常翻转。对策是调整灵敏度、改变安装角度、或者在代码里对触发后的信号做持续判定要求连续多次检测到有效信号才真正执行动作。发射率不同导致的温度误判。不同材质表面发射率差异极大这直接导致同一温度的两个物体被测出明显不同的数值。建议在关键测量场景统一表面处理方式或者接受误差并在算法中做补偿。电源纹波耦合到模拟放大链路。红外模拟放大链路增益常常做到几十dB以上电源上的纹波会被放大器拾取形成低频噪声。对策是模拟电路单独用LDO供电并在传感芯片电源脚就近加0.1uF和10uF的退耦电容。红外发射管工作电流超限。主动红外方案如果要提高发射功率不能一直用恒定大电流驱动否则不但发热严重而且寿命缩短。对策是采用脉冲驱动占空比控制在1%到5%瞬间电流可以放到几百毫安平均功耗反而更低发射距离也更远。滤光片选错中心波长。红外遥控、红外避障常用940nm但有的传感器峰值在850nm选不匹配会造成灵敏度大幅下降。对策是选型前一定对照传感器响应光谱图和发射管峰值波长匹配后再打样。透镜或视场遮挡。菲涅尔透镜表面有灰尘、贴了保护膜没撕掉、模块前面放了透明亚克力板都会改变红外透过率导致感应距离急剧缩短。对策是安装时保留必要透光窗口且窗口材料尽量选对红外透过率高的材料。静电损伤。红外光电器件尤其是热电堆的输入级对静电比较敏感冬季干燥环境下用手直接摸引脚很容易导致灵敏度永久下降。对策是焊接时用接地烙铁拿取器件时避免触碰引脚。相邻传感器互相干扰。多路主动红外模块靠得近时A模块的红外LED发射可能被B模块的接收端当作目标反射信号造成串扰。对策是让各路发射频率或调制编码不同或者在物理上进行光路隔离。6. 红外传感器还有哪些值得关注的方向聊完具体的调试排障我想给做产品的朋友再延展几个更值得关注的红外传感方向这些方向不一定要立刻落地但知道它们的存在能帮你建立更长远的选型眼光。6.1 热像阵列与红外成像红外测温只能给单点温度热像阵列则是把很多个热电堆单元集成在同一个芯片上形成8×8、32×32甚至更高分辨率的网格每格输出一个温度值。MLX90640这样的传感器模块可以直接读出32×24个点的温度配合算法就能拼出粗糙的热像图。做家电智能化时可以拿来做人数统计、灶台防干烧、房间温度场监测。它的优势是价格远低于专业热像仪缺点是分辨率低、视场内目标轮廓比较模糊但对付“判断哪里热、哪里冷”已经足够。6.2 低功耗场景下的唤醒策略红外传感器在电池供电的设备里特别吃香因为很多红外方案本身不发射能量只靠接收环境辐射静态功耗可以压得很低。一个经典做法是让热释电模块作为唤醒源设备平时深度睡眠只有检测到人靠近时才唤醒主控做更复杂的处理比如人脸识别、语音交互。这样平均功耗能控制在微安级别一对电池撑一年都不奇怪。设计时注意唤醒模块自身的静态电流以及主控从唤醒到稳定工作这段时间的功耗尖峰防止唤醒瞬间把电池电压拉崩。6.3 多传感器融合与算法空间单一红外传感器信息量有限但和毫米波雷达、超声波、可见光摄像头融合起来就能互相补短板。比如红外热像负责判断“有没有热源”摄像头负责判断“热源长什么样”两者融合后可以做更准确的区域占用检测。算法层面很多低成本单片机也能跑简单的统计滤波、均值滤波、差分阈值判断不必开口闭口就上神经网络。对一个工程人来说把传感器数据调理得干净、准确、可复现比堆模型重要得多。红外传感器这条线说到底是练“把物理信号变成可用数据”的基本功。从最早被楼道感应灯折腾到后来能在两三天内把一颗测温芯片调出合格的精度我最大的体会是红外没有一劳永逸的“万能传感器”每类器件都有各自的脾气明确需求、吃透原理、留足校准余量才是项目顺利推进的关键。如果你正准备上手自己的第一个红外项目别怕调试阶段的大起大落把原理、电路、代码、现场安装当成一个闭环来对待踩过的坑都会变成实打实的手感。