Arduino基础篇(七)-- 如何使用DS18B20数字温度传感器(基于OneWire和DallasTemperature库)

本文介绍了如何利用Arduino和DS18B20数字温度传感器创建一个单总线温度监测系统。DS18B20传感器具有单总线通讯、高精度、宽测量范围和多点组网能力。实验中,通过引入OneWire和DallasTemperature库,只需一个IO口即可实现多个传感器的数据读取。详细步骤包括电路连接、库文件的安装与使用,以及代码实现温度读取和串口通信。实验结果显示,该系统能有效读取并显示温度值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

温度传感器是指能感受温度并转换成可用输出信号的传感器。按测量方式分为接触式和非接触式,按照传感器材料及电子元件分为热电阻和热电偶两类,按照工作原理分为模拟式和数字式。本篇主要介绍数字温度传感器 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 实验材料

  1. Arduino 控制器 ×1
  2. DS18B20模块 ×1
  3. USB数据线 ×1

1.3 相关库导入

        本实验用到两个库,分别为 OneWireDallasTemperature ,前者是单总线库,后者是在前者基础上针对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,请将其设置为0uint8_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()		// 返回全局设备最大分辨率;

补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长路漫漫2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值