ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于PJ85718DM与STM32F413RH的多点温度监测系统设计与实现

基于PJ85718DM与STM32F413RH的多点温度监测系统设计与实现 1. 项目背景与核心需求拆解温度监测这件事看起来简单真要做到本地准、远程稳、长期不飘里面的门道比想象中多得多。我这次做的项目核心就是用一颗PJ85718DM温度传感芯片配合STM32F413RH主控搭一套能同时覆盖本地显示和远程上报的温度监测系统目标场景是嵌入式设备机箱内部测温以及 HVAC暖通空调系统的风道、回水、室温多点采集。先说清楚这套东西是干什么的。PJ85718DM 是一颗数字温度传感器走的是标准 I2C 接口测温范围覆盖工业级常见的 -40℃ 到 125℃分辨率可以做到 0.0625℃ 这一档。STM32F413RH 是 ST 家 F4 系列里偏大内存、多外设的一颗带 1.5MB Flash、320KB RAMI2C、UART、CAN、USB 都齐全跑个多路温度采集加协议转换绰绰有余。两者组合起来本地用 OLED 或者段码屏显示当前温度远程通过串口或者总线把数据打包发出去整套方案成本可控、精度够用、开发周期短。为什么不用主控自带的内部温度传感器这是很多人第一个会问的问题。STM32 内部那个温度通道实测下来误差普遍在 ±1.5℃ 甚至更大而且受芯片自身发热影响严重测的是芯片温度而不是环境温度。你要做机箱测温主控一跑起来自身温升就有好几度内部传感器读出来的数根本不能代表真实环境。所以外挂一颗独立的数字温度传感器是这类应用的标配做法。那为什么选 PJ85718DM 而不是更常见的某几款老牌传感器我当时的考量有这么几点一是它的 I2C 地址可以通过引脚配置成多个不同值一条总线上挂 4 到 8 颗不冲突这对 HVAC 多点采集特别友好二是它的转换时间可配最快一档在毫秒级慢速档功耗低适合电池或者低功耗场景三是封装小SOT-23 或者 DFN 这类贴片封装布板省地方。当然具体选型还要看你的精度预算和供货情况我这里讲的是选型思路不是给某一颗芯片打广告。这套方案适合谁参考我觉得三类人最对口一是做工业控制、机柜监控的嵌入式工程师需要多点温度采集二是做 HVAC 控制板的开发者风机盘管、新风机组这类场景对温度采集的通道数和稳定性要求高三是刚接触 I2C 传感器、想找一个完整项目练手的朋友这个项目的复杂度刚好——不太简单也不至于劝退。2. 硬件设计与关键参数解析2.1 传感器外围电路怎么搭才稳PJ85718DM 的外围电路不复杂但有几个地方特别容易翻车。第一是I2C 上拉电阻。很多人随手抓两个 10kΩ 就焊上去了结果总线速率一拉高就通信失败。上拉电阻的取值跟总线电容、速率、供电电压都有关系。经验公式是Rp(max) ≈ tr / (0.8473 × Cb)其中 tr 是 I2C 规范允许的最大上升时间标准模式 1000ns快速模式 300nsCb 是总线总电容。假设你的总线电容是 100pF跑快速模式 400kHz那 Rp(max) ≈ 300ns / (0.8473 × 100pF) ≈ 3.5kΩ。所以 10kΩ 在 400kHz 下是偏大的容易导致上升沿太缓、通信不稳。我一般用2.2kΩ 到 4.7kΩ这个区间实测 400kHz 下 4.7kΩ 在短走线时够用走线长或者挂的设备多就降到 2.2kΩ。第二是电源去耦。传感器供电脚旁边一定要放一颗 0.1μF 的陶瓷电容紧贴引脚别放到板子另一头去。HVAC 场景里电机、继电器一堆电源噪声大去耦不到位读数就会跳。如果条件允许再并一颗 1μF 或者 10μF 的钽电容做低频滤波效果更明显。第三是地址引脚处理。PJ85718DM 的地址选择脚不能悬空必须明确拉到 VCC 或者 GND。悬空的话电平不确定可能出现这颗能通、那颗不通的玄学问题。我吃过这个亏当时一条总线上挂了 4 颗有两颗地址脚忘了处理调试了半天以为是芯片坏了其实是地址冲突。2.2 STM32F413RH 这边的资源分配STM32F413RH 外设多但分配的时候要有规划别想到哪用到哪。我这次的分法是外设用途说明I2C1接本地温度传感器100kHz 或 400kHz短距离板内通信I2C2接远程/多点传感器可加总线缓冲走线较长USART2远程数据上报接上位机或无线模块TIM6定时触发采集周期性中断比如每 500ms 采一次GPIO本地显示、指示灯OLED 的 I2C 或 SPI 另算这里有个细节I2C1 和 I2C2 分开用是为了把本地和远程两条链路物理隔离。本地传感器就在板子上走线短、干扰小远程那一路可能要走排线到几米外干扰大、容易出问题。分开之后即使远程那路被干扰挂了本地显示还能正常工作系统不至于全瘫。这个设计思路在工业场景里很重要——故障隔离。时钟配置上F413 跑 100MHz 主频很轻松I2C 时钟源从 APB1 分频过来。注意 I2C 的时序寄存器TIMINGR要按实际时钟频率算别直接抄别人的值。STM32CubeMX 可以自动算但你要知道它算的是什么。以 100MHz 的 PCLK、400kHz 的 I2C 为例TIMINGR 里的 PRESC、SCLDEL、SDADEL、SCLH、SCLL 这几个字段决定了实际的时序CubeMX 给的值一般能用但如果你的总线电容偏大可能要手动把 SCLDEL 调大一点给数据建立留更多时间。2.3 本地与远程的链路设计取舍本地和远程这两个词在这个项目里有两层含义得说清楚。第一层是物理位置本地指传感器和主控在同一块板子或者同一个机箱内远程指传感器通过线缆延伸到较远的地方比如 HVAC 的风道里、另一个房间。第二层是数据流向本地显示指温度数据在设备本地的屏幕上呈现远程上报指数据通过通信接口发给上位机、网关或者云平台。这两层要分开设计。物理位置上远程传感器要考虑线缆压降、分布电容、电磁干扰所以 I2C 直接拉几米是不现实的——I2C 设计初衷就是板内短距离通信。我的做法是远程那一路要么用差分总线比如 RS485 加一颗带总线接口的传感器要么在远端放一颗小 MCU 做本地采集再通过串口回传。如果非要用 I2C 拉远加 I2C 总线缓冲器比如 P82B96 这类可以延长到十几米但成本和复杂度都上去了。数据流向上本地显示和远程上报可以并行互不阻塞。我用 TIM6 定时中断触发采集采完之后把数据丢进一个环形缓冲区主循环里分别处理显示刷新和上报打包。这样即使上报那一路因为网络问题卡住了显示也不会跟着卡。3. 软件架构与采集逻辑实现3.1 传感器驱动怎么写才靠谱写 I2C 传感器驱动新手最容易犯的错是读一次就完事没有超时、没有重试、没有错误处理。工业环境里 I2C 通信偶尔抽风是常态驱动必须皮实。我的驱动结构是这样的底层是 I2C 读写函数带超时中间是传感器寄存器读写上层是温度读取和转换。关键点在于超时和重试。HAL 库的HAL_I2C_Master_Transmit有个 Timeout 参数别填HAL_MAX_DELAY那等于死等。我一般填 10ms 到 50ms超时就返回错误上层重试 2 到 3 次还不行就标记这颗传感器故障。温度读取的流程是先写配置寄存器启动一次转换如果是单次转换模式等转换完成再读温度寄存器。PJ85718DM 的温度寄存器一般是 16 位高 12 位有效低 4 位是标志位或者保留位。转换公式大致是// 假设读到 raw 是 16 位原始值 int16_t temp_raw (int16_t)(raw 4); // 取高 12 位 float temperature temp_raw * 0.0625f; // 分辨率 0.0625℃注意这里有个符号扩展的坑。如果温度是负的原始值是补码形式直接右移再乘系数可能出错。正确做法是先做符号扩展再转换。我见过有人测零下温度时读数变成正的一大截就是符号位没处理好。3.2 定时采集与数据滤波温度是个慢变量不需要采太快。我设的采集周期是 500ms这个节奏对 HVAC 和机箱测温都够用。采太快没意义还增加总线负载和功耗采太慢又跟不上温度变化。采集回来的数据要不要滤波要但要看场景。如果只是显示个大概原始值就够如果要上报做趋势分析建议做滑动平均或者中值滤波。我用的是8 点滑动平均实现简单对随机噪声抑制效果好。但要注意滑动平均会引入滞后如果温度变化很快比如你拿热风枪吹读数会跟不上。HVAC 场景温度变化慢滞后无所谓如果是快速测温场景就得换中值滤波或者卡尔曼滤波。#define FILTER_LEN 8 static float temp_buf[FILTER_LEN]; static uint8_t buf_idx 0; float filter_temp(float new_temp) { temp_buf[buf_idx] new_temp; buf_idx (buf_idx 1) % FILTER_LEN; float sum 0; for (int i 0; i FILTER_LEN; i) { sum temp_buf[i]; } return sum / FILTER_LEN; }这段代码简单但有个初始化问题刚上电时缓冲区里全是 0前几次滤波结果会偏低。解决办法是上电后先连续采 8 次填满缓冲区再开始正常输出。这个细节不注意开机头几秒显示的温度会莫名其妙偏低。3.3 本地显示与远程上报的并行处理本地显示我用的是 0.96 寸 OLEDI2C 接口128x64 分辨率。显示内容就三行当前温度、最高温度、最低温度。刷新率不用太高2Hz 就够了刷太快人眼也看不出区别还费 CPU。远程上报走 USART2波特率 115200数据格式我定的是简单的文本协议比如TEMP,25.31,24.87,26.02\n三个数分别是当前、最低、最高。为什么用文本而不是二进制调试方便。你拿个串口助手就能看不用写解析工具。等产品定型了再考虑换成二进制省带宽。这里的关键是非阻塞。上报不能阻塞主循环否则显示会卡。我的做法是把要发的数据放进发送缓冲区用 DMA 或者中断发送主循环只管往缓冲区里塞数据。如果发送缓冲区满了就丢弃最旧的数据或者直接跳过这次上报绝不等待。这个思路在嵌入式里叫生产者-消费者模型很常用。4. 常见问题与排查实录4.1 I2C 通信失败排查表I2C 不通是这类项目最高频的问题我整理了一张排查表按顺序查基本都能定位现象可能原因排查方法完全无应答供电没上、地址错、上拉缺失万用表量 VCC示波器看 SDA/SCL 有没有上拉偶尔应答偶尔不应答上拉电阻偏大、总线电容大减小上拉电阻缩短走线读到的全是 0xFF地址错、器件没启动用 I2C 扫描程序扫地址读到的全是 0x00时序不对、时钟太快降速到 100kHz 试数据偶尔跳变电源噪声、去耦不足加去耦电容远离干扰源我踩过最坑的一次是板子焊好之后 I2C 死活不通查了半天发现是传感器底部的散热焊盘没接地。有些封装的散热焊盘同时也是电气地不焊的话芯片根本不工作。这个在数据手册里会写但很容易被忽略。4.2 温度读数不准的几种情况读数不准先别急着怀疑芯片按这个顺序查第一自发热。传感器本身功耗虽然低但如果周围有发热元件稳压器、功率管读数会偏高。解决办法是把传感器远离热源或者做温度补偿。第二热传导。传感器贴在 PCB 上PCB 的温度会影响读数。如果测的是空气温度最好让传感器和 PCB 之间有一点热隔离或者用开槽的方式减少热传导。第三参考电压/供电波动。虽然数字传感器对供电不那么敏感但供电波动大也会影响内部参考。确保供电稳定。第四转换时间不够。如果配置成快速转换模式但实际转换还没完成就去读读到的可能是上一次的值或者无效值。查数据手册确认转换时间留足余量。4.3 远程链路干扰的应对远程那一路如果走线长干扰是免不了的。我遇到过的情况是电机一启动远程温度就跳好几度。解决办法有这么几个双绞线信号线和地线绞在一起抑制共模干扰。屏蔽线外层屏蔽层单端接地别两端都接否则形成地环路反而更糟。磁环在电缆靠近板子的一端套个铁氧体磁环对高频干扰有效。软件滤波前面说的滑动平均对脉冲干扰有一定抑制作用但不如硬件措施根本。隔离如果干扰特别严重用数字隔离器把远程那一路隔开成本高但效果最好。我个人的经验是先上双绞线加磁环八成问题能解决剩下的再考虑隔离。5. 实操心得与扩展思路5.1 几个让我少走弯路的习惯做这类项目我养成了几个习惯分享出来。第一个是先点灯再通信。板子焊好先写个最简单的程序让 LED 闪起来确认主控最小系统正常。然后再调 I2C先扫描地址确认能扫到设备再读寄存器。一步步来别一上来就写完整功能出了问题都不知道是哪一层。第二个是留调试串口。不管最终产品用不用串口调试阶段一定要留一路 UART 打 log。温度值、错误码、状态机状态都打出来。很多时候问题看一眼 log 就明白了比拿示波器猜快得多。第三个是参数可配。采集周期、滤波长度、上报间隔这些参数别写死在代码里做成宏定义或者放到配置结构体里。调试的时候改一个数重新编译就行不用满代码找。5.2 这套方案还能怎么扩展温度监测做完了往哪扩几个方向一是加湿度。HVAC 场景湿度同样重要加一颗湿度传感器I2C 总线还能共用软件上多一个采集任务而已。二是加本地存储。F413 的 Flash 大可以划一块出来做数据记录断网的时候数据不丢恢复后补传。这个在远程监测里很实用。三是加告警逻辑。温度超过阈值就触发继电器或者上报告警这是从监测到控制的关键一步。阈值可以做迟滞避免在临界点反复触发。四是换通信方式。串口只是其中一种需要组网就上 CAN需要无线上报就加个无线模块F413 的外设资源足够支撑这些扩展。五是做低功耗。如果是电池供电的场景把采集周期拉长传感器用单次转换模式主控在两次采集之间进 STOP 模式功耗能降一个数量级。这个改动不大但效果明显。5.3 关于精度和成本的一点个人看法最后聊点实在的。很多人一上来就追求高精度非要 0.1℃ 甚至更高。但你要想清楚你的应用真的需要那么准吗HVAC 控制里室温控制精度到 0.5℃ 就足够了再高是浪费。机箱测温更是如此你关心的是有没有过热不是精确到小数点后两位。精度每提高一档成本、校准工作量、电路复杂度都往上走。我的建议是先明确需求精度再选器件别反过来。PJ85718DM 这类 0.0625℃ 分辨率的传感器实际精度受自发热、热传导、校准影响标称精度和实际精度是两回事。与其纠结芯片标称值不如把电路布局、热设计、软件滤波这些做好对最终精度的贡献更大。这套 PJ85718DM 加 STM32F413RH 的组合我实际跑下来本地显示稳定远程上报可靠连续运行几周没有出现死机或者数据异常。中间踩的坑主要集中在 I2C 上拉和远程干扰这两块解决之后就很省心了。如果你也在做类似的多点温度监测希望这些经验能帮你少走点弯路。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进