基于PJ85718DM与PIC18F87J11的本地+远程温度监测系统设计 1. 项目缘起与整体设计思路嵌入式温度监测这件事说起来简单做起来坑不少。我最早接触这类需求是在一个环境控制类项目里当时的要求很朴素本地要能看到实时温度远程也要能拿到数据而且两边的数据得对得上。后来类似的需求反复出现比如机房环境监控、养殖棚温控、小型仓储的冷链预警场景不同但核心逻辑几乎一样——传感器采集、MCU处理、本地显示、远程上报。这次拿到的标题涉及 PJ85718DM 与 PIC18F87J11 两颗芯片的配合正好是一个典型的“本地远程”双通道温度监测架构我把它完整拆一遍。先说清楚这个项目到底在做什么。PJ85718DM 是一颗红外温度传感器信号调理芯片配合热电堆传感器使用负责把微弱的红外热电堆信号放大、线性化并输出与温度相关的模拟电压。PIC18F87J11 是 Microchip 的一款 8 位单片机带 12 位 ADC、丰富的外设和较大的 Flash适合做数据采集、逻辑控制和通信调度。两者组合起来就构成了一个从“感知”到“处理”再到“呈现与上报”的完整链路。本地温度通过传感器直接测得远程温度则通过通信接口把数据送到上位机或另一节点。为什么选这套组合而不是更简单的方案我当时的考量有这么几点。第一红外测温在 HVAC供暖、通风与空调场景里非常实用因为它不需要接触被测物体能测风道表面温度、出风口温度甚至能监测人员活动带来的热分布变化。第二PIC18F87J11 的 12 位 ADC 对于 PJ85718DM 输出的模拟信号来说分辨率够用而且它有多路 UART、SPI、I2C方便同时接本地显示屏和远程通信模块。第三8 位 MCU 在这个场景里功耗和成本都可控不需要上 32 位平台开发周期也短。这个项目适合谁参考如果你正在做 HVAC 控制板、环境监测节点、或者任何需要“本地显示远程上报”的温度采集设备这套架构可以直接抄作业。哪怕你用的是别的 MCU 或别的传感器里面的信号调理思路、ADC 采样策略、通信协议设计、以及本地与远程数据一致性处理都是通用的。下面我会从硬件链路、软件流程、实操细节、常见问题几个维度展开尽量把每个“为什么”都讲透。2. 核心器件解析与信号链路设计2.1 PJ85718DM 到底在做什么PJ85718DM 这类芯片的本质是一个热电堆信号调理前端。热电堆传感器输出的是非常微弱的电压信号通常在几十微伏到几毫伏每摄氏度之间而且输出阻抗高、容易受干扰。如果直接把这个信号送到 MCU 的 ADC基本没法用噪声会把有效信号淹没。PJ85718DM 内部集成了低噪声放大器、斩波稳定电路、线性化处理有的型号还带环境温度补偿最终输出一个与目标温度成较好线性关系的模拟电压。这里有个关键点它输出的不是数字温度值而是模拟电压。所以 MCU 端必须做 ADC 采样再通过标定曲线换算成温度。很多人第一次用这类芯片会误以为它直接给温度结果接上以后发现读出来是一堆跳动的数字其实就是没做换算。我在实际项目里一般会先让传感器对准一个已知温度的黑体比如恒温水浴上的黑色金属块记录几组 ADC 值和对应的实际温度然后用最小二乘法拟合出斜率和截距。2.2 PIC18F87J11 的资源分配PIC18F87J11 在这套系统里承担的角色是“调度中心”。它的主要任务包括驱动 ADC 采集 PJ85718DM 的输出、读取本地数字温度传感器比如 I2C 接口的器件做环境温度补偿、驱动本地显示LCD 或数码管、通过 UART 或 SPI 与远程通信模块交互、以及处理按键或报警输出。我一般会把资源这样分配ADC 的 AN0 通道接 PJ85718DM 输出AN1 接一个热敏电阻或数字温度传感器做冷端补偿UART1 用于远程通信UART2 或 SPI 用于本地显示定时器 0 做系统滴答定时器 1 做 ADC 采样触发。这样分工明确中断优先级也好安排。PIC18F87J11 的 12 位 ADC 在 5V 参考下理论分辨率是 5V/4096 ≈ 1.22mV。如果 PJ85718DM 的输出斜率是 10mV/°C那么理论温度分辨率就是 0.122°C实际受噪声影响大概在 0.5°C 左右对于 HVAC 场景完全够用。2.3 本地与远程的温度定义这里要区分两个概念。本地温度通常指设备所在位置的环境温度或者传感器直接测到的目标温度远程温度则是指通过通信链路获取的另一个节点的温度数据或者本设备上报给远程监控端的温度值。在这个项目里我把它设计成本地温度由 PJ85718DM 红外传感器测量目标表面温度同时用板载数字传感器测量环境温度远程温度则是通过 UART 发送到上位机的数据包上位机解析后显示。为什么要同时测环境温度因为红外测温受环境温度影响很大。热电堆的冷端温度变化会导致输出漂移如果不做补偿夏天和冬天测同一个目标可能差好几度。PIC18F87J11 读取环境温度后可以在软件里做补偿计算这个后面会详细讲。3. 硬件连接与关键参数计算3.1 传感器与 MCU 的接口电路PJ85718DM 的输出是模拟电压连接到 PIC18F87J11 的 ADC 输入引脚。这里有几个细节要注意。第一模拟地和数字地要分开走线最后单点汇合否则 MCU 的数字开关噪声会串到模拟信号里。第二传感器输出端要加 RC 低通滤波我一般用 1kΩ 电阻串联0.1μF 电容对地截止频率约 1.6kHz能滤掉大部分高频干扰又不会影响温度变化的响应速度。第三如果传感器和 MCU 距离较远最好用屏蔽线屏蔽层单端接地。PIC18F87J11 的 ADC 参考电压可以选择内部或外部。为了精度我建议用外部参考比如一颗 4.096V 的基准源这样每个 ADC 码对应的电压是 1mV计算起来非常直观。如果直接用 VDD 做参考VDD 的波动会直接变成测量误差开关电源供电时尤其明显。3.2 ADC 采样与温度换算假设 PJ85718DM 的输出电压与目标温度的关系是Vout Voffset K × Tobj其中 Voffset 是 0°C 时的输出电压K 是灵敏度比如 10mV/°CTobj 是目标温度。实际芯片的 Voffset 和 K 会有个体差异所以每台设备最好单独标定。标定方法我通常这样做准备两个温度点比如 0°C 冰水混合物和 100°C 沸水注意气压修正把传感器对准黑体目标记录 ADC 值。然后解方程K (V100 - V0) / 100 Voffset V0实际温度计算Tobj (Vadc - Voffset) / K如果 ADC 参考是 4.096V12 位那么 Vadc ADC_code × 4.096 / 4096。把这些代入就能从 ADC 码直接算出温度。我在代码里一般会把这个公式简化成定点运算避免浮点开销。3.3 环境温度补偿的计算热电堆传感器的输出实际上与目标温度和環境温度的差值有关。更准确的模型是Vout A × (Tobj^4 - Tamb^4)但这样计算量太大在 8 位 MCU 上不现实。工程上常用线性近似Tobj Traw C × (Tamb - 25)其中 Traw 是未补偿的读数Tamb 是环境温度C 是补偿系数通常由实验确定大概在 0.05 到 0.15 之间。我一般会先测几组不同环境温度下的数据拟合出 C 值然后写进代码。这个补偿不做的话环境温度每变化 10°C读数可能漂 1°C 以上对于要求 ±0.5°C 的场景就不够了。4. 软件架构与实操流程4.1 主循环与中断分工PIC18F87J11 的程序我一般分成三层中断层、调度层、应用层。中断层负责 ADC 采样完成、UART 收发、定时器滴答调度层用一个简单的时间片轮询每 10ms 处理一次按键和显示刷新每 100ms 处理一次温度采集和补偿计算每 1s 处理一次远程上报应用层就是具体的温度换算、报警判断、协议打包。这样做的好处是实时性有保障又不会让主循环太复杂。我试过把所有逻辑塞进主循环结果 UART 接收偶尔丢字节后来改成中断接收环形缓冲区就稳了。4.2 本地显示的实现本地显示我用的是 1602 字符 LCD4 位数据模式占用 6 个 IO。显示内容分两行第一行显示目标温度第二行显示环境温度和状态。刷新率不用太高2Hz 就够了太快反而闪。这里有个小技巧只刷新变化的字符不要整屏重写否则 LCD 会有轻微闪烁而且 MCU 开销也大。如果不用 LCD用数码管也行但需要额外的驱动芯片。我选 LCD 是因为它能同时显示温度和单位信息量大用户看起来直观。4.3 远程通信协议设计远程通信我走的是 UART波特率 96008 数据位无校验1 停止位。协议格式我设计成简单的帧结构字节内容说明00xAA帧头10x01设备地址2温度高字节目标温度×10有符号3温度低字节4环境温度高字节环境温度×10有符号5环境温度低字节6状态字节bit0 报警bit1 传感器故障7校验和前 7 字节异或80x55帧尾这个协议简单可靠上位机解析也容易。温度乘以 10 是为了保留一位小数用整数传输避免浮点。校验和用异或虽然简单但对于短帧足够用能挡住大部分传输错误。4.4 远程节点的数据接收与显示远程端我用另一块 PIC18F87J11 加一个 LCD 做接收显示或者直接接电脑用串口助手看。如果是做产品远程端可能是上位机软件或者云平台。这里的关键是超时处理如果 3 秒没收到有效帧就显示“通信中断”避免显示旧数据误导用户。我在实际项目里遇到过通信线松动数据一直停在最后一个值用户以为温度没变其实已经断线了。后来加了超时判断就没这个问题了。5. 常见问题与排查技巧实录5.1 温度读数跳动大怎么办这是最常见的问题。原因通常有三个电源噪声、ADC 参考不稳、传感器信号被干扰。排查顺序我一般这样先用示波器看 PJ85718DM 输出端的纹波如果超过几毫伏就在输出端加更大的滤波电容或者检查电源是否用了开关电源。如果电源没问题再看 ADC 参考用万用表测参考电压是否稳定。最后检查 PCB 布局模拟走线是否远离数字信号线。软件上也可以做滑动平均滤波我一般取 8 个采样点做平均既能平滑数据又不会太滞后。如果要求响应快可以用中值滤波去掉最大最小值再平均。5.2 远程数据与本地显示不一致这个问题我遇到过几次原因大多是本地显示和远程发送用了不同的变量。比如本地显示的是补偿后的温度远程发送的是原始温度那肯定对不上。解决办法是统一数据源在调度层算好最终温度后存到一个全局变量里本地显示和远程发送都读这个变量。另外要注意发送时的字节序上位机解析时如果高低字节搞反了读出来会是乱码。5.3 传感器故障判断PJ85718DM 如果断线或损坏输出可能饱和到电源轨或零。我一般会在软件里加判断如果 ADC 值持续低于 50 或高于 400012 位就认为传感器异常状态字节置故障位本地显示“传感器故障”。这样用户能第一时间发现问题而不是看到一个看似正常但实际错误的温度。5.4 常见问题速查表现象可能原因排查方法解决措施读数跳动大电源噪声示波器看纹波加滤波电容改用线性电源读数漂移环境温度变化对比不同环境温度加环境温度补偿远程无数据通信线接反检查 TX/RX交叉连接数据乱码波特率不匹配确认双方波特率统一为 9600显示闪烁整屏刷新观察刷新频率只刷新变化字符传感器故障断线或损坏测输出端电压检查连接更换传感器6. 实操心得与扩展思路6.1 标定环节不能省很多人为了省事直接用芯片手册的典型值写代码结果做出来的设备误差好几度。我的经验是每台设备单独标定至少做两点标定。如果批量生产可以抽检一批找出典型值但个体差异还是要用软件补偿。标定数据可以存在 MCU 的 EEPROM 里掉电不丢。6.2 通信线保护远程通信线如果走线较长容易受干扰。我一般会在 UART 线上加 TVS 管做浪涌保护串联 100Ω 电阻限流。如果是工业环境最好用隔离型收发器比如带隔离的 RS485 芯片虽然成本高一点但稳定性提升明显。6.3 低功耗考虑如果设备是电池供电PIC18F87J11 可以进入休眠模式定时唤醒采样。PJ85718DM 也有低功耗模式但要注意唤醒时间。我实测下来采样间隔 10 秒、每次采样 100ms 的方案平均电流可以做到 1mA 以下用两节 AA 电池能撑几个月。6.4 后续扩展方向这套架构还可以扩展。比如加一个 SD 卡做本地数据记录方便事后分析或者加一个无线模块做远程上报省去布线再或者加一个继电器输出温度超限时直接控制加热或制冷设备。PIC18F87J11 的 IO 和外设资源足够支撑这些扩展关键是软件架构要留好接口。我在实际使用中发现温度监测这类项目硬件设计占三成软件滤波和补偿占三成剩下四成是现场调试和问题排查。把常见问题提前想到代码里做好防护能省下大量返工时间。希望这些经验对正在做类似项目的朋友有帮助。