系统学习温度传感器模块在开发板上的应用
从零开始掌握温度传感器:DS18B20、TMP102 和 LM75 的实战应用指南
你有没有遇到过这样的场景?
开发板上的系统运行得好好的,突然重启——排查半天才发现是 CPU 过热;或者温室里的植物莫名枯萎,结果是因为角落的温度失控。这些看似简单的问题背后,往往藏着一个关键环节:
精准可靠的温度感知
。
在嵌入式系统中,温度不仅是环境参数,更是安全与性能的“晴雨表”。而现代数字温度传感器模块,正以高精度、低功耗、易集成的优势,成为开发者手中的“标配工具”。
本文不讲空泛理论,而是带你 一步步构建完整的温度采集能力 ——从芯片选型到硬件连接,从寄存器配置到代码实现,结合三大主流传感器(DS18B20、TMP102、LM75)的真实案例,让你真正把知识用起来。
为什么不再用热敏电阻?数字传感器的时代已经到来
过去,我们常用 NTC 热敏电阻测温:通过分压电路接入 ADC,再查表或拟合曲线换算成温度值。听起来简单,实则暗坑无数:
- 非线性严重,需要复杂的软件补偿;
- 易受电源波动和布线干扰影响;
- 多点测量时每路都要独立 ADC 输入,资源吃紧;
- 每个传感器都得单独校准,维护成本高。
而今天的数字温度传感器,出厂即校准,直接输出标准协议数据,就像“会说话的探头”,让开发效率大幅提升。
更重要的是,它们支持 I²C、1-Wire 等通用接口,可以轻松挂载多个设备,配合 MCU 实现分布式监控。无论是做智能风扇控制、电池包温度巡检,还是搭建小型气象站,都能快速落地。
接下来,我们就以三款典型代表为例,深入剖析其工作原理与实战技巧。
DS18B20:单总线王者,如何实现一根线挂几十个温度探头?
如果你需要在一个大棚里布置十几个温度点,又不想拉一堆线,那 DS18B20 几乎是首选方案。
它最大的亮点就是 单总线(1-Wire)通信 ——只需要一根数据线,就能完成供电和通信。更厉害的是,每个 DS18B20 都有唯一的 64 位 ROM 地址,主控可以通过寻址精确访问任意一个传感器,实现真正的“多点组网”。
关键特性一览
| 参数 | 指标 |
|---|---|
| 测温范围 | -55°C ~ +125°C |
| 精度 | ±0.5°C(-10°C ~ +85°C) |
| 分辨率 | 可调 9~12 位(0.5°C ~ 0.0625°C) |
| 接口类型 | 单总线(1-Wire) |
| 工作模式 | 外部供电 / 寄生供电 |
✅ 特别适合长距离布设、电池供电、多节点采集场景
硬件连接要点
- 数据线必须接一个 4.7kΩ 上拉电阻 到 VCC;
- 建议使用外部电源(3–5V),避免寄生供电导致信号不稳定;
- 多个传感器并联在同一总线上即可,无需额外地址设置。
软件驱动核心流程
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(115200);
sensors.begin();
sensors.setResolution(12); // 启用最高分辨率
}
void loop() {
sensors.requestTemperatures(); // 触发所有设备转换
float temp = sensors.getTempCByIndex(0); // 读取第一个设备
if (temp != DEVICE_DISCONNECTED_C) {
Serial.printf("Temperature: %.2f °C\n", temp);
} else {
Serial.println("Failed to read sensor");
}
delay(1000);
}
这段代码简洁但内涵丰富:
-
requestTemperatures()
是广播命令,所有挂在总线上的 DS18B20 同时开始测温;
-
getTempCByIndex(0)
按索引读取,底层自动遍历 ROM 地址;
- 支持多达数十个设备共存,只需增加扫描逻辑即可识别具体位置。
💡 小贴士 :若要定位某个物理位置的传感器,可在初始化时遍历所有 ROM 地址并绑定标签,例如:“Zone_A_Sensor_1”。
TMP102:超小体积+高精度,穿戴设备的理想之选
如果说 DS18B20 胜在“多点组网”,那么 TMP102 就赢在“精巧高效”——TI 推出的这款 I²C 温度传感器,封装仅有 1.6mm × 1.6mm ,却能提供 ±0.25°C 的典型精度,非常适合可穿戴设备、手持仪器等空间敏感型产品。
核心优势拆解
- 12 位 ADC 分辨率 ,最小步进 0.0625°C;
- 功耗极低,正常工作仅 10μA,关断模式低至 0.5μA;
- 支持中断报警(ALERT 引脚),温度越限时主动通知 MCU;
- I²C 接口支持 4 种地址选择,最多可接 4 片不冲突。
这意味着你可以把它藏进耳机壳、手表主板甚至医疗贴片中,持续监测体温或设备温升,而不拖累续航。
I²C 通信怎么配?手把手教你读写寄存器
TMP102 内部有三个主要寄存器:
-
0x00:温度寄存器(只读)
-
0x01:配置寄存器(可写)
-
0x02 / 0x03:高温/低温阈值寄存器
下面这段代码展示了如何手动配置并读取温度:
#include <Wire.h>
#define TMP102_ADDR 0x48
void setup() {
Wire.begin();
Serial.begin(115200);
// 设置为连续转换模式
Wire.beginTransmission(TMP102_ADDR);
Wire.write(0x01); // 指向配置寄存器
Wire.write(0x60); // 高字节:开启连续转换
Wire.write(0x00); // 低字节:默认设置
Wire.endTransmission();
}
float readTemp() {
Wire.beginTransmission(TMP102_ADDR);
Wire.write(0x00); // 请求读取温度寄存器
Wire.endTransmission(false); // 不释放总线
Wire.requestFrom(TMP102_ADDR, 2);
if (Wire.available() == 2) {
int16_t raw = (Wire.read() << 8) | Wire.read();
raw >>= 4; // 提取高 12 位
if (raw & 0x800) raw |= 0xF000; // 负数符号扩展
return raw * 0.0625;
}
return -999;
}
void loop() {
float t = readTemp();
Serial.printf("TMP102: %.2f °C\n", t);
delay(1000);
}
🔍
关键细节解析
:
- 温度寄存器返回的是
12 位补码
,右移 4 位后才是有效数据;
- 负温度需进行符号扩展(最高位为1时补全高位);
- 使用
endTransmission(false)
可实现
复合格式传输
(Repeated Start),提高通信稳定性。
⚠️ 常见误区提醒 :不要忽略 I²C 上拉电阻!虽然 TMP102 内部弱上拉可用,但在噪声环境中建议外接 2.2kΩ~4.7kΩ 的上拉电阻到 VCC。
LM75:不只是测温,更是系统的“安全卫士”
前面两款侧重于“测量”,而 LM75 的定位更偏向“保护”——它是一款集成了温度感应与比较功能的恒温器,常用于 CPU 散热管理、电机过热保护、电源系统故障检测等场景。
它的核心价值在于: 当温度超过设定阈值时,OS 引脚会立即拉低,无需软件干预即可触发紧急动作 。
典型应用场景
想象一下你的嵌入式主板正在满负荷运行,CPU 温度飙升。此时 LM75 检测到温度超过 TOS(如 80°C),立刻通过 OS 引脚向看门狗芯片发出中断,强制系统进入安全模式或切断供电——这就是硬件级的“熔断机制”。
关键参数速览
| 项目 | 指标 |
|---|---|
| 测温范围 | -55°C ~ +125°C |
| 精度 | ±2°C(全温区) |
| 分辨率 | 0.125°C(11 位) |
| 输出模式 | 开漏 OS 引脚,可编程极性 |
| 工作频率 | 默认 1Hz 采样 |
✅ 成本低、响应快、兼容性强,已被 ST、TI 等多家厂商推出替代型号(如 STTS75)
如何设置报警阈值?
LM75 有两个关键寄存器:
-
TOS
:过温关断点(一旦超过,OS 触发)
-
THYST
:回差温度(低于此值,OS 恢复)
例如:
- 设 TOS = 80°C,THYST = 75°C → 当温度 >80°C 时报警,<75°C 才解除
- 避免频繁抖动,提升系统稳定性
写入操作示例(I²C):
void setOverTempThreshold(float temp) {
int16_t val = (int)(temp / 0.125) & 0xFFFE; // 11位对齐,最低位保留0
Wire.beginTransmission(0x48);
Wire.write(0x03); // 指向 TOS 寄存器
Wire.write(val >> 8);
Wire.write(val & 0xFF);
Wire.endTransmission();
}
📌 布局建议 :将 LM75 放置在发热源附近(如 MOSFET、稳压器),确保及时捕捉热点温度,但也要注意避免被局部高温“误导”。
实战系统设计:打造一个智能温控节点
现在我们把上面的知识串起来,构想一个典型的温度监控系统:
[DS18B20 ×3] ← 分布式测温
↓
[ESP32] —— [OLED 显示]
↓ ↘
[WIFI] [Relay] ← 控制加热/散热
↓
[Cloud Platform]
系统功能清单
- 每秒采集三个区域温度;
- OLED 实时显示平均值;
- 若任一区域超温(>35°C),点亮红色 LED 并通过继电器启动风扇;
- 数据通过 Wi-Fi 发送至云端(MQTT 或 HTTP);
- 支持远程查看历史趋势与报警记录。
关键设计考量
- 电源去耦 :每个传感器 VCC 引脚旁加 0.1μF 陶瓷电容,滤除高频噪声;
- 总线匹配 :I²C 使用 4.7kΩ 上拉,1-Wire 同样不可省略;
- 热隔离布局 :传感器远离主控芯片和功率器件,反映真实环境温度;
-
固件健壮性
:
- 加入通信超时重试(如 I²C NACK 处理);
- 对异常读数做滑动平均滤波;
- 检测传感器断线状态并降级运行; -
功耗优化
:
- TMP102/LM75 在非采样期进入 Shutdown 模式;
- 使用 GPIO 中断唤醒代替轮询; -
地址管理
:
- 多个 I²C 设备注意地址冲突(可用 ADDR 引脚切换);
- DS18B20 自带唯一 ID,天然支持动态发现。
常见问题与调试秘籍
你在实际项目中是否也遇到过这些问题?
🔧
问题1:读出来的温度总是 85°C 或 -127°C?
→ 很可能是初始化失败或通信异常。检查:
- 上拉电阻是否焊接良好;
- 是否正确调用了
begin()
初始化函数;
- 总线是否存在短路或干扰。
🔧
问题2:多个 DS18B20 无法同时识别?
→ 确保使用了足够驱动能力的电源。寄生供电模式下,总线电容过大可能导致部分设备掉电。
🔧
问题3:I²C 扫描不到设备?
→ 用万用表确认 SDA/SCL 是否连通;
→ 查阅芯片手册确认实际地址(有些模块 ADDR 引脚已接地);
→ 使用逻辑分析仪抓包,观察是否有 ACK 响应。
🔧
问题4:温度跳变剧烈?
→ 检查 PCB 布局是否靠近开关电源或大电流走线;
→ 添加软件滤波算法,如移动平均或卡尔曼滤波。
写在最后:温度感知,是智能化的第一步
今天我们深入探讨了三种主流数字温度传感器的应用实践,你会发现:
现代传感技术早已不再是“模拟时代”的繁琐工程,而是迈向了
即插即用、可编程、网络化
的新阶段。
DS18B20 让你轻松实现“一线上百点”的分布式监测,
TMP102 帮你在微型设备中实现高精度温感,
LM75 则为系统构建起一道坚实的硬件级安全防线。
掌握这些模块的使用,并不只是学会几个库函数那么简单——更重要的是建立起一种系统思维:
如何根据应用场景权衡精度、功耗、成本与可靠性?如何通过软硬协同设计提升整体鲁棒性?
未来,随着边缘 AI 的发展,温度数据将不再只是“读出来看看”,而是参与到自适应调控、故障预测、能耗优化等智能决策闭环中。比如:
- 结合机器学习模型预测设备寿命;
- 动态调整采样频率以平衡功耗与响应速度;
- 构建多传感器融合系统,提升环境感知维度。
所以,不妨从今天开始,在你的下一个项目里加入一个温度传感器试试看。也许它不会立刻改变世界,但它一定会让你离“真正的智能”更近一步。
如果你在实现过程中遇到了其他挑战,欢迎在评论区分享讨论。
更多推荐


所有评论(0)