LM35 温度传感器介绍
【本文基于Arduino项目】
1. LM35 温度传感器简介
LM35 是一款 精密模拟温度传感器,由德州仪器(TI)推出,具有线性输出、无需校准、低功耗等特点,广泛应用于环境监测、工业控制等领域。
主要特性
参数 | 规格 |
---|---|
测量范围 | -55°C ~ +150°C |
精度 | ±0.5°C(室温下) |
输出信号 | 模拟电压(10mV/°C) |
供电电压 | 4V ~ 30V(推荐 5V) |
接口类型 | 模拟输出(直接连接 Arduino ADC) |
封装形式 | TO-92(最常用)、SOIC |
优势
✅ 无需校准:输出电压与温度呈线性关系(10mV/°C)。
✅ 低功耗:工作电流约 60μA。
✅ 低成本:适合学生和爱好者项目。
2. 硬件连接(Arduino 示例)
LM35 只需 3 根线即可工作(供电、地、信号输出)。
接线方式
LM35 引脚 | Arduino 引脚 |
---|---|
VCC(+Vs) | 5V |
GND | GND |
Vout(信号) | A0(或其他模拟输入引脚) |
⚠️ 注意:
- 如果使用 3.3V 供电(如 ESP8266/ESP32),需将 VCC 接 3.3V,但测量范围会缩小(0°C ~ +110°C)。
- 避免将 LM35 靠近发热元件(如 Arduino 的稳压器)。
3. Arduino 代码示例
基础代码(直接读取温度)
void setup() {Serial.begin(9600); // 初始化串口
}void loop() {int sensorValue = analogRead(A0); // 读取模拟值(0~1023)float voltage = sensorValue * (5.0 / 1023.0); // 转换为电压(0~5V)float temperature = voltage * 100.0; // 转换为温度(10mV/°C)Serial.print("温度: ");Serial.print(temperature);Serial.println(" °C");delay(1000); // 1秒更新一次
}
优化代码(滤波与精度提升)
const int numReadings = 10; // 滑动平均滤波的样本数
int readings[numReadings]; // 存储历史数据
int index = 0; // 当前索引void setup() {Serial.begin(9600);for (int i = 0; i < numReadings; i++) {readings[i] = 0; // 初始化数组}
}void loop() {// 读取当前值并存入数组readings[index] = analogRead(A0);index = (index + 1) % numReadings;// 计算滑动平均值float average = 0;for (int i = 0; i < numReadings; i++) {average += readings[i];}average /= numReadings;// 转换为温度float voltage = average * (5.0 / 1023.0);float temperature = voltage * 100.0;Serial.print("温度: ");Serial.print(temperature);Serial.println(" °C");delay(500); // 0.5秒更新一次
}
4. 常见问题与解决方法
Q1:温度读数跳动大?
- 原因:模拟信号受干扰或电源噪声。
- 解决:
- 在 LM35 的 VCC 和 GND 之间加 0.1μF 电容。
- 使用代码中的 滑动平均滤波(见优化代码)。
Q2:测量值偏高/偏低?
- 原因:ADC 参考电压不准确(默认 5V 可能有误差)。
- 解决:
- 使用
analogReference(INTERNAL)
切换为 Arduino 内部 1.1V 基准(需调整计算逻辑)。 - 校准公式:
voltage = sensorValue * (实际电压 / 1023.0)
(用万用表测量 Arduino 5V 实际值)。
- 使用
Q3:如何测量负温度?
- 方法:
- 使用 LM35DZ(支持 -55°C ~ +150°C),将 VCC 接 双电源(±5V),Vout 接 Arduino ADC(需分压电路)。
- 或改用 DS18B20(数字传感器,直接支持负温度)。
5. 进阶应用
(1) 多传感器组网
// 连接多个 LM35 到 A0、A1、A2...
float readLM35(int pin) {int value = analogRead(pin);return (value * 5.0 / 1023.0) * 100.0;
}void loop() {float temp1 = readLM35(A0);float temp2 = readLM35(A1);Serial.print("传感器1: "); Serial.print(temp1); Serial.println(" °C");Serial.print("传感器2: "); Serial.print(temp2); Serial.println(" °C");delay(1000);
}
(2) 与 OLED 显示屏结合
使用 Adafruit_SSD1306
库在 OLED 上显示温度:
#include <Adafruit_SSD1306.h>Adafruit_SSD1306 display(128, 64, &Wire, -1);void setup() {display.begin(SSD1306_SWITCHCAPVCC, 0x3C);display.clearDisplay();
}void loop() {float temp = (analogRead(A0) * 5.0 / 1023.0) * 100.0;display.clearDisplay();display.setTextSize(2);display.setTextColor(SSD1306_WHITE);display.setCursor(0, 0);display.print("Temp: ");display.print(temp);display.println(" C");display.display();delay(1000);
}
(3) 低功耗模式
适用于电池供电项目:
- 通过 MOSFET 控制 LM35 电源,仅在测量时通电。
- 使用 Arduino 的 睡眠模式(需外部中断唤醒)。
6. 替代方案
传感器 | 优势 | 缺点 |
---|---|---|
DS18B20 | 数字信号、支持负温度、精度高 | 需单总线协议(代码复杂) |
DHT11/DHT22 | 温湿度一体、数字输出 | 精度较低、响应慢 |
BME280 | 气压+温度+湿度三合一 | 价格较高 |
7. 总结
- LM35 是一款简单易用的模拟温度传感器,适合快速原型开发。
- 接线简单:VCC → 5V,GND → GND,Vout → Arduino 模拟输入。
- 代码关键:
analogRead()
+ 电压转换(电压 × 100 = 温度
)。 - 优化方向:滤波、校准、低功耗设计。
如果有具体问题(如负温度测量或干扰处理),欢迎进一步讨论! ❄️🔥