1. 项目概述与核心需求解析给一台经典老车加装发动机温度表这事儿听起来简单但真动起手来你会发现到处都是坑。我的座驾是一台菲亚特126就是那款后置风冷双缸发动机的“小土豆”。这车原厂压根没配水温表发动机舱在后备箱下面温度全靠司机“感觉”夏天跑个长途心里实在没底。拉根线从车尾仪表盘工程浩大不说还得在车身钣金上打孔穿线对于经典车玩家来说这简直是“破坏性改装”不能忍。所以我的目标很明确做一个完全无线的温度监测系统。发射端探头要能牢牢吸在发动机的金属壳体上自己用电池供电功耗必须极低最好能扛好几个月接收端仪表要小巧精致能插在点烟器或USB口取电实时显示温度。核心就是摆脱线缆的束缚实现即贴即用。市面上成品无线温度计要么精度不够要么功耗太高要么丑得没法看干脆自己动手丰衣足食。这套系统的核心逻辑是事件触发式低功耗无线传输。不是傻乎乎地一直发数据而是让探头“智能”起来发动机冷车时它大部分时间在深度睡眠每隔6分钟才醒来看一眼温度一旦发现温度超过50°C意味着发动机启动了它立刻进入“警戒状态”改为每30秒采集并发送一次数据当温度回落到50°C以下它又判断发动机已熄火重新回到漫长的6分钟巡检周期。这个策略完美平衡了实时性和续航也是整个设计最精妙的地方。2. 系统架构与核心器件选型无线传输方案是第一个要敲定的。Wi-Fi、蓝牙虽然时髦但功耗和复杂度对这个小项目来说都是负担。经典的433MHz ASK/OOK射频模块成了不二之选。这类模块价格极低一对不到十块钱传输距离在开阔地带轻松超过百米在车内这种金属环境里穿透几层钢板也没问题。关键是驱动简单单片机用GPIO模拟时序就能直接控制非常适合嵌入式新手。我选用的是市面上最常见的“MX-RM-5V”发射模块和“MX-FS-03V”接收模块注意要买带焊盘引脚的那种不要买排针的方便自己布线。微控制器是整个系统的大脑需要兼顾性能、功耗、成本和引脚数量。PIC12F1822这颗8位单片机进入了我的视线。它只有8个引脚但集成了丰富的资源4MHz内部振荡器、128字节RAM、2KB Flash最关键的是它支持深度睡眠模式功耗可以降到微安级别。对于发射端它需要驱动两个传感器、一个射频模块并管理复杂的休眠逻辑对于接收端它需要驱动OLED屏并解码无线信号。PIC12F1822的资源和性能刚好够用体现了“够用就好”的工程哲学。温度传感器我直接选择了数字式的DS18B20。理由有三一是它只需要一根数据线就能与单片机通信节省宝贵的IO口二是它出厂已校准精度可达±0.5°C完全满足汽车监控需求我们需要的是趋势和预警不是实验室级精度三是它本身功耗很低。我用了两个DS18B20一个作为主传感器监测发动机缸体或油底壳温度Temp1另一个作为辅助传感器Temp2可以用来监测电池仓温度或者发动机另一个关键点实现两点对比更安全。显示部分为了追求酷炫和低功耗我选择了0.96英寸的I2C接口OLED屏。这种屏幕是自发光的显示黑色时不耗电对比度高在阳光下也比LCD屏更容易看清。虽然PIC12F1822的RAM很小无法使用完整的图形库但通过精心设计只显示6个自定义字符比如“E 105°C”是完全可以实现的。注意器件选型是平衡的艺术。不要盲目追求高性能比如用STM32驱动433MHz模块就是高射炮打蚊子。PIC12F1822和433MHz模块的组合在成本、功耗、开发难度上达到了最佳平衡点这也是很多成熟工业无线遥控器仍在采用类似方案的原因。3. 硬件电路设计与实现细节3.1 发射端探头电路设计发射端的核心任务是低功耗采集与无线发送。电路原理图围绕着PIC12F1822展开。电源管理部分这是低功耗设计的生命线。我使用4节AAA碱性电池串联供电标称电压6V。虽然PIC12F1822和DS18B20的工作电压范围是2.0V-5.5V但433MHz发射模块在电压低于5V时发射功率会急剧下降。因此我加入了一个低压差线性稳压器LDO型号选用ME6211C33M5G将电池电压稳定在3.3V供给整个系统。别小看LDO的选择它的静态电流Quiescent Current至关重要。ME6211在轻载时的静态电流只有几微安比常见的AMS1117约5mA低了三个数量级这对长期睡眠的电路来说是天壤之别。传感器接口两个DS18B20的数据线分别连接到MCU的GP0和GP1引脚并通过一个4.7kΩ的上拉电阻拉到3.3V。这里有个细节DS18B20是单总线器件理论上可以多个挂在同一根线上但我为什么用了两个独立引脚一是为了编程简单避免复杂的ROM搜索算法节省代码空间二是为了可靠性一根总线出问题另一个传感器还能工作。射频发射电路433MHz发射模块的数据引脚DATA直接连接MCU的GP2引脚。模块的VCC和GND接入系统3.3V。这里必须串联一个磁珠或小电阻如10Ω在模块电源路径上。因为发射模块在启动瞬间的电流脉冲可能达到几十毫安会在电源线上产生毛刺可能引起MCU复位。这个小小的磁珠能有效抑制电流突变提升系统稳定性。PCB布局要点天线处理发射模块自带一根弹簧天线要确保其完全伸展开并且远离电池和金属壳体。我的做法是将整个模块布置在PCB的一端天线部分悬空。去耦电容在MCU的VDD和GND引脚之间紧挨着芯片放置一个100nF的陶瓷电容。在LDO的输入和输出端分别并联一个10μF的钽电容和一个100nF的陶瓷电容这是抑制电源噪声的标准操作。电池触点使用优质的弹簧触点或焊接导线确保在发动机震动环境下接触良好。3.2 接收端仪表电路设计接收端相对简单核心是供电、解码和显示。电源输入直接从车载USB口或点烟器取5V电源。同样使用一个低静态电流的LDO如ME6211C33M5G降压到3.3V为MCU、接收模块和OLED屏供电。输入端务必加入一个自恢复保险丝500mA和一颗TVS二极管用于防止汽车电源上的浪涌电压和接反等意外情况保护后续精密电路。射频接收电路433MHz接收模块的数据引脚DATA连接MCU的GP0。这里要注意接收模块的输出是非标准逻辑电平在无信号时可能是浮空或杂波。因此我在程序初始化时将GP0引脚设置为带上拉电阻的数字输入并在软件中做数字滤波处理比如连续读到5个相同的电平才确认为有效信号以此提高抗干扰能力。OLED显示接口OLED屏的I2C接口SCL、SDA分别连接MCU的GP1和GP2。同样需要上拉电阻通常4.7kΩ即可。由于PIC12F1822的硬件I2C模块功能有限我直接使用了GPIO模拟I2C时序这样更节省代码空间控制也更灵活。3.3 功耗实测与优化功耗是无线探头续航能力的决定性因素。我用高精度万用表串联在电池回路中实测了各状态下的电流工作状态平均电流持续时间/周期说明深度睡眠0.03 mA6分钟冷车MCU休眠所有外设断电仅LDO和MCU维持最低记忆电流。温度采集1.5 mA约200msMCU唤醒启动DS18B20并读取温度。无线发射12 mA约50ms启动433MHz模块发送包含温度和校验码的数据包。综合平均热车约 0.15 mA-按每30秒工作250ms计算绝大部分时间仍在睡眠。根据这个数据我们可以粗略估算续航4节AAA碱性电池总容量约1200mAh。按最严苛的“热车平均电流0.15mA”计算理论续航时间为 1200mAh / 0.15mA 8000小时约合333天。即使考虑到电池自放电、低温容量下降等因素稳定工作3-6个月是完全没有问题的。这个结果验证了事件触发式低功耗设计的巨大优势。4. 嵌入式软件设计与通信协议4.1 发射端固件逻辑发射端的程序流程是整个系统的智慧核心。其主循环是一个由看门狗定时器WDT或定时器中断唤醒的状态机。1. 初始化上电后MCU初始化IO口、配置WDT看门狗定时器超时时间为6分钟然后立即进入睡眠模式。WDT在睡眠时仍在工作这是PIC单片机低功耗的关键特性。2. 冷车巡检状态被WDT唤醒6分钟到 - 读取Temp1传感器 - 判断温度是否 50°C - 否重新配置WDT为6分钟立即进入睡眠。 - 是进入“热车监控状态”。3. 热车监控状态1. 读取Temp1和Temp2。 2. 启动433MHz发射模块电源通过一个MOSFET控制进一步省电。 3. 组装数据包并发送。 4. 关闭发射模块电源。 5. 重新配置WDT超时时间为30秒。 6. 进入睡眠。30秒后WDT再次唤醒MCU重复步骤1-6。但在每次读取Temp1后会多一个判断如果 Temp1 50°C则判定发动机已熄火系统状态切换回“冷车巡检状态”。数据包设计为了确保通信可靠我设计了一个简单的数据帧结构。由于433MHz模块传输的是串行比特流我直接用MCU的GPIO模拟了一个简单的异步串口4800bps。[帧头 0xAA] [帧头 0x55] [Temp1高字节] [Temp1低字节] [Temp2高字节] [Temp2低字节] [校验和]校验和是前面所有数据字节的简单累加和取低8位。接收端只有收到连续0xAA和0x55并且校验和正确的数据才会进行解析。这个简单的协议有效过滤了空中大量的噪声误触发。4.2 接收端固件逻辑接收端的程序相对单纯主要任务是解码、显示和超时处理。1. 信号解码程序不断检测GP0引脚的电平变化使用一个定时器中断来模拟串口接收捕捉4800bps的比特流。一旦检测到0xAA和0x55的帧头就开始接收后续数据并计算校验和。2. 数据显示解码成功后将两个温度字节转换为实际温度值DS18B20直接输出16位二进制补码。然后在OLED上刷新显示。为了在PIC12F1822极小的RAM下实现显示我放弃了使用字体库。我预先在Flash里存储了0-9的数字和字母“E”、“C”的自定义点阵数据每个字符大概5x7像素。显示时程序只是将这些点阵数据按顺序“画”到OLED的GRAM中形成“E 098 C”这样的字符串。3. 连接状态指示这是提升用户体验的关键。我让OLED屏的右下角有一个小点作为状态指示灯。常亮表示最近比如10秒内成功收到了数据连接正常。闪烁表示超过10秒未收到数据但仍在尝试连接。熄灭表示超过5分钟未收到数据判定探头可能已断电或故障此时屏幕上显示“---”代替温度值。这个设计让我一眼就能知道无线链路是否正常避免了显示一个“僵死”的温度值而不知情。实操心得在编写模拟串口接收代码时最大的坑是时序精度。PIC的内部振荡器精度不高通常±1%在4800bps下误差累积会导致采样错位。我的解决办法是1) 在通信开始时利用帧头0xAA二进制10101010这个特殊的方波进行波特率自适应校准测量两个下降沿之间的时间来计算实际比特宽度。2) 将接收采样点设置在比特周期的中间偏后如75%处而不是正中间以提高容错性。这个小技巧让通信成功率从不到70%提升到了99%以上。5. 外壳制作、安装与实测调试5.1 发射端探头外壳与安装发射端的外壳需要满足几个苛刻条件耐高温、防震、便于安装、不影响无线信号。我最初的方案是3D打印但测试后发现PLA材料在发动机舱长期80°C以上的环境下会软化变形。后来改用ABS材料打印耐热性好了很多能短期承受100°C左右。最理想的其实是玻纤增强尼龙PA-GF但打印难度较大。我的“土炮”解决方案是利用旧鼠标外壳。找一个废旧的滚轮鼠标拆掉内部所有元件其空间刚好能放下PCB和电池。鼠标外壳本身是ABS工程塑料耐热性足够。关键是安装方式我在外壳底部用热熔胶固定了四颗强力钕铁硼磁铁直径10mm厚度3mm。这样探头可以牢牢地吸附在发动机的油底壳、缸体或任何铁质部件上无需打孔拆装只需一秒钟完美契合“无损安装”的理念。安装位置选择油底壳侧面这是我最推荐的位置。金属壳体导热好能准确反映机油温度而机油温度是发动机热负荷的间接体现。同时这个位置相对远离排气歧管等极端高温区。气缸盖附近温度更直接但震动和温度梯度更大对传感器和外壳都是考验。避免的位置排气歧管、涡轮增压器附近温度过高塑料部件上无法磁吸且导热差散热风扇正前方强制风冷会导致测量值偏低。5.2 接收端仪表外壳设计接收端的外壳主要考虑美观、易读和安装便利。我使用SolidWorks设计了分体式外壳包含底盖和面盖。设计要点包括出线口底部留有一个让USB线穿过的孔并设计有卡线槽防止线缆被拉扯脱落。屏幕开孔开孔比OLED屏可视区域略小形成一种“包边”效果看起来更精致。散热孔在顶部和底部设计了一些细小的格栅虽然OLED和MCU发热不大但良好的空气流通有助于在夏日暴晒的车内延长元件寿命。安装方式外壳背面设计了一个标准AMPS孔距28mm x 26mm的支架接口这样可以选择使用双面胶粘贴也可以购买一个车载手机支架的球头底座实现灵活多角度的安装。5.3 系统联调与问题排查将发射端吸附在发动机上接收端插上USB电源最激动人心的联调开始了。但现实总会给你出点难题。问题一显示乱码或温度值跳跃现象OLED屏上数字偶尔乱跳或显示非数字字符。排查首先检查接收端电源是否稳定用示波器看3.3V电源有无毛刺。然后将发射端靠近接收端如果问题消失说明是信号弱导致误码。如果问题依旧很可能是软件解码时序问题。解决1) 确保发射端天线完全展开且方向尽量朝向驾驶舱。2) 在接收端代码中增加软件去抖和校验。我修改了程序要求连续成功解码3次相同的数据包才更新显示瞬间稳定了。3) 检查并调整模拟串口的波特率校准算法。问题二续航时间远低于预期现象新电池用了两三周就没电了。排查用万用表电流档串联测量睡眠时的电流。如果远高于0.03mA说明有“漏电”。解决1)检查所有IO口在进入睡眠前确保所有未使用的IO口设置为输出并输出低电平或者设置为带上拉电阻的输入。悬空的IO口会因感应电流导致功耗增加。2)检查LDO的使能端有些LDO有使能引脚需要接高电平才能工作如果接错了可能没完全关断。3)检查传感器电源管理我最初是直接给DS18B20供电后来改为通过一个MOSFET如2N7002控制其电源仅在测量前瞬间上电测量完立即断电又节省了微安级的电流。问题三高温环境下工作不稳定现象夏天长时间行车后探头偶尔会“失联”。排查发动机舱内温度可能超过80°C而DS18B20的官方工作上限是125°CPIC单片机是85°C。虽然都在范围内但高温下电池内阻增大、元件参数漂移会影响整体性能。解决1)物理隔热在探头外壳和发动机金属壳体之间垫一层薄薄的云母片或硅胶隔热垫。云母片导热性能尚可能传递温度但可以隔绝一部分辐射热使壳体内温度降低10-15°C。2)选用高温电池普通碱性电池高温性能差可改用耐高温的锂亚硫酰氯Li-SOCl2电池但需要注意其电压是3.6V需要重新设计电源电路。经过几轮调试和优化这套系统最终在我的菲亚特126上稳定运行了超过半年。冬天冷启动时看着仪表盘上缓缓上升的温度数字夏天拥堵时留意着温度是否接近警戒线我为自己的风冷发动机设定了105°C的视觉警示屏幕会闪烁心里那份踏实感是任何改装店买来的成品都给不了的。它不仅仅是一个仪表更是自己一点点构思、设计、调试出来的作品是和这台老车之间更深层次的连接。最后关于扩展性这个框架的潜力远不止于此。接收端的OLED屏可以显示更多信息比如电压、简单的故障码通过温度变化率推断。探头也可以集成其他传感器比如振动传感器来监测发动机怠速是否平稳或者霍尔传感器来简单计算转速。PIC12F1822的引脚还没用完Flash也还有空间留给爱折腾的人无尽的可能。
基于433MHz与PIC单片机的无线温度监测系统设计与实现
1. 项目概述与核心需求解析给一台经典老车加装发动机温度表这事儿听起来简单但真动起手来你会发现到处都是坑。我的座驾是一台菲亚特126就是那款后置风冷双缸发动机的“小土豆”。这车原厂压根没配水温表发动机舱在后备箱下面温度全靠司机“感觉”夏天跑个长途心里实在没底。拉根线从车尾仪表盘工程浩大不说还得在车身钣金上打孔穿线对于经典车玩家来说这简直是“破坏性改装”不能忍。所以我的目标很明确做一个完全无线的温度监测系统。发射端探头要能牢牢吸在发动机的金属壳体上自己用电池供电功耗必须极低最好能扛好几个月接收端仪表要小巧精致能插在点烟器或USB口取电实时显示温度。核心就是摆脱线缆的束缚实现即贴即用。市面上成品无线温度计要么精度不够要么功耗太高要么丑得没法看干脆自己动手丰衣足食。这套系统的核心逻辑是事件触发式低功耗无线传输。不是傻乎乎地一直发数据而是让探头“智能”起来发动机冷车时它大部分时间在深度睡眠每隔6分钟才醒来看一眼温度一旦发现温度超过50°C意味着发动机启动了它立刻进入“警戒状态”改为每30秒采集并发送一次数据当温度回落到50°C以下它又判断发动机已熄火重新回到漫长的6分钟巡检周期。这个策略完美平衡了实时性和续航也是整个设计最精妙的地方。2. 系统架构与核心器件选型无线传输方案是第一个要敲定的。Wi-Fi、蓝牙虽然时髦但功耗和复杂度对这个小项目来说都是负担。经典的433MHz ASK/OOK射频模块成了不二之选。这类模块价格极低一对不到十块钱传输距离在开阔地带轻松超过百米在车内这种金属环境里穿透几层钢板也没问题。关键是驱动简单单片机用GPIO模拟时序就能直接控制非常适合嵌入式新手。我选用的是市面上最常见的“MX-RM-5V”发射模块和“MX-FS-03V”接收模块注意要买带焊盘引脚的那种不要买排针的方便自己布线。微控制器是整个系统的大脑需要兼顾性能、功耗、成本和引脚数量。PIC12F1822这颗8位单片机进入了我的视线。它只有8个引脚但集成了丰富的资源4MHz内部振荡器、128字节RAM、2KB Flash最关键的是它支持深度睡眠模式功耗可以降到微安级别。对于发射端它需要驱动两个传感器、一个射频模块并管理复杂的休眠逻辑对于接收端它需要驱动OLED屏并解码无线信号。PIC12F1822的资源和性能刚好够用体现了“够用就好”的工程哲学。温度传感器我直接选择了数字式的DS18B20。理由有三一是它只需要一根数据线就能与单片机通信节省宝贵的IO口二是它出厂已校准精度可达±0.5°C完全满足汽车监控需求我们需要的是趋势和预警不是实验室级精度三是它本身功耗很低。我用了两个DS18B20一个作为主传感器监测发动机缸体或油底壳温度Temp1另一个作为辅助传感器Temp2可以用来监测电池仓温度或者发动机另一个关键点实现两点对比更安全。显示部分为了追求酷炫和低功耗我选择了0.96英寸的I2C接口OLED屏。这种屏幕是自发光的显示黑色时不耗电对比度高在阳光下也比LCD屏更容易看清。虽然PIC12F1822的RAM很小无法使用完整的图形库但通过精心设计只显示6个自定义字符比如“E 105°C”是完全可以实现的。注意器件选型是平衡的艺术。不要盲目追求高性能比如用STM32驱动433MHz模块就是高射炮打蚊子。PIC12F1822和433MHz模块的组合在成本、功耗、开发难度上达到了最佳平衡点这也是很多成熟工业无线遥控器仍在采用类似方案的原因。3. 硬件电路设计与实现细节3.1 发射端探头电路设计发射端的核心任务是低功耗采集与无线发送。电路原理图围绕着PIC12F1822展开。电源管理部分这是低功耗设计的生命线。我使用4节AAA碱性电池串联供电标称电压6V。虽然PIC12F1822和DS18B20的工作电压范围是2.0V-5.5V但433MHz发射模块在电压低于5V时发射功率会急剧下降。因此我加入了一个低压差线性稳压器LDO型号选用ME6211C33M5G将电池电压稳定在3.3V供给整个系统。别小看LDO的选择它的静态电流Quiescent Current至关重要。ME6211在轻载时的静态电流只有几微安比常见的AMS1117约5mA低了三个数量级这对长期睡眠的电路来说是天壤之别。传感器接口两个DS18B20的数据线分别连接到MCU的GP0和GP1引脚并通过一个4.7kΩ的上拉电阻拉到3.3V。这里有个细节DS18B20是单总线器件理论上可以多个挂在同一根线上但我为什么用了两个独立引脚一是为了编程简单避免复杂的ROM搜索算法节省代码空间二是为了可靠性一根总线出问题另一个传感器还能工作。射频发射电路433MHz发射模块的数据引脚DATA直接连接MCU的GP2引脚。模块的VCC和GND接入系统3.3V。这里必须串联一个磁珠或小电阻如10Ω在模块电源路径上。因为发射模块在启动瞬间的电流脉冲可能达到几十毫安会在电源线上产生毛刺可能引起MCU复位。这个小小的磁珠能有效抑制电流突变提升系统稳定性。PCB布局要点天线处理发射模块自带一根弹簧天线要确保其完全伸展开并且远离电池和金属壳体。我的做法是将整个模块布置在PCB的一端天线部分悬空。去耦电容在MCU的VDD和GND引脚之间紧挨着芯片放置一个100nF的陶瓷电容。在LDO的输入和输出端分别并联一个10μF的钽电容和一个100nF的陶瓷电容这是抑制电源噪声的标准操作。电池触点使用优质的弹簧触点或焊接导线确保在发动机震动环境下接触良好。3.2 接收端仪表电路设计接收端相对简单核心是供电、解码和显示。电源输入直接从车载USB口或点烟器取5V电源。同样使用一个低静态电流的LDO如ME6211C33M5G降压到3.3V为MCU、接收模块和OLED屏供电。输入端务必加入一个自恢复保险丝500mA和一颗TVS二极管用于防止汽车电源上的浪涌电压和接反等意外情况保护后续精密电路。射频接收电路433MHz接收模块的数据引脚DATA连接MCU的GP0。这里要注意接收模块的输出是非标准逻辑电平在无信号时可能是浮空或杂波。因此我在程序初始化时将GP0引脚设置为带上拉电阻的数字输入并在软件中做数字滤波处理比如连续读到5个相同的电平才确认为有效信号以此提高抗干扰能力。OLED显示接口OLED屏的I2C接口SCL、SDA分别连接MCU的GP1和GP2。同样需要上拉电阻通常4.7kΩ即可。由于PIC12F1822的硬件I2C模块功能有限我直接使用了GPIO模拟I2C时序这样更节省代码空间控制也更灵活。3.3 功耗实测与优化功耗是无线探头续航能力的决定性因素。我用高精度万用表串联在电池回路中实测了各状态下的电流工作状态平均电流持续时间/周期说明深度睡眠0.03 mA6分钟冷车MCU休眠所有外设断电仅LDO和MCU维持最低记忆电流。温度采集1.5 mA约200msMCU唤醒启动DS18B20并读取温度。无线发射12 mA约50ms启动433MHz模块发送包含温度和校验码的数据包。综合平均热车约 0.15 mA-按每30秒工作250ms计算绝大部分时间仍在睡眠。根据这个数据我们可以粗略估算续航4节AAA碱性电池总容量约1200mAh。按最严苛的“热车平均电流0.15mA”计算理论续航时间为 1200mAh / 0.15mA 8000小时约合333天。即使考虑到电池自放电、低温容量下降等因素稳定工作3-6个月是完全没有问题的。这个结果验证了事件触发式低功耗设计的巨大优势。4. 嵌入式软件设计与通信协议4.1 发射端固件逻辑发射端的程序流程是整个系统的智慧核心。其主循环是一个由看门狗定时器WDT或定时器中断唤醒的状态机。1. 初始化上电后MCU初始化IO口、配置WDT看门狗定时器超时时间为6分钟然后立即进入睡眠模式。WDT在睡眠时仍在工作这是PIC单片机低功耗的关键特性。2. 冷车巡检状态被WDT唤醒6分钟到 - 读取Temp1传感器 - 判断温度是否 50°C - 否重新配置WDT为6分钟立即进入睡眠。 - 是进入“热车监控状态”。3. 热车监控状态1. 读取Temp1和Temp2。 2. 启动433MHz发射模块电源通过一个MOSFET控制进一步省电。 3. 组装数据包并发送。 4. 关闭发射模块电源。 5. 重新配置WDT超时时间为30秒。 6. 进入睡眠。30秒后WDT再次唤醒MCU重复步骤1-6。但在每次读取Temp1后会多一个判断如果 Temp1 50°C则判定发动机已熄火系统状态切换回“冷车巡检状态”。数据包设计为了确保通信可靠我设计了一个简单的数据帧结构。由于433MHz模块传输的是串行比特流我直接用MCU的GPIO模拟了一个简单的异步串口4800bps。[帧头 0xAA] [帧头 0x55] [Temp1高字节] [Temp1低字节] [Temp2高字节] [Temp2低字节] [校验和]校验和是前面所有数据字节的简单累加和取低8位。接收端只有收到连续0xAA和0x55并且校验和正确的数据才会进行解析。这个简单的协议有效过滤了空中大量的噪声误触发。4.2 接收端固件逻辑接收端的程序相对单纯主要任务是解码、显示和超时处理。1. 信号解码程序不断检测GP0引脚的电平变化使用一个定时器中断来模拟串口接收捕捉4800bps的比特流。一旦检测到0xAA和0x55的帧头就开始接收后续数据并计算校验和。2. 数据显示解码成功后将两个温度字节转换为实际温度值DS18B20直接输出16位二进制补码。然后在OLED上刷新显示。为了在PIC12F1822极小的RAM下实现显示我放弃了使用字体库。我预先在Flash里存储了0-9的数字和字母“E”、“C”的自定义点阵数据每个字符大概5x7像素。显示时程序只是将这些点阵数据按顺序“画”到OLED的GRAM中形成“E 098 C”这样的字符串。3. 连接状态指示这是提升用户体验的关键。我让OLED屏的右下角有一个小点作为状态指示灯。常亮表示最近比如10秒内成功收到了数据连接正常。闪烁表示超过10秒未收到数据但仍在尝试连接。熄灭表示超过5分钟未收到数据判定探头可能已断电或故障此时屏幕上显示“---”代替温度值。这个设计让我一眼就能知道无线链路是否正常避免了显示一个“僵死”的温度值而不知情。实操心得在编写模拟串口接收代码时最大的坑是时序精度。PIC的内部振荡器精度不高通常±1%在4800bps下误差累积会导致采样错位。我的解决办法是1) 在通信开始时利用帧头0xAA二进制10101010这个特殊的方波进行波特率自适应校准测量两个下降沿之间的时间来计算实际比特宽度。2) 将接收采样点设置在比特周期的中间偏后如75%处而不是正中间以提高容错性。这个小技巧让通信成功率从不到70%提升到了99%以上。5. 外壳制作、安装与实测调试5.1 发射端探头外壳与安装发射端的外壳需要满足几个苛刻条件耐高温、防震、便于安装、不影响无线信号。我最初的方案是3D打印但测试后发现PLA材料在发动机舱长期80°C以上的环境下会软化变形。后来改用ABS材料打印耐热性好了很多能短期承受100°C左右。最理想的其实是玻纤增强尼龙PA-GF但打印难度较大。我的“土炮”解决方案是利用旧鼠标外壳。找一个废旧的滚轮鼠标拆掉内部所有元件其空间刚好能放下PCB和电池。鼠标外壳本身是ABS工程塑料耐热性足够。关键是安装方式我在外壳底部用热熔胶固定了四颗强力钕铁硼磁铁直径10mm厚度3mm。这样探头可以牢牢地吸附在发动机的油底壳、缸体或任何铁质部件上无需打孔拆装只需一秒钟完美契合“无损安装”的理念。安装位置选择油底壳侧面这是我最推荐的位置。金属壳体导热好能准确反映机油温度而机油温度是发动机热负荷的间接体现。同时这个位置相对远离排气歧管等极端高温区。气缸盖附近温度更直接但震动和温度梯度更大对传感器和外壳都是考验。避免的位置排气歧管、涡轮增压器附近温度过高塑料部件上无法磁吸且导热差散热风扇正前方强制风冷会导致测量值偏低。5.2 接收端仪表外壳设计接收端的外壳主要考虑美观、易读和安装便利。我使用SolidWorks设计了分体式外壳包含底盖和面盖。设计要点包括出线口底部留有一个让USB线穿过的孔并设计有卡线槽防止线缆被拉扯脱落。屏幕开孔开孔比OLED屏可视区域略小形成一种“包边”效果看起来更精致。散热孔在顶部和底部设计了一些细小的格栅虽然OLED和MCU发热不大但良好的空气流通有助于在夏日暴晒的车内延长元件寿命。安装方式外壳背面设计了一个标准AMPS孔距28mm x 26mm的支架接口这样可以选择使用双面胶粘贴也可以购买一个车载手机支架的球头底座实现灵活多角度的安装。5.3 系统联调与问题排查将发射端吸附在发动机上接收端插上USB电源最激动人心的联调开始了。但现实总会给你出点难题。问题一显示乱码或温度值跳跃现象OLED屏上数字偶尔乱跳或显示非数字字符。排查首先检查接收端电源是否稳定用示波器看3.3V电源有无毛刺。然后将发射端靠近接收端如果问题消失说明是信号弱导致误码。如果问题依旧很可能是软件解码时序问题。解决1) 确保发射端天线完全展开且方向尽量朝向驾驶舱。2) 在接收端代码中增加软件去抖和校验。我修改了程序要求连续成功解码3次相同的数据包才更新显示瞬间稳定了。3) 检查并调整模拟串口的波特率校准算法。问题二续航时间远低于预期现象新电池用了两三周就没电了。排查用万用表电流档串联测量睡眠时的电流。如果远高于0.03mA说明有“漏电”。解决1)检查所有IO口在进入睡眠前确保所有未使用的IO口设置为输出并输出低电平或者设置为带上拉电阻的输入。悬空的IO口会因感应电流导致功耗增加。2)检查LDO的使能端有些LDO有使能引脚需要接高电平才能工作如果接错了可能没完全关断。3)检查传感器电源管理我最初是直接给DS18B20供电后来改为通过一个MOSFET如2N7002控制其电源仅在测量前瞬间上电测量完立即断电又节省了微安级的电流。问题三高温环境下工作不稳定现象夏天长时间行车后探头偶尔会“失联”。排查发动机舱内温度可能超过80°C而DS18B20的官方工作上限是125°CPIC单片机是85°C。虽然都在范围内但高温下电池内阻增大、元件参数漂移会影响整体性能。解决1)物理隔热在探头外壳和发动机金属壳体之间垫一层薄薄的云母片或硅胶隔热垫。云母片导热性能尚可能传递温度但可以隔绝一部分辐射热使壳体内温度降低10-15°C。2)选用高温电池普通碱性电池高温性能差可改用耐高温的锂亚硫酰氯Li-SOCl2电池但需要注意其电压是3.6V需要重新设计电源电路。经过几轮调试和优化这套系统最终在我的菲亚特126上稳定运行了超过半年。冬天冷启动时看着仪表盘上缓缓上升的温度数字夏天拥堵时留意着温度是否接近警戒线我为自己的风冷发动机设定了105°C的视觉警示屏幕会闪烁心里那份踏实感是任何改装店买来的成品都给不了的。它不仅仅是一个仪表更是自己一点点构思、设计、调试出来的作品是和这台老车之间更深层次的连接。最后关于扩展性这个框架的潜力远不止于此。接收端的OLED屏可以显示更多信息比如电压、简单的故障码通过温度变化率推断。探头也可以集成其他传感器比如振动传感器来监测发动机怠速是否平稳或者霍尔传感器来简单计算转速。PIC12F1822的引脚还没用完Flash也还有空间留给爱折腾的人无尽的可能。