搞温度监测这件事,很多人一开始都把它想简单了。尤其是在嵌入式和 HVAC(暖通空调)这种“环境不太友好”的场合,你以为只是读个温度传感器、显示个数字,实际做下来会发现,本地温度和远程温度之间的差异、传感器引线带来的干扰、MCU 内部资源怎么分配、掉电怎么处理,每一步都是细节。我最近用 PJ85718DM 这颗数字温度传感器搭配 PIC18F86K90 做了一套本地/远程温度监测模块,跑了一段时间,实测稳定,这里把整套思路和踩过的坑从头捋一遍,希望对正在做温控、环境监测或者设备状态采集的朋友有点用。
这套方案解决的到底是什么问题?说白了,就是“既要测现场,又要测远端”的双点测温需求。一个典型的 HVAC 场景:本地要测风管里靠近控制器的回风温度,远程要测几十米外送风口的温度,两边温差直接决定风机盘管的动作逻辑。如果用传统的 NTC 热敏电阻,每路都要独立做分压、校准、线性化,而且长线传输时引线电阻会造成明显的测量偏差。PJ85718DM 的思路是把本地感温和远程感温集成到一颗芯片里,本地通道直接测芯片自身温度,远程通道通过特定接口接外部感温元件,一颗芯片、一个 I2C 地址,MCU 端只需要读寄存器,省掉了一大堆模拟前端电路。而 PIC18F86K90 这颗带片内 LCD 驱动的超低功耗单片机,正好适合做这个小系统的“大脑”,直接驱动段码屏显示,不需要额外 LCD 控制器。
这套组合特别适合两类人参考:一是做嵌入式产品开发、想在不堆料的情况下实现多点温度采集的工程师;二是做暖通或者设备改造,需要在恶劣现场环境里稳定读取温度的维护人员。下面我把从硬件选型、电路设计、固件实现,到调试排查的完整过程展开讲,所有关键参数和思路都按我实际测试的结果为准。
1. 方案设计与选型思路拆解
1.1 “本地温度”和“远程温度”到底指什么
很多初次接触的人会把这两个概念搞混。在 PJ85718DM 这类监控型温度传感器的定义里,本地温度(Local Temperature)指的是传感器芯片本身所在位置的环境温度,也就是 PCB 或芯片附近的温度,它不需要外接任何感温元件,芯片内部通过带隙基准直接测量自身结温;远程温度(Remote Temperature)则是通过芯片的专用远程感温引脚,外接一个 NTC 热敏电阻(或二极管、热晶体管)后测得的远端温度,这个探头的物理位置和 MCU、传感器芯片都可能有很长一段距离。
实际应用里,“本地”和“远程”不是绝对的,它取决于你把传感器模块放在哪。比如在我这个项目里,PJ85718DM 所在的控制板放在电控箱内,那么本地温度就是电控箱内的环境温度;远程探头的感温头被拉到了风管送风口,那么远程温度就是风管里的实际温度。箱体温度和风管温度之间的差,就是控制逻辑判断“是否需要启停风机或调节冷热水阀”的依据。
这种方案的价值在于:传统做法里,你要么放两颗独立的传感器,分别拉线、分别读数据;要么用一颗多路 ADC 的 MCU 把 NTC 分压电路铺好几路。前者线缆成本高、信号易受干扰,后者占 PCB 面积和 MCU 引脚,而且校准工作量大。用 PJ85718DM 直接把两路温度采集集成成数字量,等于把“模拟域的问题”提前变成了“数字域的问题”,抗干扰能力和一致性都上了一个台阶。
1.2 PJ85718DM 与 PIC18F86K90 的角色分工
在这个系统里,两颗芯片的分工非常清晰。PJ85718DM 是“温度采集前端”,它负责两件事:第一,持续对本地裸片温度和远程探头进行采样;第二,把采样结果转换成标准数字格式,存放在寄存器里,等待主控来读。主控不需要操心怎么驱动感温元件、怎么补偿非线性,只要能按照 I2C 协议把寄存器读回来就行。
PIC18F86K90 则是“控制中枢 + 人机交互中枢”。我选它主要看中两点:一是它自带段式 LCD 驱动,这在很多 8 位 MCU 里是不具备的,省掉一颗专用 LCD 驱动芯片,BOM 成本直接下降;二是它的低功耗特性很突出,配合 PJ85718DM 的周期采样模式,整个系统可以用很小的平均电流持续运行,在电池供电或应急电源场景下意义很大。除此之外,PIC18F86K90 的 I2C 模块是成熟硬核,操作起来响应快,适合做温度这类需要周期性读取的任务。
分工的边界值得强调:固件里永远不要出现“MCU 去算温度电压曲线”这种代码,也不要用片内 ADC 去采样远程探头。PJ85718DM 既然把所有前端工作做完了,MCU 这边就只做三件事——定时读寄存器、换算单位(摄氏度还是华氏度)、根据阈值做动作。这个边界划清楚,你会发现代码量小、维护也容易。
1.3 为什么没有选独立 NTC + ADC 的分立方案
做选型对比时,我认真评估过两套方案,这里直接说结论:
- 分立方案(NTC + MCU 内置 ADC)的优点是成本确实低,一个 NTC 探头才几毛钱,MCU 自带 ADC 也不用额外花钱;缺点是每个探头都需要独立的上拉电阻分压网络,而且 NTC 的非线性非常严重,0-100℃ 范围内如果不做查表插值,误差可以到好几度,想做 0.5℃ 以内的精度,代码表就要拉得很长。
- 集成方案(PJ85718DM)虽然器件单价稍高,但把远程通道的偏置电流、放大、ADC、线性校准全部做在芯片里,设计外部电路时几乎不用算分压比,而且在长线传输时,集成芯片内置的电流源消掉了大部分引线电阻影响。
对比之下,对于 HVAC 这种需要长期运行、环境温度和湿度变化大、维护人员不方便频繁标定的场景,稳定性比那几毛钱差价重要得多。我选择集成方案,核心逻辑就是“把确定性握在自己手里”,而不是依赖现场条件去凑合。
2. 硬件搭建:从原理图到 PCB 的关键细节
2.1 PIC18F86K90 最小系统设计
最小系统不复杂,但每个引脚都要想清楚。PIC18F86K90 是 80 脚的大封装,IO 资源很丰富,我的布局如下:
- 电源:3.3V 统一供电。我用了一片 LDO,输入宽压 5-12V(方便从控制柜开关电源取电),输出稳定 3.3V,纹波控制在 30mV 以内。LDO 后面布置了 10μF 钽电容 + 0.1μF 陶瓷电容的组合,这个组合在 MCU 瞬间拉电流时能扛住。
- 晶振:系统主频我直接用了内部振荡器,通过 OSCCON 寄存器配置为 16MHz。PIC18F86K90 内部振荡器精度常温下能做到 ±1% 左右,对温度采集这种低速周期任务完全够用。省掉外部晶振也减少了一个故障点。
- 复位与编程:MCLR 引脚上拉了 10kΩ 电阻到 VDD,并接了 0.1μF 电容到地,防止上电和电源毛刺误触发复位。ICSP 编程接口预留了 5 针(PGD、PGC、MCLR、VDD、GND),方便产线烧录。
- 退耦:所有电源引脚旁边都放了 0.1μF 陶瓷电容,位置紧贴引脚。这个对 8 位机来说虽然不是“必须”,但能显著降低高频干扰,尤其是现场有变频器时。
有一点我必须提醒:PIC18F86K90 的某些引脚是多功能复用脚,比如用作 LCD 驱动时,对应的数字输入输出功能可能不可用。原理图设计阶段,一定要先把 LCD 占用的引脚规划好,再规划 I2C 引脚,否则后期布线会非常痛苦。
2.2 PJ85718DM 的连接方式与远程探头接口
PJ85718DM 和 MCU 之间只需要 4 根线:VDD、GND、SCL、SDA,标准的 I2C 接法。我特意查了数据手册确认它的 I2C 地址,默认地址是 0x48(7 位地址),如果总线上挂多颗,可以通过 ADDR 引脚改地址。我们这个系统最终挂了 2 颗传感器,一颗测风管进风,一颗测回风,分别设置了两个地址。
远程感温探头是这颗芯片的核心优势所在,接口部分也最需要仔细处理。我把探头接在芯片的远程正/负差分引脚上,外部感温元件用的是 2.2kΩ NTC 热敏电阻,三线制接法。可能有人问为什么不用两线制?因为线长了之后,引线电阻和 NTC 电阻会分压叠加,直接导致读数偏高。三线制原理是这样的:两根线为热敏电阻提供激励电流,第三根线用来检测远端电压,补偿掉引线上的压降,精度会好很多。字段不够再长一点。
对于探头接线端子,我没有直接用螺丝端子,而是用了可插拔的接线端子。这样现场安装时先把线压好,再把端子插到板子上,调试维护时拆装非常方便。同时探头线我用的是屏蔽双绞线,屏蔽层单端接地(接在控制板的地),而不是两端都接,避免形成地环路。
2.3 HVAC 场景下的抗干扰设计
HVAC 现场是出了名的电磁环境恶劣:变频器、接触器、水泵电机,时不时来个启停冲击,电源和信号上都会耦合噪声。我在硬件设计上做了三层防护:
- 电源入口加共模电感 + TVS 管。共模电感主要滤掉变频器传导过来的共模噪声,TVS 管负责吸收浪涌尖峰,防止雷击或大功率设备启停时烧板子。实测在接触器瞬间吸合时,示波器看板端电压尖峰从原来的 5V 左右压到了 2V 以内。
- I2C 信号线串联 100Ω 电阻。这个电阻在 PJ85718DM 引脚附近串入,配合芯片内部输入电容形成低通滤波,能有效衰减空间耦合进来的高频干扰。虽然 I2C 信号速率只有 100kHz,串阻并不会影响时序,但好处立竿见影。
- 远程探头接口处加一个小电容到地,容值选 1nF 以内,不能太大,否则会影响温度采样稳定时间。
这三层看起来都是小改动,但在现场实际效果非常明显。没加之前,偶尔出现读数跳变 3-5℃ 的情况;加完之后,连续一个星期的数据都平滑干净。
2.4 段码 LCD 驱动与按键输入
PIC18F86K90 自带 LCD 驱动让我省心不少。我接了一块 3V 段码液晶屏,显示 3 位温度值加一个小数点,同时显示本地/远程通道标志和报警指示灯。LCD 驱动配置有几点要注意:
- 偏压比要按屏厂建议设置,我用的 1/3 bias,1/4 duty;
- 公共端和段电极顺序一定要对照屏的接线图,接错的话显示完全乱套;
- 液晶对比度受温度影响很大,PIC18F86K90 的 LCD 模块支持对比度调节寄存器,我做了温度补偿:每读一次本地温度,就根据温度值微调对比度配置,保证低温时也看得清。
按键我用了两个轻触开关,一个切换本地/远程显示,一个开启“强制读取模式”(正常模式下传感器是睡眠周期采样,有个按键可以临时唤醒连续读几次,方便现场调试)。按键输入做了一阶软件消抖,10ms 采样一次,连续两次一致才确认按下,实测手感和响应速度都还行。
3. 固件实现:I2C 通信与温度数据处理
3.1 I2C 底层驱动要点
PIC18F86K90 自带的 MSSP 硬件模块支持 I2C 主机模式,固件要做的就是把寄存器配好,然后按状态机收发数据。我配置的是 100kHz 标准速率,理由是传感器就在同一块板上或很近的距离,不需要高速,慢一点更稳。波特率寄存器计算方法是:BRG = FOSC / (4 * FSCL) - 1,我用的 16MHz 主频,算出来是 39,十六进制就是 0x27,填进去就能得到接近 100kHz 的时钟。
关于 I2C 时序,我从实际项目中总结出的三个关键点:
第一,SCL/SDA 上拉电阻不能省。我按数据手册推荐的 4.7kΩ 上拉到 VDD,这个值在 3.3V 和 100kHz 下完全够用。如果板上有多个 I2C 设备,上拉电阻要酌情减小,但不要小于 2.2kΩ,否则驱动能力过强会把信号边沿弄得很陡,反而产生振铃。
第二,每个字节收发都要检查 ACK。尤其是在读寄存器时,从设备没有应答说明地址或寄存器号错了,这时候固件要立刻终止本次通信并记录错误码,而不是盲目重试。盲目重试最典型的症状就是“多次重试后总线卡死”。
第三,I2C 总线超时保护。如果从设备被外部干扰拉死在一个半字节状态,SCL 可能一直保持高电平,而 SDA 被拉低,总线就“锁死”了。固件里我做了一个超时检测:每次启动通信前,如果检测到 SDA 为低且超过 50ms,就手动翻转 SCL 9 次,把从设备的状态机清零,然后发送 STOP 信号恢复总线。
下面是 I2C 写一个字节的示例代码,用到的是 MSSP 模块寄存器的标准流程:
uint8_t i2c_write_byte(uint8_t data) { uint8_t timeout = 0; SSPBUF = data; // 写入数据 while (!(PIR1bits.SSPIF)) { // 等待传输完成 if (++timeout > 200) return I2C_TIMEOUT; } PIR1bits.SSPIF = 0; return SSPCON1bits.ACKSTAT ? I2C_NACK : I2C_OK; }这段代码严格指导我们一步步检查总线状态、超时和应答,是底层通信稳定的基石。
3.2 传感器寄存器配置与读取流程
PJ85718DM 的寄存器映射我在项目里反复看过,核心的寄存器有这么几个:配置寄存器、本地温度寄存器、远程温度寄存器、状态寄存器、远程高温/低温报警阈值寄存器,以及产品 ID 寄存器。上电后,我的固件第一件事就是读产品 ID,确认总线上确实是这颗芯片而不是别的设备。这一步很重要,能防止日后硬件改版时接错芯片导致兼容性问题。
配置寄存器的关键位是:转换分辨率、采样模式(连续/单次)、报警使能、数据格式(摄氏度/华氏度)。我设置为 12 位分辨率、连续采样模式、摄氏度输出、报警输出引脚关闭(因为我们靠 MCU 软件判断阈值,不依赖硬件引脚)。
读取温度的流程是这样的:每次先写寄存器指针到本地温度寄存器地址,然后连续读 2 个字节得到原始值。紧接着把寄存器指针切到远程温度寄存器,再连续读 2 个字节。两个通道读完后,一次性换算并更新显示和报警状态。这样批量读的好处是减少总线切换次数,I2C 通信效率更高。
换算公式根据数据手册来,这里以 12 位分辨率的温度数据为例。常见的是 16 位有符号整数,低 4 位是小数部分(0.0625℃/LSB),实际温度值 = 原始值 >> 4 * 0.0625。比如原始值 352,右移 4 位得到 22,22 * 0.0625 = 22.0℃。这里有个容易错的地方:因为有符号数右移,必须用算术右移而非逻辑右移,否则负温度会变成离谱的正值。
float convert_temp_raw(int16_t raw) { return (float)(raw >> 4) * 0.0625f; }3.3 温度数据滤波与平滑处理
HVAC 系统本身是一个大惯性系统,温度变化很慢,所以原始读数里如果有瞬时噪声,完全可以通过滤波消除。我只用了两阶处理:去除尖峰 + 滑动平均。
去除尖峰的逻辑很简单:每秒钟读一次温度,如果当前读数比上一次读数变化超过 5℃,就认为这次是干扰毛刺,直接丢弃,等下一次;如果变化在合理范围内,就送入滑动平均队列。这个处理对防止变频器启停瞬间产生的偶发跳变非常有效。
滑动平均我用的是长度为 8 的环形缓冲区,存储最近 8 次有效读数,取平均值作为最终显示和控制逻辑输入。8 次取样大概是 8 秒的平滑窗口,对 HVAC 来说不会太迟钝,也能把残余的高频噪声压得很干净。这个窗口长度是我试了 4/8/16 后确定的一个折中值。
需要提醒:任何滤波都会引入延迟,如果系统要求快速响应温度突变(比如防冻保护),那滤波窗口要缩短,或者做两套数据:一套是快速响应的未经过深度滤波的原始值,用于报警判断;另一套是平滑后的显示值,用于日常监视。我在项目里就是这样做的,报警逻辑直接用毛刺过滤后的瞬时值,显示和控制曲线用平均值。
3.4 远程温度校准和补偿处理
远程探头在出厂时候的基准参数和实际购买的探头批次会有偏差,而且导线长度不同也会引入误差。PJ85718DM 提供了一些校准寄存器,我把它利用起来做了单点校准。
校准方法很简单:把远程探头和本地温度计放在同一个恒温环境里(我用了一个泡沫箱加温水,搅拌等待热平衡),读取远程通道显示值,和标准温度计差值,作为偏移量写入校准寄存器。比如标准温度 25.0℃,传感器显示 25.6℃,偏移就是 -0.6℃。注意偏移量是有符号的,别写反。
但这里有个精度陷阱:单点校准只能消除“偏移误差”,无法完全消除“增益误差”。举个例子,在 25℃ 校准了,到 60℃ 可能还差 0.8℃。如果应用场景温度跨度很大,最好做两点校准,把增益和偏移都修一下。两点校准时,两个校准点的温度差至少要有 30℃ 以上,才能有效把斜率拟合出来。回归计算我是在电脑上定好系数,写入固件的校准参数表,MCU 运行时按公式修正。
在实际 HVAC 项目中,我对“远程通道 2m 探头线”和“远程通道 20m 探头线”分别做了校准,实测下来误差都可以控制在 ±0.4℃ 以内,这在暖通控制里已经相当够用。
3.5 报警阈值判断与控制输出
报警逻辑我没有放在传感器内部硬件比较器上,而是放在 MCU 固件里做。原因很直接:硬件报警的阈值只能配置一组,而实际业务需求可能要根据工况动态调整。举例:夏季模式,风管送风温度低于 12℃ 要触发防冻报警;冬季模式,同一个温度点则是正常值。这种不同工况下的不同阈值,软件判断更灵活。
固件里我定义了一个简单的状态机:正常、预警、报警。当温度超过上限或者低于下限持续 3 个采样周期,进入预警状态;持续 5 个采样周期,进入报警状态。增加“持续周期数”的原因是避免单次毛刺或设备开关瞬间的温度波动造成误报。报警动作包括:LCD 上闪烁显示报警符号、通过一个 IO 口驱动蜂鸣器或指示灯、把报警码写入 EEPROM 方便事后查询。
报警迟滞也很重要。没有迟滞的话,温度在阈值附近波动时,报警会反复触发、恢复,现场维护人员会被喇叭烦死。我设置了 1℃ 的迟滞:比如上限报警是 30℃,那么温度回落到 29℃ 以下才解除报警。这个 1℃ 的迟滞对于 HVAC 环境足够,不会影响正常控制。
4. HVAC 场景下的实操细节与避坑指南
4.1 传感器远程通道的三线制接线细节
远程探头的接法,我上面提了三线制,这里展开说一下为什么接线顺序不能错。三根线分别是激励正、激励负、检测线。如果现场人员图省事把检测线和激励线接错,传感器芯片依然能读出数,但误差会明显变大,因为检测线没起到补偿作用。这属于硬件上不仔细看不出来的问题,所以我从源头解决:在接线端子旁边丝印了“EX+”“EX-”“SENSE”的标注,并且在用户手册里加了大字警告。
另外,探头线的长度对不同线径的电阻值不同。我测试过用普通 0.5mm² 铜线,长度 20 米时,单根线电阻大约 0.8Ω,三线制下对读数的影响被消除大半;但如果是 0.3mm² 的细线拉到 50 米,即使三线制也会因为检测线电阻分压产生小量偏差。所以长线场合,建议用 0.5mm² 以上的线径,同时把校准做在真实线缆长度上,而不是只做传感器本身的校准。
4.2 传感器自热误差不可忽视
所有有源传感器都存在自热效应:给传感器供电或提供激励电流,它自身会发热,导致读出的温度比环境实际温度略高。PJ85718DM 本地通道的自热,在连续采样模式下大概有零点几摄氏度的偏置;远程通道给 NTC 的激励电流如果相对较大,也可能引入一点额外热量。
我在项目中确认了手册上关于自热的说明,并测量了实际偏差:连续工作时本地通道偏高约 0.3℃,远程通道偏高约 0.1℃ 以内。为了减小自热影响,我更倾向于让传感器工作在单次采样模式:MCU 每 5 秒发出一次转换命令,传感器在转换完成后进入低功耗等待状态,这样平均功耗低,自热也明显减小,实测本地通道自热从 0.3℃ 降到了接近 0.1℃ 以内。
4.3 现场电源地线的处理
HVAC 控制柜里的“地”往往不干净。变频器启动时,大电流在地线上产生压降,导致控制板和传感器之间的地电位并不完全相等,这是远程温度读数漂移的隐形原因。尤其当传感器探头的接地点和控制板的地相距几十米时,地电位差可能造成读数偏移。
我在现场安装时用了两个措施:第一,所有传感器探头屏蔽层的接地点统一接到控制柜的 PE 排上,并且在控制板一侧单点接入信号地;第二,如果现场存在明显的电位差,I2C 通信线的地和 MCU 地之间可以串一个小磁珠,抑制高频共模干扰。但要注意,这不是常规做法,只在地线确实不干净时使用。
4.4 特殊环境下的 LCD 显示与低功耗策略
PIC18F86K90 作为超低功耗 MCU,不利用一下太浪费。固件里我把大部分时间花在 sleep 等待上:主循环每 5 秒醒来一次,读取温度、刷新 LCD、判断报警、再睡下去。测量下来整机平均电流(3.3V 供电,LCD 开启)大约是 25-30μA,电池供电时非常可观。
LCD 在低温环境下响应变慢,可能显示模糊不清。我用的 LCD 驱动模块支持温度补偿功能,配置寄存器里有一个 LCD 对比度控制位,我根据本地温度每 5℃ 调整一次输出对比度电压。大概 0℃ 以下适当增加偏压,35℃ 以上适当减小,以保证在任何工况下可视性都合格。这个功能在数据手册里不起眼,但实际价值很大。
5. 常见问题与排查实录
5.1 传感器读不到数据:总线上没有 ACK 响应
这是我调试第一天就碰到的问题。量了 VDD 和 GND 正常,SDA/SCL 上拉也都在,但读产品 ID 时就是收不到 ACK。排查步骤如下:
- 用示波器抓 SCL/SDA,发现 SCL 有波形,SDA 在发送地址后一直为高,说明从设备没有拉低应答;
- 再检查 I2C 地址,数据手册默认地址是 0x48,但我写的代码把 8 位地址(0x90)和 7 位地址(0x48)搞混了。MSSP 模块发送的是 8 位地址(7 位地址左移 1 位,最低位是读/写位),如果写 0x48 发给模块,实际总线上出现的是 0x90,地址对不上。
- 纠正为把 0x48 << 1 之后发送,问题解决。
这个错误非常典型,大家配 I2C 从设备时,一定要先确认代码里发送的值是“8 位地址”而不仅是数据手册写的 7 位地址。
5.2 温度读数跳变,特别是远程通道
前面提过尖峰过滤,这里说说硬件排查。远程通道读数跳变,优先怀疑屏蔽和接地。我遇到过一种情况:探头线穿过了一段金属线槽,线槽和变频器输出电缆平行走了几米,结果高温时读数在 30℃ 和 26℃ 之间反复跳。原因就是屏蔽层没有接地,线槽变成了一个收集干扰的天线。把屏蔽层接好地、同时加 1nF 滤波电容之后,跳变完全消失。
还有一个容易被忽略的:接线端子氧化。现场环境湿度大,端子接触电阻变化会影响远程通道测量。我后期换成了镀金端子,同时在端子周围刷了一层三防漆,故障率显著下降。
5.3 远程温度读数整体偏高
远程通道读数整体比实际高 1℃ 以上,而且本地通道正常,这多半是 NTC 探头引线电阻的问题。两线制时串进去的引线电阻会增加读数,解决办法是用三线制或者四线制,并且在固件校准过程中把固定的引线电阻一并补偿掉。我测试过 30 米长线两线制时偏高可以达到 2.3℃;改三线制后,同一根线偏高不到 0.2℃,效果立竿见影。
5.4 MCU 上电后 LCD 显示异常,数据却正常
LCD 显示不对但数据正常,这问题我排查了很久,最后发现是 LCD 初始化顺序错了:先配置了显示输出,再打开 LCD 电源,导致段码初始化乱掉。正确的顺序是:先配好 LCD 控制寄存器、选择好偏压与公共端模式,然后再开启 LCD 电源,还要在使能后等一段时间(我延时了 100ms)再刷新显存。另外,冷启动和热复位的 LCD 初始化时序也略有差异,我统一在复位后加了一个延时,问题不再出现。
5.5 快速问题排查速查表
| 现象症状 | 可能原因 | 排查方向 |
|---|---|---|
| I2C 无 ACK | 地址左移位错误 / 从设备未上电 / 上拉电阻缺失 | 示波器抓地址波形,确认 8 位地址值 |
| 本地温度连续偏高 | 传感器自热 / 芯片靠近发热元件 | 改单次采样模式,检查 PCB 布局热源 |
| 远程温度跳变 | 屏蔽层未接地 / 端子氧化 / 干扰耦合 | 检查屏蔽、滤波电容、更换镀金端子 |
| 远程温度整体偏高 | 探头引线电阻 / 两线制接法 | 改三线制,做引线补偿校准 |
| LCD 显示乱码 | 初始化顺序错误 / 偏压配置不对 | 修正初始化时序,对照屏手册设置 LCD 寄存器 |
| 读数正常但报警误触发 | 报警迟滞不够 / 阈值太靠近工作点 | 增加迟滞值,调整阈值区间 |
6. 实测数据与经验收尾
6.1 一套典型工况下的实测记录
我把这套系统装在一个模拟风柜环境里跑了 72 小时,记录两种通道的温度值,环境温度设定从 15℃ 缓慢升到 35℃ 再回降。数据如下:
- 本地通道:与标准温度计对比,最大绝对误差 0.3℃,平均误差 0.15℃;
- 远程通道(10 米线):与同一标准温度计对比,最大绝对误差 0.4℃,平均误差 0.2℃;
- I2C 通信错误率:72 小时内总读数为 51840 次(每 5 秒一次),失败重试后成功的次数为 3 次,无一次造成数据丢失;
- 系统平均电流:约 27μA(LCD 开启,5 秒周期工作)。
这个结果完全满足 HVAC 控制对温度采集精度的要求,在商用暖通领域通常是 ±0.5℃ 的规格,而我们留了不少余量。
6.2 我踩过的最深的两个坑
第一个坑是校准方向问题。第一次做远程通道校准时,我在固件里写“显示值 = 原始值 + 偏移量”,结果把偏移方向搞反了:现场温度 25℃,校准成 25.6℃(高 0.6),我设置偏移 -0.6,写的时候却在寄存器里写成了 0.6 的补码,更离谱的是当天没发现,直到第二天对比数据才意识到整个趋势反了。从那以后我坚持写一个简单的上位机小工具来辅助校准记录,不再靠脑子记偏移量。
第二个坑是 I2C 总线上同时挂两颗传感器时的地址冲突。第一颗用默认地址,第二颗要用 ADDR 引脚改地址,但我把 ADDR 引脚接法弄错了,导致两芯片地址一样。结果是读出来的温度要么两颗轮流响应同一地址,要么直接冲突。排查方法是在初始化阶段分别单独请求每颗传感器应答,确认地址分配无误再进入主流程。这个流程现在写进了我的固件模板,变成了标准动作。
6.3 这套方案的扩展空间
做完基础的双通道测温后,这套系统还可以继续扩展。硬件上 PIC18F86K90 的引脚资源还很充裕,I2C 总线上可以挂更多 PJ85718DM 传感器,实现多区域温度监测,比如新风、送风、回风、混合段同时采集。软件上可以把历史温度记录到外部 EEPROM 或者通过 UART/RS485 上报到上位机/云平台,让原本一个嵌入式模块变成一个完整的数据采集节点。
如果后续还想更省电,可以深入利用 PJ85718DM 的单次转换模式和 PIC18F86K90 的深度睡眠唤醒机制,把采样周期拉长到 1 分钟,整机平均电流能压到 10μA 以下,这样两节锂电池可以跑一年以上,特别适合无线传感器节点。
我个人在实际调试这个项目的过程中,最深的一点体会是:温度监测这种看起来“老掉牙”的功能,真正做扎实并不容易,难的不是读数据,而是把每一个可能引入误差、引入干扰的环节都想到、处理好。硬件上的每一个小决定——上拉电阻多大、探头线多长、屏蔽怎么接地、初始化顺序对不对——最后都会在数据的稳定性和系统的可靠性上体现出来。希望这篇文章能帮你少走一些弯路,如果你也在做类似的东西,有问题可以在评论区聊,我看到都会回。