4. 体温计项目需求分析:体温计功能框图、传感器选型(DS18B20/MLX90614)、ADC采样与数据处理
好,咱们进入正题。这一章讲的是体温计项目的需求分析。说白了,就是搞清楚我们要做什么,用什么来做,以及数据怎么处理。
我见过不少新手工程师,上来就画原理图、写代码,结果做到一半发现传感器选错了,或者ADC精度不够。嗯,这种坑我踩过不止一次。所以,咱们先把需求理清楚,后面才走得稳。
4.1 体温计功能框图
先画个功能框图,把整个系统拆开来看。你想想看,一个嵌入式体温计,核心就这几块:
- 传感器模块:负责采集温度数据。可以是接触式的,也可以是非接触式的。
- 微控制器(MCU):大脑,负责读取传感器数据、处理、控制显示和通信。
- 显示模块:把温度值显示出来,常见的有LCD、OLED或者数码管。
- 电源管理:电池供电,要考虑低功耗设计。
- 按键/交互:比如开关机、切换模式(摄氏/华氏)。
- 看门狗与安全模块:这是咱们课程的重点,防止程序跑飞或者死机。
我个人习惯,画框图的时候会把数据流也标出来。比如:传感器 -> MCU(ADC采样/数字接口) -> 数据处理(滤波、校准) -> 显示。这样后面写代码的时候,思路特别清晰。
重要提醒:功能框图不是画完就完事了。我建议你把它贴在工位旁边,开发过程中随时对照。我曾经有个项目,就是因为框图里漏了“低功耗唤醒”这个模块,结果产品续航只有标称的一半,后来返工改硬件,折腾了两个月。
4.2 传感器选型:DS18B20 vs MLX90614
传感器选型,是体温计设计里最关键的一步。选错了,后面全白搭。咱们重点对比两款经典传感器:DS18B20和MLX90614。
4.2.1 DS18B20——接触式数字温度传感器
DS18B20,老熟人了。它是个数字传感器,直接输出温度值,不需要ADC。接口是单总线(1-Wire),一根线就能通信,省IO口。
- 测温范围:-55°C 到 +125°C,测体温绰绰有余。
- 精度:默认9~12位可配置,典型精度±0.5°C。如果做医用级,可能需要校准。
- 接口:单总线,每个传感器有唯一64位ROM地址,可以挂多个在一根线上。
- 供电:3.0V~5.5V,也可以用寄生供电模式(两根线搞定)。
我在项目里用过DS18B20做工业温度监控,说实话,它很皮实。但要注意一点:单总线的时序要求比较严格,尤其是读写时隙。我曾经因为中断没处理好,导致读出来的数据全是0xFF,排查了半天才发现是中断把时序打乱了。
小技巧:用DS18B20的时候,建议在初始化后先读一次ROM,确认传感器在线。如果读不到,直接报错,别傻等。
4.2.2 MLX90614——非接触式红外温度传感器
MLX90614,这个就高级一点了。它通过红外热辐射来测温度,不需要接触人体。适合做额温枪、耳温枪这类产品。
- 测温范围:物体温度-70°C 到 +380°C,人体温度范围完全覆盖。
- 精度:典型±0.5°C(在0~50°C范围内),医用级需要校准。
- 接口:I2C(SMBus兼容),通信速度最高100kHz。
- 特点:内置数字信号处理,直接输出物体温度和环境温度。
MLX90614用起来比DS18B20方便,因为I2C接口更通用,而且数据直接读寄存器就行,不用自己算。但要注意,红外传感器容易受环境干扰,比如阳光、热源、甚至人的呼吸都会影响读数。
避坑指南:我曾经在户外测试MLX90614,结果读数比实际体温低了2°C。后来发现是阳光直射传感器,导致红外背景噪声太大。解决办法是加一个遮光罩,或者做软件补偿。嗯,这个坑你们一定要记住。
4.2.3 选型对比表
| 对比项 | DS18B20 | MLX90614 |
|---|---|---|
| 测温方式 | 接触式 | 非接触式(红外) |
| 接口 | 单总线(1-Wire) | I2C(SMBus) |
| 精度 | ±0.5°C(典型) | ±0.5°C(典型) |
| 是否需要ADC | 否(数字输出) | 否(数字输出) |
| 测温距离 | 必须接触 | 1~5cm(推荐) |
| 功耗 | 低(待机1μA) | 中等(待机2μA) |
| 典型应用 | 腋下体温计、工业测温 | 额温枪、耳温枪、非接触测温 |
选哪个?看你的产品定位。如果是家用腋下体温计,DS18B20便宜又稳定。如果是快速筛查的额温枪,MLX90614更合适。我个人建议,如果预算允许,两个都预留接口,开发阶段可以灵活切换。
4.3 ADC采样与数据处理
好,传感器选完了,接下来聊聊ADC采样和数据处理。虽然DS18B20和MLX90614都是数字输出,但有些场景下你可能需要用模拟传感器(比如热敏电阻),那就绕不开ADC了。
4.3.1 ADC采样基础
ADC,就是把模拟电压转换成数字值。体温计里常用的ADC分辨率是12位或16位。12位ADC,参考电压3.3V,分辨率就是3.3V / 4096 ≈ 0.8mV。对于体温测量,这个精度基本够用。
但要注意,ADC采样不是直接读就完事了。有几个关键参数:
- 采样率:体温变化很慢,每秒采样10次就足够了。别用太高的采样率,浪费功耗。
- 参考电压:一定要稳定。我见过有人直接用MCU的VDD做参考,结果电池电压下降,读数也跟着漂。
- 抗混叠滤波:ADC前端最好加一个RC低通滤波器,截止频率设在10Hz左右,滤掉工频干扰。
重要提醒:ADC采样值要转换成实际温度,需要知道传感器的传递函数。比如热敏电阻,一般是查表或者用Steinhart-Hart方程计算。千万别直接用线性公式,误差会很大。
4.3.2 数据处理——滤波与校准
原始ADC数据直接拿来用?不行。体温计对稳定性要求很高,必须做数据处理。
滤波:我常用的方法是滑动平均滤波。取最近N次采样值求平均,N一般取4~8。这样既能平滑噪声,又不会延迟太大。
举个简单的代码示例:
// 滑动平均滤波,窗口大小4
#define FILTER_WINDOW 4
uint16_t filter_buffer[FILTER_WINDOW];
uint8_t filter_index = 0;
uint32_t filter_sum = 0;
uint16_t adc_filter(uint16_t new_value) {
filter_sum -= filter_buffer[filter_index];
filter_buffer[filter_index] = new_value;
filter_sum += new_value;
filter_index = (filter_index + 1) % FILTER_WINDOW;
return filter_sum / FILTER_WINDOW;
}
校准:每个传感器都有个体差异,尤其是红外传感器。量产的时候,必须做两点校准:低温点和高温点。比如用恒温水槽,在35°C和42°C两个点校准,然后做线性插值。
我记得有一次,产品送检发现精度不合格。排查下来,是校准算法里用了简单的比例缩放,忽略了传感器的非线性。后来改成分段线性插值,才通过认证。嗯,这个教训挺深刻的。
4.3.3 数据输出与显示
处理完的数据,最终要显示出来。体温计一般显示到小数点后一位(比如36.5°C)。注意四舍五入的处理,别出现36.49°C这种奇怪的值。
另外,显示的时候要加单位(°C或°F),还要考虑超温报警。比如体温超过37.3°C,显示红色或者闪烁。这些逻辑虽然简单,但用户体验全靠它们。
小技巧:显示刷新率不用太高,每秒刷新一次就够了。刷新太快反而会让人觉得读数不稳定。我一般用定时器,每1秒更新一次显示缓冲区。
4.4 本章小结
这一章咱们把体温计的需求分析捋了一遍。从功能框图到传感器选型,再到ADC采样和数据处理,每一步都有讲究。说白了,体温计看着简单,但要做好,细节特别多。
下一章,咱们会深入看门狗的具体实现。到时候我会结合体温计的实际场景,讲讲怎么设计一个靠谱的看门狗,防止程序死机。嗯,那才是真正的硬核内容。
公众号:蓝海资料掘金营,微信deep3321