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

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

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

1、认识DS18B20模块与单总线通讯

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

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

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

      单总线通讯被称为one-wire通讯,所以又经常被简称为1w总线通讯。首先咱们须要先开始树莓派的1w总线通讯功能,打开树莓派的Raspberry Configuration菜单,在Interfaces选项中将1-Wire功能开启,以下图所示。ide

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

若是咱们是经过无交互页面的终端登陆的树莓派,也能够经过修改配置文件来开启1-Wire功能,在树莓派Linux系统的根目录下,找到以下路径的文件:学习

/boot/config.txt

在其中添加以下一行文本便可:编码

dtoverlay=w1-gpio

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

dtoverlay=w1-gpio,gpiopin=18

其表示要使用BCM编码为GPIO18的引脚做为通讯引脚。blog

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

$ lsmod

终端输出效果以下:ip

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

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

$ modprobe w1-gpio
$ modprobe w1-therm

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

2、经过DS18B20模块获取环境温度

经过前面的操做,咱们已经完成了基本的准备工做,将DS18B20链接到树莓派,引脚对应以下:

DS18B20 树莓派
+ 3.3V
- GND
out BCM编码为GPIO4的引脚

以后咱们从树莓派的终端进入以下目录:

/sys/bus/w1/devices

在此目录下,咱们能够看到有两个文件,以下图所示:

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

其中以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)

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

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

3、讲在后面

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

专一技术,懂的热爱,愿意分享,作个朋友

QQ:316045346

相关文章
相关标签/搜索