壮心未与年俱老,死去犹能作鬼雄。这篇文章主要讲述一起玩转树莓派——DS18B20测温模块应用相关的知识,希望能为你提供帮助。
一起玩转树莓派(9)——DS18B20测温模块应用关于使用树莓派测量温度,我们之前在学习模数转换的相关博客中已经有过应用。其实除了使用传统的AD采集温度数据外,我们也可以通过树莓派中的单总线技术结合DS18B20传感器来更加方便精准的测量环境温度。
一、认识DS18B20模块与单总线通信DS18B20是一种改进型的智能温度传感器。与传统的热敏电阻相比,其可以直接读出被测量的温度,并且能够根据实际应用场景中的要求进行简单的编程。无论是读取数据还是写入数据,DS18B20都只需要一条接口线,因此其使用的是单总线的通讯协议。DS18B20模块的主要优势在于其抗干扰能力强,精度高,无需复杂的软件处理可以直接输出温度数据。本次实验,我们使用的DS18B20模块如下图所示:
文章图片
可以看到此模块有3个引脚,除了电源引脚和接地引脚外,剩下的一个就是用来输出温度数据的引脚。
单总线通信被称为one-wire通信,因此又常常被简称为1w总线通信。首先我们需要先开始树莓派的1w总线通信功能,打开树莓派的Raspberry Configuration菜单,在Interfaces选项中将1-Wire功能开启,如下图所示。
文章图片
如果我们是通过无交互页面的终端登录的树莓派,也可以通过修改配置文件来开启1-Wire功能,在树莓派Linux系统的根目录下,找到如下路径的文件:
/boot/config.txt
在其中添加如下一行文本即可:
dtoverlay=w1-gpio
需要注意,添加之后需要重启树莓派。需要注意,1-Wire功能默认将使用树莓派的BCM编码为GPIO4的引脚作为通信引脚,如何我们要进行自定义,可以在刚才的配置文件中进行指定,如下:
dtoverlay=w1-gpio,gpiopin=18
其表示要使用BCM编码为GPIO18的引脚作为通信引脚。
做完了上面的操作后,我们可以在树莓派终端中使用如下指令查看单总线是否启动成功:
$ lsmod
终端输出效果如下:
文章图片
可以看到,如果有显示w1_gpio和wire两个部分,则表示单总线已经启动成功,分别在终端执行如下两条命令:
$ modprobe w1-gpio
$ modprobe w1-therm
如果终端没有输出任何信息,则表示单总线已经初始化完成,此时实际上我们已经可以让DS18B20进行工作了。
二、通过DS18B20模块获取环境温度通过前面的操作,我们已经完成了基本的准备工作,将DS18B20连接到树莓派,引脚对应如下:
DS18B20 | 树莓派 |
---|---|
+ | 3.3V |
- | GND |
out | BCM编码为GPIO4的引脚 |
/sys/bus/w1/devices
在此目录下,我们可以看到有两个文件,如下图所示:
文章图片
其中以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:utf8import 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_cwhile True:
print(\'%fC\'%read_temp())
time.sleep(1)
在树莓派中运行上面代码,可以看到控制台输出的当前温度数据,如下图所示:
文章图片
三、讲在后面
【一起玩转树莓派——DS18B20测温模块应用】本篇博客,我们介绍了如何使用one-wire单总线进行外设数据的读取,DS18B20只是作为示例,抛砖引玉,通过树莓派的1w总线,我们还可以连接更多的外设实现更加有创意的东西,大家开动脑筋,尽情玩耍吧!
推荐阅读
- cocos2d-x从c++到js22(使用非侵入方式扩展UI系统接口的举例)
- Cocos2d-x 3.0正式版及android环境搭建详细教程
- [Unity3D]上海某大型游戏公司的基础面试题
- UNITY3D 游戏开发之二高级组件(GUI:LABELSCROLLVIEWTEXTFIELD…等)入门篇
- [Unity3D插件]FingerGesture的简单实用
- [Unity3D]自制UnityForAndroid二维码扫描插件
- [Unity3D]Unity4新的动画系统Mecanim
- 开源计划 kzfont——bmfont 的 texturepacker 导出插件
- [Unity3D插件]2dToolKit系列三 碰撞检测功能的实现以及障碍物的随机摆放