Skip to content

Arduino - 温度传感器

温度测量是无数应用中的一项基本任务,从气象站到安全系统。本教程将指导您如何使用两种不同类型的温度传感器与您的Arduino:经典的模拟传感器 (LM35) 和现代数字传感器 (DS18B20)。

方法1:LM35模拟传感器 (经典方法)

Section titled “方法1:LM35模拟传感器 (经典方法)”

LM35 是一款精密集成电路温度传感器,其输出电压与摄氏(Centigrade)温度呈线性比例关系。它使用简单,但作为模拟传感器,其精度可能受到噪声和电压波动的影响。

  • 输出: 线性,每摄氏度+10mV的比例系数。
  • 精度: 室温下通常为±0.5°C。
  • 范围: −55°C至150°C。
  • 1 × Arduino Uno R3
  • 1 × 面包板 (Breadboard)
  • 1 × LM35传感器
  • 杜邦线 (Jumper wires)

LM35有三个引脚。当传感器平面朝向您时,引脚从左到右依次是:

  • 引脚1 (Vs) → Arduino 5V
  • 引脚2 (Vout) → Arduino模拟引脚A0
  • 引脚3 (GND) → Arduino GND
/**
* @file lm35_analog_temp_sensor.ino
* @brief 从LM35模拟传感器读取温度并将其打印到串行监视器。
*/
// --- 常量 ---
const int TEMP_SENSOR_PIN = A0; // 连接到LM35 Vout的模拟引脚
void setup() {
// 初始化串行通信,用于输出结果
Serial.begin(9600);
Serial.println("LM35 Temperature Sensor Example");
}
void loop() {
// 从传感器读取原始模拟值 (0-1023)
int sensorValue = analogRead(TEMP_SENSOR_PIN);
// 将模拟读数转换为电压(单位毫伏)
// Arduino的ADC有1024个步进(0-1023),参考电压为5V(5000mV)。
// 电压 (mV) = (传感器读数 / 1024.0) * 5000.0
float voltage = sensorValue * (5000.0 / 1024.0);
// 将电压转换为摄氏温度
// LM35的比例系数是每摄氏度10mV。
// 温度 (°C) = 电压 (mV) / 10
float temperatureC = voltage / 10.0;
// 将温度打印到串行监视器
Serial.print("Temperature: ");
Serial.print(temperatureC);
Serial.println(" °C");
// 在下一次读取前等待一秒
delay(1000);
}

旧的教程经常使用一个像 0.48828125 这样的“魔法数字”。我们的代码通过显式展示计算过程来避免这种情况,这是一种更好的做法。转换依赖于两个步骤:

  1. 模拟值到电压: 我们将 analogRead() 的0-1023读数转换为电压,已知Arduino的参考电压是5V (5000mV)。
  2. 电压到温度: 我们使用LM35的数据手册规范(10mV/°C)将电压转换为温度读数。

方法2:DS18B20数字传感器 (现代方法)

Section titled “方法2:DS18B20数字传感器 (现代方法)”

DS18B20 是一款数字温度传感器,比LM35更准确,并且对噪声的抵抗力更强。它使用1-Wire协议进行通信,允许您将多个传感器连接到单个数字引脚。

  • 数字信号: 在长距离导线上受电噪声影响较小。
  • 高精度: ±0.5°C的精度。
  • 唯一地址: 每个传感器都有一个唯一的64位地址,允许在同一数据总线上连接多个传感器。
  • 无需外部校准: 出厂时已校准。
  • 1 × DS18B20温度传感器
  • 1 × 4.7kΩ电阻 (上拉电阻 pull-up resistor)

DS18B20也有三个引脚。请务必查阅您的传感器数据手册,但常见的引脚排列是(从左到右,平面朝向您):

  • 引脚1 (GND) → Arduino GND
  • 引脚2 (DQ) → Arduino数字引脚2
  • 引脚3 (VDD) → Arduino 5V

关键步骤: 就像DHT传感器一样,1-Wire协议需要一个上拉电阻 (pull-up resistor)。将 4.7kΩ电阻 连接在 DQ (数据) 和 VDD (电源) 线之间。

您需要两个库:OneWire 和 DallasTemperature。从Arduino库管理器中安装它们。

/**
* @file ds18b20_digital_temp_sensor.ino
* @brief 从DS18B20数字传感器读取温度并打印。
*/
#include <OneWire.h>
#include <DallasTemperature.h>
// --- 常量 ---
const int ONE_WIRE_BUS_PIN = 2; // 数据线连接到Arduino的数字引脚2
// --- 全局对象 ---
// 设置一个oneWire实例,用于与任何OneWire设备通信
OneWire oneWire(ONE_WIRE_BUS_PIN);
// 将我们的oneWire引用传递给Dallas Temperature传感器
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(9600);
Serial.println("DS18B20 Digital Temperature Sensor Example");
// 启动库
sensors.begin();
}
void loop() {
// 请求总线上所有设备的温度
Serial.print("Requesting temperatures...");
sensors.requestTemperatures();
Serial.println("DONE");
// 获取第一个设备(索引0)的摄氏温度
float temperatureC = sensors.getTempCByIndex(0);
// 检查数据是否有效。-127.00的值表示读取错误。
if (temperatureC == DEVICE_DISCONNECTED_C) {
Serial.println("Error: Could not read temperature data");
return;
}
// 打印数据
Serial.print("Temperature: ");
Serial.print(temperatureC);
Serial.println(" °C");
delay(1000);
}

将任一传感器与两个LED(一个红色,一个蓝色)和一个蜂鸣器结合,创建一个简单的环境监测器。

  • 如果 温度 > 28°C,点亮红色LED。
  • 如果 温度 < 20°C,点亮蓝色LED。
  • 对于更高级的版本,如果温度超过关键安全阈值,则让蜂鸣器响起。