通过c51的串口读取ds18b20的数据有一个问题就是mcu的一直开着,所以就想直接用gpio连接ds18b20,这样也可以省些电。LED这个固然好,但是新鲜过去实用性不大,不如挂一个温湿度计来的方便和节能。主要是得一直挂着,没办法玩51了。
首先需要用面包板或者实验板把ds和一个4.7k的电阻焊上去。
连接如下:
然后加载模块
1sudo modprobe 1w_gpio
2sudo modprobe 1w_therm
为了启动时候自动加载,可以在/etc/modules里添加如下内容
11w_gpio
21w_therm
启动时候就可以看到1 wire 协议和slave加载
1[ 11.618177] Driver for 1-wire Dallas network protocol.
2[ 11.698036] w1_master_driver w1_bus_master1: Family 28 for 28.0000046eae7a.c3 is not registered.
3[ 138.941466] w1_slave_driver 28-0000046eae7a: 18S20 doesn't respond to CONVERT_TEMP.
然后就可以从设备文件读取数值
1cli@raspberrypi /etc $ cat /sys/devices/w1_bus_master1/28-0000046eae7a/w1_slave<br />
25f 01 4b 46 7f ff 01 10 9b : crc=9b YES<br />
35f 01 4b 46 7f ff 01 10 9b t=21937<br />
4cli@raspberrypi /etc $
但是这个数值需要经过处理。
1#!/usr/bin/python
2import glob
3import os
4
5devicedir = glob.glob("/sys/bus/w1/devices/28-*")
6device = devicedir[0]+"/w1_slave"
7
8f = open (device, 'r')
9sensor = f.readlines()
10f.close()
11
12crc=sensor[0].split()[-1]
13temp=float(sensor[1].split()[-1].strip('t='))
14temp_C=(temp/1000.000)
15
16if 'YES' in crc:
17 print temp_C
18else:
19 print dtime,"\tCRC check failed."