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

Translate »