
1. 项目缘起与整体设计思路嵌入式温度监测这个方向看起来简单实际上手才知道坑有多密。我这次做的是一个面向 HVAC暖通空调场景的温度采集方案核心器件选了两颗一颗是PJ85718DM温度传感器另一颗是STM32G431KB微控制器。标题里说的本地与远程温度落到实际工程里就是两件事——本地温度靠板载传感器直接读远程温度靠探头拉线或者走总线回传。这两条路的数据最后都要汇总到同一颗 MCU 上做处理、显示和上报。先说为什么选这两颗料。STM32G431KB 属于 G4 系列Cortex-M4 内核带 FPU主频能跑到 170MHz对于温度采集这种慢变量任务来说性能绰绰有余。但真正让我下决心的是它的模拟外设12 位 ADC 采样率够高内置运放和比较器还有硬件过采样能力。HVAC 场景里温度信号往往伴随噪声硬件过采样配合软件滤波能省掉不少外围电路。至于 PJ85718DM这是一颗数字温度传感器I2C 接口精度和稳定性在同类里属于中上水平关键是它支持多地址配置一条 I2C 总线上可以挂好几颗这对多点测温的 HVAC 应用太重要了。整体设计思路可以拆成三层。感知层负责把物理温度变成电信号或数字量本地用 PJ85718DM 贴板测量远程用探头加分压或恒流源方案。处理层是 STM32G431KB 的主场负责采样调度、滤波、温度换算、越限判断。交互层包括本地显示OLED 或段码屏、按键设置、以及通过 UART 或无线模块把数据送到上位机。三层之间用清晰的数据流串起来避免耦合。提示HVAC 应用对温度的响应速度要求不高通常 1~2 秒更新一次就够所以采样周期不用压得太短反而要留足滤波时间。这里有个设计取舍值得说。很多人一上来就想用 RTD铂电阻做远程测温精度确实高但恒流源电路、引线补偿、ADC 基准漂移这一套下来成本和调试量都上去了。我这次远程通道用的是NTC 热敏电阻 分压 ADC的方案配合 STM32G431KB 的过采样实测在 0~80℃ 范围内能做到 ±0.5℃ 以内对 HVAC 来说完全够用。省下来的成本和时间投到软件滤波和校准上性价比更高。2. 核心器件解析与选型考量2.1 PJ85718DM 的关键特性与使用要点PJ85718DM 是一颗 I2C 接口的数字温度传感器工作电压范围宽典型精度在常温段能到 ±0.5℃ 左右。它内部集成了带隙基准和 ADC直接输出数字量省去了 MCU 端做模拟换算的麻烦。I2C 地址可以通过引脚配置成多个值这意味着同一条总线上挂 4 颗甚至 8 颗都不会冲突。实际用的时候有几个细节必须注意。第一是上拉电阻I2C 的 SDA 和 SCL 都要接上拉典型值 4.7kΩ但如果总线走线长或者挂的器件多要适当减小到 2.2kΩ 甚至 1kΩ否则上升沿变缓会导致通信失败。第二是电源去耦传感器供电脚旁边一定要放 0.1μF 的陶瓷电容离引脚越近越好HVAC 环境里电源纹波往往比实验室大得多。第三是转换时间PJ85718DM 单次转换需要一定时间连续读的时候要留够间隔不能刚发完启动命令就立刻读结果。// PJ85718DM 读取温度的基本流程伪代码 #define PJ85718_ADDR 0x48 1 uint8_t buf[2]; HAL_I2C_Mem_Read(hi2c1, PJ85718_ADDR, TEMP_REG, 1, buf, 2, 100); int16_t raw (buf[0] 8) | buf[1]; float temp raw * 0.0625f; // 具体分辨率以手册为准上面这段是典型的读取逻辑重点是那个分辨率系数不同型号可能不一样一定要翻手册确认别想当然。2.2 STM32G431KB 的模拟外设与资源分配STM32G431KB 的资源在这个项目里分配得比较满。ADC1 用来采远程 NTC 分压ADC2 可以留着做冗余或者采其他模拟量。I2C1 接 PJ85718DMUART2 接上位机或无线模块剩下的 GPIO 分给按键、LED 和显示接口。G4 系列的 ADC 有个很好用的功能叫硬件过采样可以把多次采样结果累加后右移等效于提高分辨率同时抑制随机噪声。比如设置 16 倍过采样、右移 4 位就能在不大幅牺牲速度的前提下把有效位数提上去。对 NTC 这种输出变化缓慢的信号来说这个功能简直是量身定做。// ADC 过采样配置示例基于 HAL 库 hadc1.Init.OversamplingMode ENABLE; hadc1.Init.Oversampling.Ratio ADC_OVERSAMPLING_RATIO_16; hadc1.Init.Oversampling.RightBitShift ADC_RIGHTBITSHIFT_4; hadc1.Init.Oversampling.TriggeredMode ADC_TRIGGEREDMODE_SINGLE_TRIGGER;注意过采样倍率越高单次转换耗时越长。16 倍过采样下如果 ADC 时钟是 60MHz、采样时间 12.5 周期一次完整转换大概要几十微秒对温度采集来说完全无压力但如果你同时还要采其他快速信号就要算好时间预算。2.3 本地与远程测温的架构差异本地测温直接用 PJ85718DM 贴板好处是数字接口、抗干扰强、不需要校准电路。远程测温走 NTC 分压好处是探头便宜、线可以拉很长、坏了直接换。两者的数据在 MCU 里汇合后统一做温度换算和滤波。这里有个容易忽略的点远程通道的参考电压。如果直接用 MCU 的 VDDA 做 ADC 基准而 VDDA 又来自一个不太稳的 LDO那测量结果会跟着电源漂。我的做法是用一颗外部基准芯片给 NTC 分压供电或者至少用 MCU 内部的 VREFINT 做实时校准。后者更省事STM32G431KB 内部有个已知电压的参考通道定期采一下就能反推 VDDA 的实际值从而修正所有 ADC 读数。3. 硬件搭建与实操步骤3.1 本地通道的电路连接本地通道最简单PJ85718DM 的 VCC 接 3.3VGND 接地SDA/SCL 分别接 STM32G431KB 的 I2C1 引脚比如 PB7/PB6两根线上各挂一个 4.7kΩ 上拉到 3.3V。地址引脚按需要接高或接低决定器件地址。实际焊接的时候我建议先把传感器焊在一块小转接板上再用排线连到主板。这样万一传感器坏了换起来不用动主板。HVAC 设备往往装在不好拆的位置维护便利性要提前考虑。3.2 远程通道的 NTC 分压设计远程通道的核心是一个分压电路NTC 和一颗固定电阻串联中间点接 ADC 输入。固定电阻的选型有讲究要让它和 NTC 在目标温度范围内的阻值接近这样分压点的变化最灵敏。假设用的是 10kΩ 的 NTC25℃ 时 10kΩB 值 3950目标测量范围 0~80℃。25℃ 时 NTC 是 10kΩ那固定电阻也选 10kΩ此时分压点正好在 VCC 的一半ADC 读数居中动态范围最大。0℃ 时 NTC 阻值会升到 30kΩ 左右80℃ 时降到 1.5kΩ 左右分压点分别在 VCC 的 75% 和 13% 附近都在 ADC 量程内设计合理。// NTC 温度换算B 值法 float ntc_to_temp(float resistance) { const float R0 10000.0f; // 25℃ 阻值 const float B 3950.0f; // B 值 const float T0 298.15f; // 25℃ 开尔文 float temp_k 1.0f / (1.0f/T0 logf(resistance/R0)/B); return temp_k - 273.15f; }上面这个公式是 B 值法的标准形式精度对 HVAC 够用。如果要求更高可以用查表加线性插值把厂家给的阻值-温度表直接烧进代码。3.3 电源与抗干扰布局HVAC 环境里电机、继电器、变频器一大堆电磁干扰比实验室恶劣得多。电源入口我放了 TVS 管和共模电感MCU 和传感器的供电各自加 LC 滤波。PCB 布局上模拟地和数字地分开走最后在一点汇合。NTC 的走线尽量短如果必须拉长用屏蔽线并且屏蔽层单端接地。提示远程 NTC 的线如果超过一两米建议在 ADC 输入脚前面加一个 RC 低通比如 1kΩ 0.1μF截止频率大概 1.6kHz能把大部分高频干扰挡在外面。4. 软件实现与数据处理4.1 采样调度与任务划分软件这边我用的是裸机加定时器调度的方式没上 RTOS因为任务不复杂。SysTick 做 1ms 基准每 500ms 触发一次温度采集任务依次读本地 I2C 传感器、启动远程 ADC 转换、等转换完成后读结果、做滤波和换算、更新显示和判断越限。任务划分上I2C 读取是阻塞式的但 PJ85718DM 转换快阻塞时间很短不影响整体。ADC 用中断或 DMA 方式转换完成触发回调在回调里存结果。这样主循环不会被卡住。4.2 滤波算法的选择与参数温度信号本身变化慢但叠加的噪声可能不小。我用了两级滤波第一级是 ADC 硬件过采样第二级是软件的一阶低通。一阶低通的公式是y y α * (x - y)α 越小越平滑但响应越慢。对 HVAC 来说我取 α 0.1对应的时间常数大概几秒既能压住噪声又不会让温度变化明显滞后。// 一阶低通滤波 float filtered 0.0f; float alpha 0.1f; float low_pass(float input) { filtered alpha * (input - filtered); return filtered; }如果某个通道需要更快响应比如用于控制逻辑可以单独把 α 调大。不同通道用不同的滤波参数这在代码里用一个结构体数组管理就行。4.3 温度换算与校准本地通道读出来就是摄氏度直接用。远程通道要先算 NTC 阻值再换算温度。阻值计算是R_ntc R_fixed * (VCC - V_adc) / V_adc其中 V_adc 是 ADC 读数换算出的电压。校准这块我在出厂前会用两个已知温度点比如冰水混合物 0℃ 和沸水 100℃视实际条件做两点校准算出一个偏移量和增益系数存到 Flash 里。运行时先做换算再套校准系数能把个体差异和电路误差都修掉。校准点标准温度实测温度修正方式低温点0℃0.8℃偏移 -0.8℃高温点80℃81.5℃增益 0.99常温点25℃25.2℃验证5. 常见问题与排查实录5.1 I2C 通信失败最常见的现象是读不到 PJ85718DM返回 HAL_ERROR 或 HAL_TIMEOUT。排查顺序先量上拉电阻有没有焊、阻值对不对再用示波器看 SDA/SCL 有没有波形然后确认地址对不对有些模块出厂地址和手册标的不一样最后看电源是不是稳在 3.3V。我踩过一次坑上拉电阻焊成了 10kΩ短线测试没问题线一长就偶尔失败。换成 4.7kΩ 后稳定了。所以上拉电阻别照搬要根据实际总线和线长调整。5.2 ADC 读数跳动大远程通道读数跳先看硬件NTC 线是不是太长、有没有屏蔽、分压电阻精度够不够。再看软件过采样开没开、滤波参数合不合适。如果都排除了还跳可能是 VDDA 不稳用 VREFINT 校准一下试试。注意ADC 输入脚的阻抗不能太高NTC 分压的等效输出阻抗如果超过几十 kΩ采样保持电容充不满读数会偏低。必要时加一个电压跟随器。5.3 温度换算偏差如果读数整体偏高或偏低多半是 NTC 的 B 值或 R0 用错了。不同厂家的 NTC 参数不一样一定要用实际采购型号的手册数据。另外分压电阻的精度也要考虑1% 精度的电阻带来的误差在 0.1℃ 量级可以接受5% 的就别用了。问题现象可能原因排查方法解决措施I2C 无响应上拉缺失/地址错示波器看波形补上拉、核对地址ADC 跳动干扰/基准不稳短接输入看底噪加滤波、用 VREFINT温度偏差参数错/电阻精度低对比标准温度计换参数、用 1% 电阻响应迟钝滤波过强看阶跃响应调大 α6. 实际部署中的经验与扩展思路这套方案我在几个模拟的 HVAC 控制场景里跑过整体稳定性不错。有一点体会比较深远程通道的线缆质量比想象中重要。同样一套电路用普通杜邦线跑一米和用屏蔽双绞线跑一米ADC 读数的噪声能差好几倍。如果设备要过电磁兼容测试线缆和滤波这块千万别省。另外STM32G431KB 的算力其实还有富余后面可以在这颗 MCU 上直接跑简单的 PID 控制把温度采集和阀门/风机控制合到一起省掉一颗控制器。PJ85718DM 的多地址特性也留了扩展空间本地要测多个点的话一条 I2C 挂几颗就行代码里改改地址列表。最后分享一个小技巧调试阶段可以在固件里加一个命令接口通过 UART 实时打印原始 ADC 值、换算后的阻值、滤波前后的温度这样排查问题比盲猜快得多。等产品定型了再把这个接口关掉或者加个密码保护。