1-Wireの知見
2017年11月5日 - 未分類
1-Wireの温度センサーデバイス(DS18B20)を複数、使う場合の知見を書きます。
DS18B20のデータシートでは、4.7KΩの抵抗でプルアップするとあります。
しかし、DS18B20を2つ使った場合には、うまくいかないことがありました。温度値が、127.937 deg とか、0.0 degとかになりました。こんな時には、プルアップ抵抗を2KΩに変更すると、正しい値が読み出せました。
また、こんなトラブルもありました。VDDラインの断線時に、読み出す値が、何故か85度ばかりになってしまうことです。VDDラインの断線を修理したら正しい温度値が読み出せました。
以下は、複数のDS18B20から温度値を読み出すPythonコードです。7つのDS18B20が使えるようです。
DS18B20.py
#!/usr/bin/env python
import os
import glob
from time import sleep
import datetime
from numpy import *
os.system(‘modprobe w1-gpio’)
base_dir = ‘/sys/bus/w1/devices/’
device_folder = glob.glob(base_dir + ’28*’)
device_file=[0,1,2,3,4,5,6]
for i in range(len(device_folder)):
device_file[i] = device_folder[i] + ‘/w1_slave’
def read_temp_raw(i):
f = open(device_file[i], ‘r’)
lines = f.readlines()
f.close()
return lines
def read_temp(i):
lines = read_temp_raw(i)
while lines[0].strip()[-3:] != ‘YES’:
sleep(0.2)
lines = read_temp_raw(i)
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
try:
# while True:
todaydetail = datetime.datetime.today()
print todaydetail.strftime(‘
for i in range(len(device_folder)):
print(device_folder[i].replace(base_dir,”)+’ ‘+str(read_temp(i))+’ deg ‘),
#sleep(1)
print ”
except KeyboardInterrupt:
pass