Arduino - 温度传感器
Arduino - 温度测量
Section titled “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接线
Section titled “LM35接线”LM35有三个引脚。当传感器平面朝向您时,引脚从左到右依次是:
- 引脚1 (Vs) → Arduino 5V
- 引脚2 (Vout) → Arduino模拟引脚A0
- 引脚3 (GND) → Arduino GND
LM35 Arduino草图
Section titled “LM35 Arduino草图”/** * @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);}理解“魔法数字”
Section titled “理解“魔法数字””旧的教程经常使用一个像 0.48828125 这样的“魔法数字”。我们的代码通过显式展示计算过程来避免这种情况,这是一种更好的做法。转换依赖于两个步骤:
- 模拟值到电压: 我们将
analogRead()的0-1023读数转换为电压,已知Arduino的参考电压是5V (5000mV)。 - 电压到温度: 我们使用LM35的数据手册规范(10mV/°C)将电压转换为温度读数。
方法2:DS18B20数字传感器 (现代方法)
Section titled “方法2:DS18B20数字传感器 (现代方法)”DS18B20 是一款数字温度传感器,比LM35更准确,并且对噪声的抵抗力更强。它使用1-Wire协议进行通信,允许您将多个传感器连接到单个数字引脚。
为何使用DS18B20?
Section titled “为何使用DS18B20?”- 数字信号: 在长距离导线上受电噪声影响较小。
- 高精度: ±0.5°C的精度。
- 唯一地址: 每个传感器都有一个唯一的64位地址,允许在同一数据总线上连接多个传感器。
- 无需外部校准: 出厂时已校准。
- 1 × DS18B20温度传感器
- 1 × 4.7kΩ电阻 (上拉电阻 pull-up resistor)
DS18B20接线
Section titled “DS18B20接线”DS18B20也有三个引脚。请务必查阅您的传感器数据手册,但常见的引脚排列是(从左到右,平面朝向您):
- 引脚1 (GND) → Arduino GND
- 引脚2 (DQ) → Arduino数字引脚2
- 引脚3 (VDD) → Arduino 5V
关键步骤: 就像DHT传感器一样,1-Wire协议需要一个上拉电阻 (pull-up resistor)。将 4.7kΩ电阻 连接在 DQ (数据) 和 VDD (电源) 线之间。
所需库和草图
Section titled “所需库和草图”您需要两个库: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);}项目构思:简易恒温器
Section titled “项目构思:简易恒温器”将任一传感器与两个LED(一个红色,一个蓝色)和一个蜂鸣器结合,创建一个简单的环境监测器。
- 如果
温度 > 28°C,点亮红色LED。 - 如果
温度 < 20°C,点亮蓝色LED。 - 对于更高级的版本,如果温度超过关键安全阈值,则让蜂鸣器响起。