很多做嵌入式温度采集和HVAC控制的朋友,第一版方案往往只盯着单片机和传感器本身,等设备装到现场才发现,本地读数倒是挺准,可人在中控室、运维机房或者手机App上看不到数据,还得派个人拿万用表去量。这其实就是典型的“测得到、传不走”问题。我最近基于PJ85718DM数字温度传感器和R7FA6M3AH3CFC主控搭建了一套同时支持本地实时显示和远程上云的嵌入式温度监测方案,主要用在HVAC暖通设备和工业控制柜这类场景里。今天把整个项目的关键设计、踩坑记录和调试经验完整拆一遍。
这套方案核心解决三件事:第一,PJ85718DM用I2C接口做多点、高精度的本地温度采集,数据稳定、抗干扰;第二,R7FA6M3AH3CFC作为主控,把采集结果通过串口屏和LED数码管做本地显示,同时本地存储最近24小时温度记录;第三,通过主控自带的以太网MAC外接PHY芯片,走TCP/MQTT协议把数据推送到远端服务器或云平台,实现远程监控。整套系统从底层采集到上层应用都打通了,适合直接用在自己产品预研、实验室温控验证或者HVAC控制器的二次开发上。
1. 为什么选了这两颗芯片:一个管精度,一个管联网
先说选型逻辑。HVAC应用里的温度监测和普通消费电子产品不太一样,它对传感器的长期稳定性、抗环境干扰能力和通信接口要求比较高。PJ85718DM是一颗数字输出的温度传感器,内部集成了ADC、基准电压和校准逻辑,直接输出数字量,不需要额外搭调理电路,这样从源头就规避了模拟信号线长距离传输容易引入的干扰和漂移问题。
这颗传感器的测温范围大概能做到-40℃到+125℃,在0到70℃范围内误差能控制在±0.3℃以内,这个精度等级对于回风温度、送风温度、机房环境温度这类HVAC场景足够用了,甚至比很多NTC热敏电阻加运放调理的方案精度高一个数量级。更重要的是它支持I2C接口,一条总线上可以并接多个传感器,做多点布点非常方便。实际项目里我在一条I2C总线上挂了4颗PJ85718DM,分别放在回风口、送风口、冷凝器进出管和机柜内部,主控定时轮询一次,全部读完只需要十几毫秒。
R7FA6M3AH3CFC这颗主控选它不是因为算力,而是看中了它自带以太网MAC、大容量Flash和丰富的定时器资源。HVAC设备控制柜里往往同时有好几路I2C设备、PWM风机控制、继电器开关量、串口屏,主控外设资源不够的话,板子会做得非常痛苦。R7FA6M3AH3CFC内置了CAN、USB、多路UART、I2C和以太网MAC,基本上一颗芯片把HVAC控制器要用的接口全包圆了。另外,Cortex-M33内核带TrustZone和安全特性,后续要做设备认证、固件加密、OTA升级都有硬件基础,远程运维安全性能上一个台阶。
还有一个关键因素:联网能力。很多温度采集模块要么只做本地显示不带网络,要么用WiFi模块,但HVAC现场控制柜很多是屏蔽金属机箱,WiFi信号进去先衰减一半,抗干扰能力也差。R7FA6M3AH3CFC自带以太网MAC,外接一个RMII接口的PHY芯片(我用的是LAN8720A),就能走有线网络,一根网线直接进企业内网或PLC控制网段,稳定性比无线方案强得多。对机房环境、HVAC集中控制这类场景,有线网络是刚需。
组合起来看,PJ85718DM负责把温度量化成可靠数据,R7FA6M3AH3CFC负责把数据消化、显示、送出去。两颗芯片通过I2C和中断引脚连接,整个硬件链路非常简洁,不需要外挂ADC、运放、电平转换芯片,这给PCB布线和整机可靠性都留出了很大余量。
2. 硬件连接方案:I2C多点布置与电源处理细节
2.1 PJ85718DM与主控的接线方式
PJ85718DM支持I2C通信,标准模式100kHz,也可以跑400kHz快速模式。实际调的时候我发现400kHz模式下总线时序需要仔细调上拉电阻,否则距离稍长波形沿就变缓,建议先用100kHz把功能跑通,再根据实际总线长度优化速率。传感器地址由AD0引脚电平决定,我这边4个传感器地址分别设置为0x48、0x49、0x4A和0x4B,这样MCU轮询时通过地址区分传感器位置,不需要额外增加片选引脚。
接线注意事项:
- SDA和SCL都需要接上拉电阻,我用了4.7kΩ上拉到3.3V。总线上4个传感器加上主控自身,I2C总线上拉的阻值需要适当减小,我实测发现3.3kΩ在400kHz下波形更稳,但功耗略有增加。
- PJ85718DM的VDD接3.3V,主控的IO引脚也是3.3V电平,不需要电平转换,直接怼上就能通信。
- ALERT引脚接主控的一个外部中断输入,传感器温度超过设定报警阈值时主动拉低,主控可以立刻响应,不用一直轮询。HVAC场景里这个引脚我用在超温保护上,回风温度超过设置值直接触发报警。
2.2 电源和地线的处理
温度监测系统的电源看似简单,其实容易踩坑。HVAC控制柜里风机启停、压缩机启动瞬间电流很大,电源母线会出现明显的电压跌落和毛刺。PJ85718DM内部虽然有ADC基准和稳压,但如果电源纹波太大,采样结果还是会跳动。
我的做法是传感器供电单独做了一路LC滤波,磁珠加10μF和0.1μF电容组合,把数字电路与功率部分的电源隔离开。主控R7FA6M3AH3CFC的AVCC和VCC分别供电,模拟部分单独加了一个LDO,避免数字IO翻转噪声串到模拟基准上。地线方面,PCB采用单点接地或者大面积铺地,传感器地线不要和风机驱动地线共用同一段走线,防止大电流在地线上产生压降影响I2C信号电平判断。
2.3 远程通信接口的硬件细节
以太网接口用了RMII模式连接LAN8720A PHY,主控的MAC通过RMII接口向外输出,50MHz参考时钟由主控产生。R7FA6M3AH3CFC的RMII接口需要50MHz时钟,我用的是有源晶振方案,MCU的REF50CK输出50MHz给PHY,这样保证两边时钟同源,避免时钟偏差带来的数据错包。
RJ45接口加内置网络变压器,选用带POE供电能力的型号,后面如果设备需要在现场取电可以省一路电源线。网口和主控之间要加TVS保护管,HVAC现场经常有感应雷和电机启动浪涌,不做保护的话PHY容易烧。
3. 本地温度采集固件:驱动、校准与多点轮询策略
3.1 I2C驱动时序与寄存器配置
PJ85718DM的寄存器访问逻辑比较直接:先写配置寄存器选择工作模式和转换精度,再读温度结果寄存器获取两字节数据。我给传感器配置了连续转换模式,每秒钟完成一次内部测量,MCU在需要的时候读最新结果,不需要等待转换完成,这样整个系统响应速度快,也不会阻塞式占用I2C总线。
配置流程就是上电后延时50ms,写配置寄存器设置分辨率,然后读ID寄存器确认通信正常,再循环读温度数据。这里有个经验:上电后不要立刻读数据,传感器内部的基准电压和时钟稳定需要一点时间,我第一次调试时上电立即读,读回来全FF,后来加了延时就正常了。
uint8_t pj85718dm_read_temperature(uint8_t dev_addr, float *temp_celsius) { uint8_t reg = 0x00; uint8_t data[2] = {0}; int16_t raw; /* 写入寄存器地址 0x00(温度数据寄存器) */ if (i2c_write(dev_addr, ®, 1) != 0) return 1; /* 读取两字节温度数据 */ if (i2c_read(dev_addr, data, 2) != 0) return 2; /* 14位分辨率,温度值左对齐 */ raw = (int16_t)((data[0] << 8) | data[1]); raw >>= 2; /* 去掉低两位无效数据 */ /* 转换:每 LSB 表示 0.01 摄氏度 */ *temp_celsius = (float)raw * 0.01f; return 0; }3.2 多点轮询与报警阈值处理
4颗传感器的轮询我用了一个长度为4的地址表循环遍历,每次采集完当前传感器后把数据存入环形缓冲区,然后挪到下一个传感器。整个轮询周期由定时器控制,我的实现是50ms执行一次采集调度,4颗传感器全部采集完只需要200ms以内,1秒刷新一次本地显示绰绰有余。
报警阈值处理上,我用了主控的中断引脚配合软件标志位。每颗传感器的ALERT输出可以独立配置高或低触发,我统一配置成超温拉低。主控外部中断ISR里只置一个标志位,不在中断里做复杂逻辑,主循环检测到标志后再去查是哪颗传感器报警、温度值是多少、触发声光报警还是远程通知。这样把实时性和业务逻辑解耦开,代码可控性高很多。
3.3 温度校准:两点标定的实践
传感器出厂校准精度不错,但应用时安装位置会有偏差,所以我在系统里做了软件校准。方法是跟标准温度计对比,取两个温度点做偏置修正,比如4℃和60℃两个点,用线性插值得到修正函数。实际测试下来,校准后的误差能控制在±0.15℃以内。
我还在固件里加入了滑动滤波。温度变化在HVAC里相对缓慢,用一个长度为10的滑动窗口做平均值滤波,就能很好抑制偶发采样毛刺。但要注意,风机启动时可能瞬间改变传感器表面温度,这时滤波反而掩盖了真实变化。我加了变化率判断:如果当前值和窗口平均值偏差超过2℃,直接采用当前值,不做滤波,保证异常跳变也能被及时捕捉。
4. 本地显示与人机交互:串口屏和按键逻辑
本地显示我用了一块4.3寸串口屏,通过UART和主控通信。主控按固定格式发送传感器数据帧,比如“TEMP:0:23.5”表示1号传感器当前温度23.5℃。串口屏端通过组态软件配置显示控件,做个简单的仪表盘页面,把4路温度实时显示出来,也显示系统运行状态和报警信息。
串口屏通信有个值得注意的点:串口屏的接收缓冲区如果满了,后面的数据就丢了,表现就是页面偶发卡在旧数据。所以我这边的发送频率没有设太高,1秒一帧足够,加上简单的握手协议,串口屏每收到一帧回一个ACK,主控如果没收到ACK就缓存数据,等下一次发送时重发。这套机制看起来简单,但极大减少了画面卡顿问题。
按键逻辑方面,我做了一个三键菜单:SET键进入参数设置,UP/DOWN调节报警温度阈值。所有阈值参数存储在主控内部Flash,断电不丢失。因为R7FA6M3AH3CFC内部Flash空间充裕,我直接用了它模拟EEPROM的方式存储,不需要外接EEPROM芯片。
本地人机交互的界面设计也可以轻量化一点。实际HVAC产品上,没必要做花哨动画,我用简洁的数字大字体显示温度,报警状态用颜色区分,绿色正常、黄色预警、红色报警,再接个蜂鸣器做声音提示。屏幕下面放一行滚动日志区,显示状态更新,方便现场调试和维护。
5. 远程温度监测实现:基于以太网与MQTT的完整链路
5.1 网络协议栈的选型与集成
远程监测这块是重头戏。R7FA6M3AH3CFC跑以太网协议栈,我选的是RTT生态里的lwIP方案,它的内存占用对这颗MCU来说很充裕,而且API通俗,跑TCP/IP基础应用足够。lwIP配置成使用操作系统模式,基于RT-Thread完成网络任务。
协议栈配置上要特别注意PBUF池大小和TCP窗口大小,温度数据帧非常小,一般几十字节每次,所以PBUF池设64个,每个256字节就完全够用。TCP的发送和接收缓冲区也不需要开太大,温度监控不是高频大数据传输,8KB足够了。开太大的话白白占用内存,反而影响其他业务。
网络调试时先用静态IP地址,把MAC地址也手动设置了,避开路由器DHCP分配问题。后续量产可以保留静态配置,也可以上DHCP,但要在配置里加一个看门狗超时重试,防止设备在复杂网络环境里获取IP失败后彻底失联。
5.2 MQTT数据上报协议设计
远程数据最通用的方案是MQTT,轻量、稳定、穿透性好。我这边用一个开源MQTT客户端库,配置好broker地址、端口、用户名密码、订阅主题,客户端就启动连接。设备端周期发布温度数据到topic,比如hvac/dev001/temp/0,云平台或者手机App订阅对应主题就能实时收到数据。
我重点设计了一份JSON报文格式,每条消息包含设备ID、时间戳、4路温度值、报警状态和工作模式:
{ "device_id": "HVAC-2024-001", "timestamp": 1735689600, "temp": [23.5, 24.1, 22.8, 26.3], "alarm": 0, "mode": 3 }这样云端不用针对不同设备定制协议,所有设备统一格式,后端解析处理起来非常省事。上报频率默认30秒一次,云计算压力小,数据粒度对HVAC监控也够。如果检测到报警状态,我会上报间隔临时缩短到5秒,方便运维第一时间观察温度变化趋势。
5.3 断线重连与数据补传
远程监测最怕设备断网后数据丢失。HVAC现场网络偶尔不稳定,网线松动、交换机重启、路由器升级都会造成TCP连接断开。因此断线重连是整套方案的灵魂。
我在固件里做了两级保障。第一级是MQTT层的自动重连,客户端掉线后按照递增退避策略每隔5秒、10秒、30秒、60秒重试一次,最多间隔不超过5分钟,保证网络恢复后能尽快恢复在线。第二级是数据缓存补传,本地Flash划出4KB区域做环形缓冲,离线的30秒刷新数据和5秒报警数据全部写入缓冲,上线后按时间顺序逐条补传,确保云端历史数据完整,不出现时间断档。
实际联调中发现,MQTT broker的keepalive参数设置很关键。如果keepalive设太长,服务端可能因为收不到心跳主动断开连接;设太短则频繁发送心跳增加流量。我最终设置为30秒一次心跳,服务端发现连接失效的最长时间为60秒,这样网络异常后一两分钟内就能感知到离线状态。
5.4 网络安全的落地做法
既然设备进了内网,就不得不考虑安全问题。R7FA6M3AH3CFC本身带安全加密引擎,我在项目里用它做了三层防护:
- 设备端保存客户端证书,用TLS加密与broker的通信,避免明文传输被嗅探。
- 每台设备分配唯一用户名密码,云端定期更新凭据。
- 设备固件签名验证,只有通过签名校验的固件才能被启动,防止被刷入恶意程序。
HVAC行业里很多设备长期运行在不更新的状态上,安全设计一开始就要做进去,否则后面远程运维就是一个大漏洞。
6. 实测数据、功耗分析与踩坑总结
6.1 实测数据
我把整套系统在模拟HVAC环境里跑了72小时,记录结果如下:
- 室温25℃环境下,PJ85718DM回风温度读数稳定在24.9℃到25.1℃之间,波动幅度约±0.2℃,显示无跳变。
- 4路传感器之间的最大温差记录为4.7℃,符合送风口和回风口实际温度差异预期。
- 从主控发起I2C读请求到串口屏更新显示,本地链路延迟在50ms以内。
- 远程数据从传感器采集到云端收到MQTT消息,典型端到端延迟约200ms,局域网环境下如果跨公网加TLS握手会慢一点,但完整链路在2秒以内。
功耗方面,整板包括主控、传感器、串口屏、网络PHY,实测运行电流在120mA左右(3.3V供电),以太网传输时电流略高,整体控制在0.4W以内。如果只用电池供电做太阳能农业大棚温控之类应用,这套方案可以关掉以太网PHY和串口屏,降到最低功耗模式,主控只保留定时采集和存储,功耗能压到不到1mA,但我这次做的是HVAC控制器,对功耗要求不敏感。
6.2 调试中遇到的几个坑
第一个坑是I2C时序问题。400kHz模式下,4.7kΩ上拉电阻配合15cm排线长度时波形沿就明显变缓,偶尔读到错误温度,表现为个别传感器读出来值乱跳。排查后把上拉改成3.3kΩ、通信速率降到100kHz,问题消失。教训:I2C速率不是越高越好,现场布线环境可能不支持高速模式,稳定压倒一切。
第二个坑是局域网丢包导致的MQTT掉线。一开始没用断线重连机制,远端broker一重启,设备端所有连接全部断开,并且不重连。后来实现了自动重连和退避策略,断线期间数据全部补传到设备Flash,网络恢复后主动补传。坑点在于Flash写入次数有限,如果断线时间很长,环形缓冲被写满后要覆盖旧数据,我做了保护——超过缓冲容量后丢弃时间戳最早的数据,防止新数据没存进去。
第三个坑是串口屏和网络任务相互卡顿。一开始串口屏通信和网络收发放在同一个线程里,串口屏发送大屏刷图时网络包会延迟几十毫秒,分布式控制场景下明显感觉数据迟滞。后来把串口屏通信放到独立任务,网络收发、I2C采集、串口屏刷新各跑各的,互不阻塞,卡顿问题解决。
第四个坑是电源毛刺导致传感器偶尔读数异常。最典型的现象是风机启动瞬间,某一路传感器读数跳变3℃以上。定位后确认是风机驱动电流在公共地线上产生压降,影响了I2C信号的电平判断。处理方案是分别供电、加磁珠和电容隔离,同时PVM风机驱动采用独立的电源层,彻底切断干扰路径。
6.3 系统扩展建议
这套硬件和固件底子很灵活。后续可以在同一块板子上扩展多个传感器类型,比如加装湿度传感器、风速传感器或者压差传感器,用I2C或者ADC通道接入,把HVAC控制器做成多参数环境监测网关。R7FA6M3AH3CFC的通信接口足够多,不需要动主板硬件设计,固件里加几个采集任务就行。
也可以把远程通道扩展到其他云平台。MQTT标准协议天然兼容各类平台,我这次用的私有broker,换用其他云平台只需要改broker地址、端口和上传Topic,代码层面完全不需要大改。配合设备侧的TLS证书,上云也能平滑迁移。
7. 最终给同行的几条经验
项目做完复盘,有几个观点我特别想分享。
温控系统的关键不在控制算法,而在底层数据可靠性。算法再漂亮,传感器数据跳变、通信断档都是空中楼阁。PJ85718DM这类数字传感器把精度问题解决了,后续重点就是怎么保证数据传输链路不断、不乱,这才是我花最多时间的地方。
别迷信高速I2C。400kHz看着诱人,但现场布线环境千奇百怪,我最终跑100kHz温度轮询也完全够用,系统整体实时性没受影响。很多问题其实不是性能不够,而是方案没有匹配实际物理环境。
远程监测必须把网络异常当常态来设计。HVAC设备安装环境可能是工厂、地下室、楼顶,网络状况远不如办公室,断线重连、数据补传、看门狗这三大能力一个都不能少。没有断线自动恢复的远程系统,只能是给运维人员增加工作量。
模块化设计比功能堆叠更重要。I2C采集、本地显示、远程网络分成独立任务模块后,后续加功能、单独调试都方便。这套思路应用到其他嵌入式项目上同样适用。
如果正准备做自己的HVAC温度监测或者环境数据采集系统,直接按上面这套架构做出来的产品,至少能把温度测量、显示、远程上报这条主链路稳定跑通,剩下的就是按行业规范把报警逻辑、认证加密、整机可靠性打磨完善。