温度传感器是指能感受温度并转换成可用输出信号的传感器。按测量方式分为接触式和非接触式,按照传感器材料及电子元件分为热电阻和热电偶两类,按照工作原理分为模拟式和数字式。本篇主要介绍数字温度传感器 DS18B20的使用。
1 简介:Why DS18B20?
以往的温度传感器输出的是模拟量,我们还要增加额外的 A/D 和 D/A 芯片进行转换,那么对于 Arduino 外部接口资源并不丰富是一大挑战,同时利用率不高,那么 DS18B20 Temperature Sensor Module 就很好的解决了这个问题,DS18B20数字温度传感器采用单总线模式,和MCU通讯仅需要一个IO,完全适用 Arduino 平台,使用户可轻松地组建传感器网络。

DS18B20使用集成芯片,采用单总线技术,能够有效的减小外界的干扰,提高测量的精度。其输出的是数字信号,接线非常方便,封装成不同方式可以应用于不同场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。
1.1 技术参数
(1)供电方便。单总线数字温度传感器 DS18B20,外界供电电压范围为 3.0 V 至 5.5 V,无需备用电源。
(2)测量范围宽,精度高。测量温度范围为 -55°C 至 +125℃,华氏相当于是 67°F 到 257°F,-10°C 至 +85°C 范围内精度为 ±0.5°C。
(3)测量参数可配置。温度传感器可编程的分辨率为 9~12 位,用户课通过程序设定。
(4)多点组网。每一个 DS18B20 包含一个独特的序号,多个 DS18B20 可以同时存在于一条总线,实现多点测温。
(5)掉电保护功能。内部含有EEPROM,在系统掉电以后,仍可保存分辨率及报警温度的设定值。
1.2 实验材料
- Arduino 控制器 ×1
- DS18B20模块 ×1
- USB数据线 ×1
1.3 相关库导入
本实验用到两个库,分别为 OneWire
和 DallasTemperature
,前者是单总线库,后者是在前者基础上针对Dallas温度传感器封装的库。可以采用下面两种方法导入:
- 下载相关库文件,两个库均在GitHub上。下载两个库的zip包后,在Arduino IDE中选择:
项目 → 加载库 → 添加一个 .ZIP库
,两个库添加完成后就可以使用了。 - 在Arduino IDE中点击
项目 → 加载库 → 管理库
,查找 [OneWire] 和 [DallasTemperature],选择最新版本进行安装。
1.4 实验步骤
1、搭建电路图
找出 DS18B20 Temperature Sensor Module 的电源线,地线和数据线;电源线,地线分别连到 Arduino 实验板的+5V,GND 端口,数据总线连至数字端口。实验原理图如下图所示。

2、代码测试
本篇主要实现 Arduino 读取温度传感器DS18B20的值,然后计算出当前温度,通过串口发送给PC,PC串口调试助手显示。程序设计流程如下:

测试代码:
/*********************************************************************
——————1.开发环境:Arduino IDE——————————————————————————————————
——————2.使用开发板型号:Arduino UNO——————————————————————
——————3.传感器类型:DS18B20数字温度传感器———————————————————————
*********************************************************************/
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2 // 定义DS18B20数据口连接UNO的2脚
OneWire oneWire(ONE_WIRE_BUS); // 声明连接在单总线上的单总线设备
DallasTemperature sensors(&oneWire); // 声明一个传感器对象
void setup(){
Serial.begin(9600); // 设置串口通信波特率
sensors.begin(); // 初始总线
}
void loop(){
sensors.requestTemperatures(); // 向总线上的设备发送温度转换请求,默认情况下该方法会阻塞
Serial.print("此时测量的温度为:");
Serial.print(sensors.getTempCByIndex(0)); // 获取索引号0的传感器摄氏温度数据,并串口输出
Serial.println(" ℃\n");
delay(500);
}
3、效果演示

1.5 相关库说明
1、OneWire库
这是用于1-Wire总线通讯的库,单总线(One-Wire)是Dallas公司的一项特有的总线技术,它采用单根信号线实现数据的双向传输,具有节省I/O口资源、结构简单、便于扩展和维护等优点。One-Wire适用于单个主机的系统,能够控制一个或多个从机设备。OneWire库是针对单总线推出的扩展库,想要了解更多,请阅读:OneWire和DallasTemperature库。
2、DallasTemperature库
这个库在上面那个库之上再封装了一层,方便直接使用DS18B20等系列的温度传感器。DallasTemperature库常用的成员函数:
// 构造函数 DallasTemperature(OneWire*)
DallasTemperature sensor(OneWire*) // 构造一个温度传感器对象。
void begin() // 初始化总线,获取总线上有多少OneWire设备和其中多少为DS18等系列设备,,并为每个传感器设置位分辨率(12位)。
void requestTemperatures(void)
/* 向总线上所有设备发送温度转换指令,阻塞模式下该方法将阻塞一定时间;阻塞时间和全局设备最大分辨率以及
是否在阻塞时检查转换完成标志有关,分辨率影响: 9:最大94ms;10:最大188ms;11:最大375ms;其它:最大750ms;*/
float getTempFByIndex(uint8_t deviceIndex)
// 功能读取并返回传感器的温度读数,如果发送错误则返回默认值。deviceIndex只是总线上传感器的位置。
如果您仅在总线上使用一个DS18B20,请将其设置为0。
uint8_t getDS18Count() // 返回DS18等系列设备数量。
void setResolution(uint8_t newResolution)
// 该功能将DS18B20的内部模数转换器的分辨率设置为9位,10位,11位或12位,分别对应于0.5°C,0.25°C,0.125°C和0.0625°C的增量。
bool getWaitForConversion() // 函数返回waitForConversion标志的值。当您要检查温度转换是否完成时,此功能很有用。
setHighAlarmTemp()&setLowAlarmTemp() // 功能可设置设备的内部高温和低温警报(以摄氏度为单位)。有效范围是-55至125°C
bool hasAlarm() // 如果温度超过上限和下限警报温度设置时设备处于警报状态,此功能将返回true。
uint8_t getResolution() // 返回全局设备最大分辨率;
补充
- OneWire库:https://github.com/PaulStoffregen/OneWire
- DallasTemperature库:https://github.com/milesburton/Arduino-Temperature-Control-Library