一起玩转树莓派(9)——DS18B20测温模块应用

简介: 一起玩转树莓派(9)——DS18B20测温模块应用

关于使用树莓派测量温度,我们之前在学习模数转换的相关博客中已经有过应用。其实除了使用传统的AD采集温度数据外,我们也可以通过树莓派中的单总线技术结合DS18B20传感器来更加方便精准的测量环境温度。


一、认识DS18B20模块与单总线通信


     DS18B20是一种改进型的智能温度传感器。与传统的热敏电阻相比,其可以直接读出被测量的温度,并且能够根据实际应用场景中的要求进行简单的编程。无论是读取数据还是写入数据,DS18B20都只需要一条接口线,因此其使用的是单总线的通讯协议。DS18B20模块的主要优势在于其抗干扰能力强,精度高,无需复杂的软件处理可以直接输出温度数据。本次实验,我们使用的DS18B20模块如下图所示:


image.png


可以看到此模块有3个引脚,除了电源引脚和接地引脚外,剩下的一个就是用来输出温度数据的引脚。


     单总线通信被称为one-wire通信,因此又常常被简称为1w总线通信。首先我们需要先开始树莓派的1w总线通信功能,打开树莓派的Raspberry Configuration菜单,在Interfaces选项中将1-Wire功能开启,如下图所示。


image.png


如果我们是通过无交互页面的终端登录的树莓派,也可以通过修改配置文件来开启1-Wire功能,在树莓派Linux系统的根目录下,找到如下路径的文件:


/boot/config.txt

在其中添加如下一行文本即可:


dtoverlay=w1-gpio

需要注意,添加之后需要重启树莓派。需要注意,1-Wire功能默认将使用树莓派的BCM编码为GPIO4的引脚作为通信引脚,如何我们要进行自定义,可以在刚才的配置文件中进行指定,如下:


dtoverlay=w1-gpio,gpiopin=18

其表示要使用BCM编码为GPIO18的引脚作为通信引脚。


做完了上面的操作后,我们可以在树莓派终端中使用如下指令查看单总线是否启动成功:


$ lsmod

终端输出效果如下:

image.png



可以看到,如果有显示w1_gpio和wire两个部分,则表示单总线已经启动成功,分别在终端执行如下两条命令:


$ modprobe w1-gpio

$ modprobe w1-therm


如果终端没有输出任何信息,则表示单总线已经初始化完成,此时实际上我们已经可以让DS18B20进行工作了。


二、通过DS18B20模块获取环境温度


通过前面的操作,我们已经完成了基本的准备工作,将DS18B20连接到树莓派,引脚对应如下:


DS18B20 树莓派

+ 3.3V

- GND

out BCM编码为GPIO4的引脚

之后我们从树莓派的终端进入如下目录:


/sys/bus/w1/devices

在此目录下,我们可以看到有两个文件,如下图所示:


image.png


其中以28-xxx开头的文件夹中的文件记录的就是1w单总线输入的数据,需要注意,读者操作时,此文件夹的名称和笔者可能并不完全一样,其表示传感器设备的编号,大家这里只需要找到28-xx开头的文件夹即可。在此文件夹中,有一个名为w1_slave的文件,此文件中记录的就是传感器的温度数据,我们可以打开看看,内容如下:


d2 01 55 05 7f 7e 81 66 59 : crc=59 YES

d2 01 55 05 7f 7e 81 66 59 t=29125


其中,大部分数据我们都无需关心,其最后的t=29125就是当前的环境温度,将其转换为摄氏温度,直接除以1000即可,例如上面的数据表明当前的环境温度是29.125摄氏度。


     目前为止,我们已经可以非常轻松的获取DS18B20模块提供的温度数据了,但是查看的方式非常不智能,其实我们可以通过Python程序来不停的读取此数据文件,解析出其中的温度数据,之后无论是做记录还是进行其他元件控制都会非常方便。编写示例代码如下:


#coding:utf8


import os,time

# 传感器编号

name = "28-020692455d61"

# 设备记录数据的文件地址

device_file ='/sys/bus/w1/devices/' + name + '/w1_slave'


# 读取文件数据

def read_temp_raw():

   f = open(device_file,'r')

   lines = f.readlines()

   f.close()

   return lines


# 解析温度数据

def read_temp():

   lines = read_temp_raw()

   # 此行默认不是'YES' 表明未读取到有效数据

   while lines[0].strip()[-3:] != 'YES':

       time.sleep(0.2)

       # 循环继续读

       lines = read_temp_raw()

   # 找到第2行的't='的位置

   equals_pos = lines[1].find('t=')

   # 将温度数据取出

   if equals_pos != -1:

       temp_string = lines[1][equals_pos+2:]

       temp_c = float(temp_string)/1000.0

   return temp_c


while True:

   print('%fC'%read_temp())

   time.sleep(1)

在树莓派中运行上面代码,可以看到控制台输出的当前温度数据,如下图所示:


image.png


三、讲在后面


     本篇博客,我们介绍了如何使用one-wire单总线进行外设数据的读取,DS18B20只是作为示例,抛砖引玉,通过树莓派的1w总线,我们还可以连接更多的外设实现更加有创意的东西,大家开动脑筋,尽情玩耍吧!

目录
相关文章
|
传感器 Linux Python
一起玩转树莓派(19)——红外遥控控制实验
红外遥控是生活中非常常见的电子器具,电视机,空调,音响等电器都可以通过遥控器进行控制。本篇博客,我们尝试来通过红外发生器和红外信号接受器来进行红外控制实验,在树莓派上通过红外遥控的按键来处理LED灯的控制。
2027 0
|
传感器
蓝桥杯之单片机学习(二十八)——详解A/D、D/A、PCF8591、AD与DA的综合使用(附官方驱动的一个坑)
蓝桥杯之单片机学习(二十八)——详解A/D、D/A、PCF8591、AD与DA的综合使用(附官方驱动的一个坑)
623 0
蓝桥杯之单片机学习(二十八)——详解A/D、D/A、PCF8591、AD与DA的综合使用(附官方驱动的一个坑)
|
7月前
|
传感器
基于STC8H8K64U和DS18B20的温度采集和LabVIEW上位机显示
基于STC8H8K64U和DS18B20的温度采集和LabVIEW上位机显示
基于STC8H8K64U和DS18B20的温度采集和LabVIEW上位机显示
|
7月前
|
传感器 机器人
|
存储 传感器 编解码
51单片机--DS18B20温度感应器
51单片机--DS18B20温度感应器
182 0
|
传感器 存储
手持VH501TC多功能混合传感器信号采集读数仪使用方法
电池仓位于设备背面下半部分, 仅当使用 5 号电池供电时需要操作电池仓,锂电池供电的设备无需操作电池仓。默认情况下,电池仓盖处于锁定状态无法直接打开,在需要安装或者更换电池时,应将水平拨动开关推至解锁侧,在电池安装完成后必须将开关推至锁定侧。注意:在安装电池时必须按照仓内+/-符号对应电池的正/负极,错误的安装极性会永久性损坏设备。
手持VH501TC多功能混合传感器信号采集读数仪使用方法
|
传感器
多功能手持读数仪 VH501TC常见问题与注意事项
常见问题 1.不能开机检查电池是否有电,检查电池安装极性是否正确。 2.不显示振弦传感器测量值检查传感器连线是否正确,详见“传感器接口定义” ;尝试不同的振弦激励方法,详见“振弦传感器激方法修改” 。
多功能手持读数仪 VH501TC常见问题与注意事项
|
传感器
LabVIEW控制Arduino采集多路DS18B20温度数值(进阶篇—3)
本篇博文将实现LabVIEW控制Arduino采集多路DS18B20温度数值,关于LabVIEW控制Arduino在基础篇已经讲解过很多种类温度传感器的采集方法。