STM32与PJ85718DM的嵌入式温度采集远程监控系统设计

发布时间:2026/10/22 1:07:15

STM32与PJ85718DM的嵌入式温度采集远程监控系统设计 1. 项目概述与选型思路1.1 这个项目到底在解决什么问题做嵌入式和 HVAC供暖、通风与空调相关开发的朋友应该都有过这种体验系统里几十个测温点本地调试还算顺利一旦设备部署到现场你想远程看一眼温度趋势要么得单独拉一根线要么得凑合着用现成网关把数据透传回来麻烦得很。我之前接过一个商用空调控制器的项目客户要求柜机回风温度、出风温度、室外机盘管温度都要实时监控还要求能在中控室远程查看。当时费了不少劲才把链路调通所以一看到 PJ85718DM 和 STM32F423RH 这对组合我就觉得这是个值得展开讲讲的方案——它用一颗芯片把本地温度采集和远程数据回传的活儿全干了省掉了独立的通信模块也省掉了不少外围电路。PJ85718DM 是一颗温湿度传感器走的是 I2C 接口量程和精度在常规 HVAC 场景里完全够用STM32F423RH 则是带有丰富通信外设的 MCU主频不算高但胜在集成度高尤其是它内置了以太网 MAC 和多种低功耗模式配合 PJ85718DM 的低功耗特性非常适合做需要长期在线、又不方便频繁换电池或者拉电的设备。这个组合的典型应用场景包括机房空调的回风温度和送风温度监测恒温恒湿箱的环境温度记录嵌入式设备内部 PCB 板温监测需要远程查看温度趋势的 HVAC 配套控制器1.2 两片芯片的分工与配合逻辑先说清楚分工PJ85718DM 负责把物理世界的温度变成数字信号STM32F423RH 负责把数字信号变成可读、可传、可分析的数据。听起来像是废话但实际工程里恰恰是这种“各管一摊”的边界划分最容易模糊。比如有人会把温湿度采集和网络传输都堆在 MCU 里跑结果 I2C 总线上的时序被中断频繁打断采出来的温度数据偶尔跳变查半天查不出原因。PJ85718DM 这颗传感器我测过它的 I2C 地址是 0x387 位地址支持单次转换和连续转换两种模式。单次转换模式下你发一条命令让它测一次它测完把结果放在寄存器里然后进入空闲状态功耗很低。连续转换模式下它会按照设定好的速率自己测自己更新MCU 只管去读就行。对于 HVAC 这种需要周期性采样、又不想让 MCU 频繁打断的场景连续模式更省事对于电池供电的便携设备单次模式更合适。STM32F423RH 这边它的角色更像一个“数据管家”。它通过 I2C 读取传感器数据做滤波、校准、单位换算然后把数据按协议打包根据你的实际需求走以太网、串口或者无线模块把数据发出去。选择这颗 MCU 的一个现实原因是它内置了以太网 MAC 控制器配合外部 PHY 芯片就能直接接入局域网不需要外挂一颗单独的协议转换芯片。如果你做的设备要接入楼宇自控系统这个特性几乎是刚需。提示如果你手头已经有 STM32F103 之类的库存也能做类似的事但 F423 的优势在于功耗控制和通信外设的集成度。如果项目对功耗不敏感、对成本敏感用老一代 MCU 完全可行不必盲目追新。2. 硬件设计的核心细节与避坑指南2.1 传感器接口电路与上拉电阻的选择PJ85718DM 是标准 I2C 器件硬件上需要注意的点其实不多但恰恰是这些“不多”的地方最容易翻车。首先是上拉电阻。I2C 总线的 SDA 和 SCL 必须有上拉电阻这个大家都知道但阻值选多少很多人是照着网上的例程抄抄完就发现通信不稳定。我常用的做法是先把原理图定下来预留 4.7kΩ 的贴片电阻位然后根据实际总线上的电容和通信速率决定要不要调整。I2C 标准模式100kHz下总线上拉电阻通常在 2.2kΩ 到 10kΩ 之间都能工作但如果你把 PJ85718DM 和 MCU 之间的连线拉得比较长比如超过 30cm寄生电容会变大这时候要适当减小上拉电阻比如改成 2.2kΩ。如果你用的是快速模式400kHz上拉电阻也不要太大否则上升沿变缓时序容易出错。这里有一个常见的误区有些人为了省电把上拉电阻选得很大比如 100kΩ然后发现 I2C 偶尔读不到数据。原因就是上拉电阻过大加上总线电容RC 时间常数太大上升沿不够陡峭。反过来如果上拉电阻太小比如 1kΩ总线电流会偏大功耗升高在某些低功耗设计里也会出问题。除了上拉电阻建议在 PJ85718DM 的供电引脚旁边放一个 100nF 的陶瓷电容靠近芯片放置负责本地去耦。如果传感器离 MCU 的电源输出较远最好再加一个 10uF 的钽电容或者大容量 MLCC 做低频滤波。这个电容不是为了好看是真的能减少温度数据跳变的概率。我遇到过一次温度读数在 25°C 和 27°C 之间反复横跳的情况最后排查发现就是传感器供电电压纹波太大加了电容后立刻好了。2.2 MCU 晶振、复位与电源去耦的工程经验STM32F423RH 的硬件设计核心是晶振和电源。F423 支持内部高速 RC 振荡器HSI精度大概在 ±1% 左右对于绝大多数温度采集和上报场景够用了。但如果你要接以太网外部 PHY 芯片需要一个精确的 25MHz 参考时钟这个时钟通常由 MCU 的 MCO 引脚输出或者由外部晶振提供。我建议直接用外部 25MHz 晶振接到 PHY 上MCU 侧用 HSI 或者外部 8MHz 晶振都行这样两边互不干扰调试起来更舒服。复位电路方面STM32 的 NRST 引脚内部已经有上拉和滤波外部只需要接一个 100nF 电容到地就能保证可靠的复位。很多人习惯加一个手动复位按键这在调试阶段很有用量产时反而有可能成为故障源比如按键误触导致设备重启。我的做法是开发板上保留复位按键量产板上不焊。电源去耦是另一个容易被忽视的点。F423 的 VDD 引脚要放 100nF 电容每个电源引脚一个放在引脚旁边。同时在 PCB 的电源入口处放一个 10uF 或 22uF 的电容做储能。如果你在 HVAC 设备里做这个项目注意一个实际问题设备里可能有压缩机、风机这类大功率负载它们启停时会对电源产生比较大的冲击。建议给 MCU 的供电加一个 LC 滤波或者 π 型滤波否则温度数据可能随着压缩机启动而周期性跳变。注意如果你的 HVAC 设备有变频器或者开关电源布局时尽量让 PJ85718DM 和它的走线远离这些干扰源。实测下来传感器和 I2C 走线如果贴着开关电源的散热片走温度读数会明显异常。2.3 板级布局与走线要点这个项目涉及的信号基本都是低速信号布局上不需要像高速电路那样讲究阻抗匹配但有几个原则值得遵守传感器尽量靠近被测对象减少热传导路径上的误差。比如测回风温度传感器应该放在回风口附近而不是放在主控板上I2C 走线尽量短SDA 和 SCL 不要分得太开减少环路面积降低被干扰的概率MCU 的以太网差分信号线如果有的话要平行走线并且包地处理电源走线要粗至少在 MCU 供电段保证 1mm 以上的线宽减小压降我做过一块样板把 PJ85718DM 放在了 PCB 的角落结果发现它读出来的温度比实际环境温度高了两三度。原因很简单那颗传感器旁边就是一颗 LDOLDO 的功耗发热把局部温度抬高了。后来我把传感器挪到板边并用覆铜区做了一圈隔热隔离问题就解决了。这个细节在空调控制器这种设备里尤其重要——设备本身就在发热传感器如果贴在板子上读出来的温度永远会比环境温度偏高。3. 软件架构与驱动实现3.1 驱动层I2C 通信的稳定性设计软件部分我习惯把代码分成三层驱动层、应用层、协议层。驱动层负责和 PJ85718DM 直接打交道应用层负责滤波校准和策略判断协议层负责把数据打包成 Modbus、HTTP、MQTT 等格式发出去。这样分层的好处是以后更换传感器型号或者通信协议只需要改对应的一层其他代码基本不用动。I2C 驱动这里有几个坑要提前讲。第一个是通信失败的处理。I2C 总线在长线或者干扰环境下偶尔会出现 NACK 或者总线卡死的情况。很多人的代码里读传感器就一条函数调用失败也不管结果就是系统运行几天后温度数据变成 0 或者停在某个值不再更新。建议每次 I2C 通信都检查返回值失败时做重试重试仍失败就做总线恢复操作把 SCL 切换成 GPIO 模式手动产生 9 个时钟脉冲释放 SDA然后重新初始化。第二个坑是传感器转换时间的把握。PJ85718DM 单次转换模式下发完触发命令之后需要等一段时间再读结果这段时间取决于分辨率设置。如果你在转换还没完成的时候去读读回来的可能是上一次的数据或者是无效数据。我的做法是在代码里定义一个等待时间宏根据实际测试调整宁可多等几毫秒也不要读到脏数据。第三个坑是温度数据的字节序和精度处理。PJ85718DM 的温湿度数据通常是以 16 位或者 20 位的形式存放在寄存器里不同厂商的芯片定义不同。拿到数据后一定要先读 datasheet搞清楚哪一位是符号位、哪一位是小数位否则你算出来的温度可能差了好几十度。我在这个项目里就吃过亏一开始把符号位当成数据位处理结果负温度区域全部读成巨大的正数。3.2 应用层滤波与校准的工程方法传感器读回来的原始数据通常不能直接用尤其是环境温度变化平缓但读数却有微小波动的时候。我常用的滤波方法有三种根据场景选择滑动平均滤波取最近 N 次采样的平均值N 一般取 8 到 16。这个方法简单有效适合温度变化不快的场景。缺点是会有滞后如果被测温度快速变化读数会慢半拍一阶低通滤波使用算式 out out_old alpha * (new_sample - out_old)alpha 一般取 0.1 到 0.3。这个方法计算开销小响应速度比滑动平均稍微快一点中值滤波取最近 3 到 5 次采样的中间值。这个方法对脉冲干扰特别有效适合有电磁干扰的工业环境实际项目里我会先用中值滤波去掉明显的毛刺再做一次滑动平均平滑曲线。如果你要拿数据去做控制闭环还要考虑滤波带来的相位延迟别让温度环路的反馈信号滞后太多。校准方面PJ85718DM 出厂时虽然做过校准但嵌入到设备里之后系统误差通常主要来自电路发热和环境热阻。建议在设备调试阶段做一次两点校准用一个标准温度计和你的设备同时测量两个不同温度点比如 15°C 和 35°C然后计算偏移量和增益误差把修正系数写进 Flash。这样能让系统的整体精度从传感器的标称精度再提升一截。// 温度校准示例两点校准保存 offset 和 gain float temperature_apply_calibration(float raw_temp, float cal_offset, float cal_gain) { return raw_temp * cal_gain cal_offset; }3.3 协议层本地显示与远程上报的组合策略本地和远程的温度数据怎么呈现是这个项目里比较有意思的部分。本地方面我建议利用 STM32F423RH 的 UART 接口接一块串口屏或者简单的 OLED 显示屏实时显示当前温度和状态。如果你用的是 Modbus RTU把温度数据映射到保持寄存器里现场的中控系统就可以直接读到不需要额外开发上位机。远程方面有两条路线一条是走以太网一条是走无线模块。以太网的实现相对繁琐需要处理 TCP/IP 协议栈如果你不想在 MCU 里跑完整协议栈可以选用集成协议栈的 W5500 等芯片或者用 F423 内置的 MAC 搭配精简 IP 协议栈。另一条路是外接 WiFi 或者 LoRa 模块MCU 只负责把数据通过 UART 发给模块模块负责网络连接。这个方案开发量小但会增加硬件成本和功耗。我给这个项目选的方案是本地走 Modbus RTU远程走以太网上报 MQTT 数据到自建的中控平台。这样既满足了现场调试的需求又满足了远程监控的需求。如果你的现场已经有成熟的楼宇自控系统Modbus RTU 的兼容性是最好的如果没有用 MQTT 自建数据后台也很方便。4. 核心功能实现与参数计算4.1 温度采集的时序设计与寄存器配置PJ85718DM 的上电时序有一定要求VDD 稳定后至少等待 10ms 再开始 I2C 通信。如果你在代码里上电后立刻去初始化传感器有概率拿到一个错误的状态。我习惯在系统启动代码里加一个延时。寄存器配置方面我需要说明一下不同批次、不同厂商的同类传感器寄存器地址可能略有差异这里给出我的通用配置流程具体数值请以你手头芯片的数据手册为准。首先通过 I2C 写入配置寄存器使能温度测量并选择分辨率。然后读取状态寄存器确认转换完成标志位。最后连续读取温度数据的两个或三个字节拼接成完整的温度值。需要注意有些传感器在读取数据后会自动清除标志位有些则需要手动清除这个要提前确认清楚。温度换算的公式一般是温度值 原始数据 / 分辨率系数。举一个例子如果 20 位温度数据为 0x1A2B3C符号位为 0正温度分辨率系数为 1000那么实际温度就是 0x1A2B3C / 1000.0 171.612°C。注意我这里只是演示计算过程不同芯片的分辨率系数不同务必以数据手册为准。4.2 采样周期与数据上报周期的策略选择采样周期和上报周期的设置直接关系到数据实时性和系统负载。在 HVAC 场景里我的建议是场景采样周期上报周期说明机房空调回风温度1s10s回风温度变化慢10s 上报足够出风温度监测500ms5s出风温度受压缩机启停影响需要稍快的采样远程温度趋势分析10s60s趋势分析不追求实时性降低上报频率可省流量电池供电的便携设备60s300s低功耗模式尽量减少唤醒次数采样周期短了MCU 的功耗和总线负载会升高上报周期短了网络流量和服务器压力也会升高。实际项目里我会把采样周期和上报周期做成可以配置的参数方便现场调试人员调整而不是写死在代码里。如果你要在低功耗模式下工作建议使用 PJ85718DM 的单次转换模式MCU 定时醒来发启动命令然后进入睡眠等待转换完成后醒来读数据再接着睡。这样可以大幅降低平均功耗。STM32F423RH 的 STOP 模式配合 RTC 唤醒实测平均电流能做到很小的值加上传感器本身低功耗电池供电的设备可以工作很长时间。4.3 通信链路的实际搭建过程我在搭建这套系统的远程链路时经历了一个比较典型的调试过程。刚开始我直接用 STM32 的以太网 MAC 搭配外部 PHY用精简的 TCP/IP 协议栈跑 MQTT 上报数据。第一天就能连上数据也能传回来但跑了一晚上之后发现第二天早上数据突然不更新了。排查了很久发现是协议栈的 keepalive 机制没有处理好服务端把久未通信的连接断开了而设备端不知道一直尝试往断开连接上写数据。解决方法是应用层自己做心跳检测每 30 秒检查一次连接状态如果发现连接断开就重新建立连接。另外MQTT 本身有 keepalive 机制但有些嵌入式客户端实现得不完善不能完全依赖它。如果你走的是 Modbus RTU也要注意一个问题有些上位机或者触摸屏软件在设备没有响应时会频繁重试导致总线冲突。Modbus 是半双工协议如果设备端数据还没发完上位机又发了新请求就会产生碰撞。解决办法是在设备端做好串口数据的完整性判断并且给串口发送操作加一个互斥锁避免接收中断和发送代码同时操作发送寄存器。5. 常见问题排查与工程实录5.1 温度读数异常跳变的排查思路这个项目里最常见的故障就是温度读数跳变跳变幅度有时甚至超过 10°C。我总结了一套排查思路按顺序执行基本能定位问题。第一步先排除传感器自身问题。用示波器看 I2C 总线的波形确认通信时序是否正常。如果波形上有毛刺或者电平不达标先解决硬件问题。第二步检查供电。用万用表测传感器供电引脚的电压在正常工作状态下电压纹波应该很小。如果纹波大加滤波电容。第三步检查 PCB 布局。传感器附近有没有发热元件走线有没有经过干扰源。第四步检查软件滤波是否失效。如果代码里滤波窗口太小毛刺没有被滤掉也会表现为数据跳变。我遇到过一例特别隐蔽的问题温度数据每 5 分钟跳变一次跳变幅度不算大约 0.5°C。排查了很久最后发现是 RTC 中断和 I2C 通信在时间上偶发重叠RTC 中断打断了 I2C 通信导致读取了半截数据。解决办法是在 I2C 读取流程中使用临界区保护禁止中断干扰。这个案例说明即使硬件设计没问题软件里的中断优先级配置也可能导致莫名其妙的故障。5.2 远程上报链路不稳定的常见原因远程链路的问题我统计了一下大约 80% 出在网络连接层面而不是数据采集层面。最常见的原因是 DHCP 获取地址失败。设备在断电重启后如果 DHCP 服务器响应慢设备可能超时获取不到 IP然后整个上报流程就卡住了。解决办法是设备启动后先尝试 DHCP如果超时改用静态 IP。这样能保证在大多数环境下设备都能连接网络。其次是断线重连机制不完善。TCP 连接被服务端断开后设备如果一直不检测到异常就会一直处于“假在线”状态。这个问题前面说了用应用层心跳检测能解决。还有一个容易忽略的问题是时区。如果你用 MQTT 上报数据服务端记录的是 UTC 时间而你希望看到本地时间就需要在设备端上报时把时区信息告诉服务端或者在服务端配置时区转换。这个虽然不影响数据正确性但前期没想到的话后面看数据时间线会非常别扭。5.3 项目踩坑总结五条工程经验这个项目做下来有几条经验我觉得值得单独拎出来硬件设计阶段就要考虑传感器的热隔离而不是等测试出现问题再改板。传感器离发热源太近是嵌入式测温项目里最隐蔽、最常见的误差来源I2C 驱动一定要做错误恢复不要抱着侥幸心理。连续运行的系统里I2C 被干扰一次如果不恢复数据就永远不更新了远程通信一定要设计心跳和断线重连哪怕协议栈本身支持 keepalive也要在应用层做兜底温度校准不能只做一次。设备生产组装后由于批次差异每台设备的零点漂移可能不同建议产线上做一次快速校准滤波参数不要拍脑袋定记录下不同参数下的响应曲线用数据说话最后再说一个小技巧调试阶段把温度数据和通信状态通过串口打出来配合一个简单的上位机工具做实时曲线显示能极大提升调试效率。我习惯在代码里预留一个调试接口随时可以查看传感器的原始寄存器值、可校准之后的温度值以及最后一次上报的状态码。这个习惯在很多项目里都帮了大忙尤其是在现场还没调试好的时候通过串口把日志拉出来基本能定位绝大多数问题。
延伸阅读

更多相关文章

2026/10/22 1:07:15

PJ85718DM+PIC18F46K20工业温控设计:高精度、低功耗、抗干扰

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 1:02:13

PJ85718DM与PIC18F86J50的嵌入式温度采集方案:从硬件到固件实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 2:07:20

移动电源新国标来了,聊聊GB47372-2026软件升级要点 i

简介书接上文,“移动电源新国标GB47372-2026做了哪些升级?”我们对新国标做了一下解读。本篇主要是针对新国标“6.5 充放电温度控制”、“6.8 智能管理”、“6.9 电压调节”、“6.1 0 异常禁用”等软件相关部分做一下详细的讲解。针对新国标新增的这些功…

2026/10/22 2:07:20

WSL使用Ubuntu 24.04安装Libradtran

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 2:07:20

G-Helper 四种 GPU 模式到底怎么选?

G-Helper 四种 GPU 模式到底怎么选? 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Expertbook, ROG All…

2026/10/22 2:07:20

FGO-py 实战指南:免配置图像识别,三步连上设备自动刷体力

FGO-py 实战指南:免配置图像识别,三步连上设备自动刷体力 【免费下载链接】FGO-py 自动爬塔! 自动每周任务! 全自动免配置跨平台的Fate/Grand Order助手.启动脚本,上床睡觉,养肝护发,满加成圣诞了解一下? 项目地址: https://gitcode.com/GitHub_Trend…

2026/10/22 2:07:20

TensorData::ShareFrom 接口详解:两个对象如何共享同一块内存

TensorData::ShareFrom 接口详解:两个对象如何共享同一块内存 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints TensorData 是 GE 接口中描述一块张量内存的对象&…

2026/10/22 2:02:19

前端转后端入门实践日志1-配置环境

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 4:53:08

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/22 0:01:49

电商智能运营体系从0到1:架构设计、落地步骤与避坑指南

前两年我们团队接了一个电商平台的运营中台项目,目标很直白:把过去靠运营拍脑袋做的选品、定价、发券、推活动这些事,逐步用数据算法和自动化流程代替。项目名字内部就叫“电商智能运营体系”。最近有不少朋友问我当时是怎么设计的、踩过哪些…

2026/10/22 0:01:49

若依框架AI代码生成不稳定?用Agent Skill三层结构+五步法搞定

最近一段时间,我一直想把后台管理系统里那些机械重复的增删改查代码交给AI去写。框架用的是若依,按理说这类业务代码模式非常固定,应该是AI最擅长的事情。可真试下来却不是那么回事——你让AI生成一个用户管理模块,它给出的Contro…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑