Adafruit的树莓派教程:DS18B20温度传感器(3)
- UID
- 1066743
|
Adafruit的树莓派教程:DS18B20温度传感器(3)
软件部分下面的Python程序处理失败消息并且每秒返回华氏和摄氏温度。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| import os
import glob
import time
os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/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()
while lines[0].strip()[-3:] != 'YES':
time.sleep(0.2)
lines = read_temp_raw()
equals_pos = lines[1].find('t=')
if equals_pos != -1:
temp_string = lines[1][equals_pos+2:]
temp_c = float(temp_string) / 1000.0
temp_f = temp_c * 9.0 / 5.0 + 32.0
return temp_c, temp_f
while True:
print(read_temp())
time.sleep(1)
|
在程序的开头运行了一下modprobe命令,来使接口运行。
紧接着的3行用于寻找哪些文件可以从中读取消息。
一个已知的问题是在Raspbian下读取温度时有时候会假死。如果你有同样的问题,使用下面的代码替换掉read_temp_raw方法。然后在程序开头加入一行”import subprocess”。
1
2
3
4
5
6
| def read_temp_raw():
catdata = subprocess.Popen(['cat',device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out,err = catdata.communicate()
out_decode = out.decode('utf-8')
lines = out_decode.split('\n')
return lines
|
读取温度是通过两个方法进行的。read_temp_raw通过接口获取消息的前两行。read_temp把它包装了一层并且加入了失败消息检测并且重试直到第一行的末尾有一个YES。这个方法会返回两个值,第一个是摄氏温度,第二个是华氏温度。
你可以像下面这样把两个值分开
1
| deg_c, deg_f = read_temp()
|
主方法只是一个循环,读取温度,打印出来,然后休息一秒。
要把这个程序传到树莓派上,你可以通过SSH在命令行里打开一个文本编辑器
粘贴上面的代码,然后按一下Ctrl+X然后按一下Y保存。
测试与配置运行这个程序需要超级用户权限,所以在命令行里运行下面的命令
1
| sudo python thermometer.py
|
如果一切ok,那你将会看到像下面一样的一系列输出
试试把手指放在温度传感器上来给它升温。
加入更多的传感器你可以以并行连接方式DS18B20把其他的DS18B20传感器接入到VCC,数据和地线针脚。只用一个4.7k电阻。你将会看到多个/sys/bus/w1/devices/28-nnnnn目录,每一个都有一个唯一的串口编号。目前的python程序只能读取一个传感器,所以你需要自己修改使它能够一次读取多个传感器。 |
|
|
|
|
|